|
Полка по СPU и все запросы ждут LWLock в lock_manager
|
|||
---|---|---|---|
#18+
Доброго времени суток! БД: PostgreSQL 11.10 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.3.1 20191121 (Red Hat 8.3.1-5), 64-bit Сервер 16 ядер 16GB ОЗУ Проблема следующая: Есть в базе таблица t и 200 таблиц, унаследованных от этой таблицы, например, так CREATE TABLE t1 ( type_id BIGINT, ....... некоторое кол-во своих полей ....... ) INHERITS (t) WITH (oids = false); Таким образом для таблицы t есть множество дочерних t1,t2,t3...t200 И все дочерние имеют все необходимые индексы, и каждая и них имеет свой собственный набор полей плюс к унаследованным от таблицы t. В некоторых случаях требуется обратиться к родительской таблице t чтобы выбрать несколько или найти одну нужную запись в одной из дочерней таблицы. В какой-то момент, не сразу, а скажем под возросшей нагрузкой до ~200-500 запросов в секунду на сервере наблюдается резкий рост 100% потребления CPU и все READ ONLY запросы, где участвует эта таблица t начинают висеть с wait_event_type=LWLock wait_event=lock_manager state=active При этом замедляясь в 1К и более раз. В pg_stat_activity в это время наблюдается ~200 записей в таком состоянии. Пока ставится диагноз, что системный процесс не успевает раздавать легковесные блокировки из-за высокой конкуренции за CPU. И пока видится решение сделать материализованную таблицу mt с фиксированным набором полей, который используются в запросах к t и поддерживать актуальность записей в таблице mt через DML триггеры на всех таблицах t1-t200. Прошу покритиковать решение, буду благодарен за любые предложения его улучшить. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2021, 15:39 |
|
Полка по СPU и все запросы ждут LWLock в lock_manager
|
|||
---|---|---|---|
#18+
Верно ли я понял, что Вы обращаетесь к родительской таблице, потому что не знаете в какой дочерней таблице находиться запись? Получается у Вас при каждом обращении к родительской таблице проверяются ~200 таблиц. Посмотрите explain, у Вас там должна быть "портянка". ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2021, 20:45 |
|
Полка по СPU и все запросы ждут LWLock в lock_manager
|
|||
---|---|---|---|
#18+
Да так и есть, вы все правильно поняли. В плане портянка и обращение ко всем таблицам. запрос к блокировкам возвращает 2К записей: Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 09:45 |
|
Полка по СPU и все запросы ждут LWLock в lock_manager
|
|||
---|---|---|---|
#18+
На мой взгляд, самый лучший вариант, это обращаться напрямую к нужной таблице, т.е. ПО должно знать что, где лежит. На счет чат. представления, получается оно будет содержать поля из t, поскольку они есть везде, и все записи из всех таблиц (т.е. не какие-то агрегированные данные или усеченные\отфильтрованные). Опять же, если нужны доп поля конкретной записи, как их получать? Если эти самые поля не нужны, почему просто не хранить все в t (а все доп поля хранить в jsonb)? Это больше информация к размышлению. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 13:34 |
|
|
start [/forum/topic.php?fid=53&fpage=11&tid=1994026]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
38ms |
get tp. blocked users: |
2ms |
others: | 248ms |
total: | 363ms |
0 / 0 |