#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! Спасибо