это за коннекты (откуда они идут?)
2. Можно ли как-то отслеживать "зависшие" коннекты и закрывать, например, спустя час?
pg_stat_activity view
а где лучше закрывать "такие" идле коннекты? на стороне бд? или пгбаунсер (или он тут ни при чём?))
Где мешают, там и закрывать. Мне на баунсере не мешали никогда.
Вопрос должен быть в том зачем вам idle коннекты закрывать и чем они вам мешают. Если у вас pgbouncer - то эти idle коннекты это часть его нормальной работы. Можно конечно выставить/уменьшить timeout закрытия, но зачем? Не в смысле что это вообще никогда не нужно, но вам нужно себе ответить на этот вопрос.
SET SESSION idle_in_transaction_session_timeout = '1000'; через секунду закроет
ну то, что они так растут — не очень хорошо, кажется. Если idle + active начинает превышать max_connections — начинаются проблемы в приложении. понятно, что проблема на стороне аппки и нужно там фиксить, но пока там разберёмся, думаю сделать такой костыль на стороне бд
Значит у вас неправильно настроены pool'ы в баунсере, а не idle'ы вам нужно закрывать. Или пулы в приложении, если баунсер не используется. Изменить размер пула кажется проще, чем городить костыль по отстрелу
а что тут может быть не так? [databases] {{ POSTGRES_DB }} = host=db port={{ POSTGRES_PORT }} [pgbouncer] listen_addr = 0.0.0.0 listen_port = 5432 unix_socket_dir = auth_file = /etc/pgbouncer/userlist.txt auth_type = plain pool_mode = session max_client_conn = 285 default_pool_size = 290 ignore_startup_parameters = extra_float_digits # Log settings admin_users = {{ POSTGRES_USER }}
ну пользователей N количество может быть, если я верно понял
У вас бред в настройках. Вы лимитите баунсеру на вход не более 285 пользователей, а лимит пула ставите 290. Перечитайте внимательно документацию баунсера по этим параметрами и переделайте в соответствии с тем что ам нужно
да его писали кто как умеет) сейчас буду читать, спасибо.
Сделайте select datname, usename, count(*) from pg_stat_activity group by datname, usename order by 3 desc; Так понятней будет
``` datname | usename | count ---------------+-------------------+------- bot_db | bot | 89 | | 4 bot_db | postgres_exporter | 2 | bot | 1 ```
В нынешних настройках у вас не должно быть больше 285 подключений от баунсера в бд, потому что max_client_conn = 285, а postgres_exporter вряд ли будет спаунить больше чем он ест сейчас. Уменьшите default_pool_size до какой-нибудь сотни, на max_client_connections поставьте 1000, pool_mode = transaction, и разбирайтесь почему у вас приложение спаунит столько коннектов к бд. Выставление pool_mode = transaction может "ломать" некоторые приложения, особенно если используется пуллинг на стороне приложения, но вероятно вы это и так понимаете.
Обсуждают сегодня