Запросы Postgres периодически выполняются крайне медленно - PullRequest
0 голосов
/ 29 октября 2018

У нас есть несколько запросов, которые выполняются крайне медленно с перерывами в нашей производственной среде. Это запросы пересечения JSONB, которые обычно возвращаются в миллисекундах, но занимают 30-90 секунд.

Мы попытались проанализировать условия работы сервера, такие как ОЗУ, ЦП и загрузка запросов, но в этом нет ничего очевидного. Это влияет на очень небольшое меньшинство запросов - вероятно, менее 1%. Это не , похоже, является проблемой оптимизации запросов, поскольку сами затронутые запросы различны и в некоторых случаях очень просты.

Мы воспроизвели ту же среду, насколько это возможно, на промежуточном сервере, сильно ее загрузили, и проблема не возникает.

Может ли кто-нибудь предложить возможные шаги для расследования того, что происходит в Postgres, когда это происходит, или что-то еще, что мы должны рассмотреть? Мы работали над этим более недели и у нас заканчиваются идеи.

1 Ответ

0 голосов
/ 29 октября 2018

Трудно угадать причину этой проблемы; одно объяснение было бы замками.

Вы должны использовать auto_explain, чтобы исследовать проблему.

В postgresql.conf используйте следующие настройки:

# log if somebody has to wait for a lock for more than one second
log_lock_waits = on
# log slow statements with their parameters
log_min_duration_statement = 1000
# log the plans of slow statements
shared_preload_libraries = 'auto_explain'
# configuration for auto_explain
auto_explain.log_nested_statements = on
auto_explain.log_min_duration = 1000

Затем перезапустите PostgreSQL.

Теперь все операторы, которые превышают одну секунду, будут выгружать свой план в журнал PostgreSQL, поэтому все, что вам нужно сделать, - это дождаться повторения проблемы, чтобы вы могли проанализировать ее.

Вы также можете получить EXPLAIN (ANALYZE, BUFFERS) вывод, если установить

auto_explain.log_buffers = on
auto_explain.log_analyze = on

Это сделало бы журнал более ценным, но значительно замедлило бы обработку, поэтому я неохотно делал бы это в производственной системе.

...