Соединения PGBouncer IDLE не закрываются на Postgres

У нас есть установка, в которой мы запускаем 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 оставляет соединения позади.

**/

Спасибо


person user1442883    schedule 23.05.2021    source источник
comment
Как вы измеряете потребление памяти? У вас установлены какие-нибудь расширения? Можете ли вы предоставить EXPLAIN (ANALYZE, BUFFERS) вывод для быстрого и медленного выполнения?   -  person Laurenz Albe    schedule 24.05.2021
comment
Спасибо за комментарий - суть нашей проблемы на самом деле не в исправлении обработки процессов Postgres и потребления памяти, а в удалении соединений в состоянии IDLE, когда мы установили для этого агрессивные настройки в PgBouncer, а Postgres продолжает удерживать связи. Чтобы ответить на ваш вопрос, мы делаем это на уровне Linux, суммируя Pss в smaps для каждого PID.   -  person user1442883    schedule 24.05.2021
comment
Вы используете режим пула транзакций или сеансов? О памяти: вы убедились, что повышенное потребление памяти связано с частной памятью процесса, а не с общей памятью? Что такое state этих соединений в pg_stat_activity?   -  person Laurenz Albe    schedule 25.05.2021


Ответы (1)


Проблема решена.

Приложение было чрезвычайно болтливым, и даже если server_idle_timeout был установлен всего на 5 секунд, соединения не перерабатывались на стороне Postgres.

Проблема заключалась в том, что server_lifetime был случайно прокомментирован, когда мы думали, что он активен, и как только мы изменили это, мы могли ясно видеть, что соединения Postgres перезапускаются каждые 2 минуты (в зависимости от наших настроек).

Увеличение памяти каждого соединения с течением времени, особенно для долгоживущих соединений, учитывало только частную память, а не общую память. Мы заметили, что чем дольше соединение было активным, тем больше памяти оно потребляло. Мы пытались установить такие вещи, как DISCARD ALL для reset_query, и это не повлияло на потребление памяти. Основываясь на моем онлайн-исследовании, мы были не единственными, кто столкнулся с проблемой объединения соединений.

Спасибо за комментарии и помощь. Наше решение в конце концов состояло в том, чтобы использовать server_lifetime в pgBouncer для управления количеством долгоживущих соединений в Postgres.

-Майя

person user1442883    schedule 27.05.2021
comment
Вы должны принять приведенный выше ответ. Это помогает будущим вопрошающим, столкнувшимся с той же проблемой, найти возможные решения. - person Belayer; 27.05.2021