У нас есть установка, в которой мы запускаем 6 процессов PgBouncer, и наши тесты производительности линейно ухудшаются со временем. Чем дольше работает PgBouncer, тем дольше существуют подключения к Postgres, что приводит к более медленному времени отклика для эталонного теста. У нас есть многопользовательская база данных, разделенная схемой, с более чем 2000 отношений. Сейчас мы настроены на пул в режиме транзакций. Со временем мы видим, как объем памяти каждого процесса Postgres растет, растет и растет, и снова это приводит к снижению производительности.
Мы попытались быть более агрессивными в очистке неактивных соединений со следующими настройками:
min_pool_size=0
server_idle_timeout=30 (seconds)
server_lifetime=120 (seconds)
Проблема, которую мы видим, заключается в том, что в Postgres неизменно остается множество незанятых соединений. Когда мы отслеживаем PgBouncer с помощью пулов show, мы видим, что счетчик sv_idle увеличивается и уменьшается, поэтому мы предполагаем, что настройки работают в PgBouncer, но это не приводит к уменьшению числа незанятых соединений в Postgres. Как будто PgBouncer действительно не прерывает сеансы Postgres.
Я немного огляделся в поисках решения и протестировал несколько разных вариантов, но так и не смог ничего найти. Я читал в другом месте о заданиях cron для удаления простаивающих соединений из Postgres, но я действительно не хочу делать это в производственной среде и предпочел бы, чтобы PgBouncer полностью очистил эти простаивающие соединения.
Мы используем Postgres 9.6 и используем PgBouncer версии 1.15.
Любая помощь приветствуется.
/**
должен был указать это в исходном комментарии - у нас запущено несколько PgBouncers, и мы используем для этого сокеты Unix. Мы не уверены, влияет ли это на то, что Postgres оставляет соединения позади.
**/
Спасибо
EXPLAIN (ANALYZE, BUFFERS)
вывод для быстрого и медленного выполнения? - person Laurenz Albe   schedule 24.05.2021state
этих соединений вpg_stat_activity
? - person Laurenz Albe   schedule 25.05.2021