powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Полка по СPU и все запросы ждут LWLock в lock_manager
5 сообщений из 5, страница 1 из 1
Полка по СPU и все запросы ждут LWLock в lock_manager
    #40070533
S.e.r.y.i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!

БД: 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.

Прошу покритиковать решение, буду благодарен за любые предложения его улучшить.
...
Рейтинг: 0 / 0
Полка по СPU и все запросы ждут LWLock в lock_manager
    #40070665
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Верно ли я понял, что Вы обращаетесь к родительской таблице, потому что не знаете в какой дочерней таблице находиться запись?

Получается у Вас при каждом обращении к родительской таблице проверяются ~200 таблиц.

Посмотрите explain, у Вас там должна быть "портянка".
...
Рейтинг: 0 / 0
Полка по СPU и все запросы ждут LWLock в lock_manager
    #40070975
S.e.r.y.i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да так и есть, вы все правильно поняли.
В плане портянка и обращение ко всем таблицам.
запрос к блокировкам возвращает 2К записей:
Код: sql
1.
2.
3.
with e as (select count(*) as cnt from t) 
select count(*) as count_locks from pg_locks 
where exists (select * from e) or true
...
Рейтинг: 0 / 0
Полка по СPU и все запросы ждут LWLock в lock_manager
    #40071037
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На мой взгляд, самый лучший вариант, это обращаться напрямую к нужной таблице, т.е. ПО должно знать что, где лежит.

На счет чат. представления, получается оно будет содержать поля из t, поскольку они есть везде, и все записи из всех таблиц (т.е. не какие-то
агрегированные данные или усеченные\отфильтрованные).
Опять же, если нужны доп поля конкретной записи, как их получать?
Если эти самые поля не нужны, почему просто не хранить все в t (а все доп поля хранить в jsonb)?

Это больше информация к размышлению.
...
Рейтинг: 0 / 0
Полка по СPU и все запросы ждут LWLock в lock_manager
    #40072000
S.e.r.y.i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если кому интересно,
решение зависаний найдено

настройки pgBouncer
pool_mode = transaction
default_pool_size = <кол-во ядер>
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Полка по СPU и все запросы ждут LWLock в lock_manager
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]