Событие ожидания High lock_manager

#postgresql #performance #postgresql-11

#postgresql #Производительность #postgresql-11

Вопрос:

В настоящее время я сталкиваюсь с проблемой, связанной с некоторыми выборками по первичному ключу. Выбор иногда занимает более 10 секунд, чтобы вернуть строку. Я проанализировал план выполнения и убедился, что все в порядке.

Я начал просматривать запросы, выполняемые в базе данных, со следующим выбором:

 select wait_event_type, wait_event, count(1)
from pg_stat_activity
where state <> ‘idle’
and state is not null
group by wait_event_type, wait_event
order by count(1) desc;
  

Затем я увидел много сеансов, ожидающих в lock_manager:
wait_event_type / wait_event по количеству

Затем я перешел к pg_locks, чтобы посмотреть, какой тип блокировки вызывает проблему: блокировки по режиму Наиболее распространенным режимом блокировки был AccessShareLock. Я также видел среднюю блокировку по pid, и она составляла около 3000. Большинство блокировок находятся в секционированных таблицах (мой выбор выполняется через основную таблицу, а блокировки доступа находятся во всех разделах и индексах разделов). Я увеличил значение max_locks_per_transaction со 128 до 5120, но улучшений не было.

Еще одна вещь, которую я сделал, это запустить perf top и посмотреть, что такое «горячая функция»: hash_search_with_hash_value. perf top

Серверная машина использует низкий процессор: 20%.

Есть ли у вас какое-либо решение для этого? Вам нужна дополнительная информация?

Комментарии:

1. Возможно, у вас слишком много разделов.

2. @LaurenzAlbe У меня есть 4 таблицы по 900 разделов в каждой. Каждый раздел имеет 4 индекса. Я не знаю, но сколько это слишком много?

3. Не связано, но: count(1) на самом деле медленнее, чем count(*)

4. Я предполагаю на этом этапе. 900 разделов звучит нормально. Но, учитывая, что у вас более 600000 блокировок доступа, я предполагаю, что у вас слишком много одновременных сеансов базы данных, пытающихся одновременно выбирать из этих таблиц. Улучшится ли ситуация, если вы уменьшите размер пула соединений?

5. @jjanes На сервере установлен процессор Intel Xeon Gold 6146 (12 ядер, 24 потока) емкостью 96 ГБ.

Ответ №1:

Первым делом нужно было бы перейти с версии 11 на (по крайней мере) версию 12. Разделение стало намного более эффективным, в отличие от блокировки для выбора одного раздела, в этой версии.

Комментарии:

1. Я видел примечания к выпуску. Я планирую обновление, но мне нужно протестировать приложение. Я пытаюсь сначала «настроить», пока планирую обновление. Я проведу свои тесты против версии 12 и увижу результаты!

2. Я провел тест до версии 12, я не видел никакого события ожидания lock_manager! Спасибо