PostgreSQL ОШИБКА: больше соединений не разрешено


19

Как освободить соединения PostgreSQL, которые не закрываются клиентскими приложениями?

У меня есть приложение для интеллектуального анализа данных, которое ускоряет несколько процессов, все соединения с локальной базой данных PostgreSQL 9.1 для получения данных. Он работает нормально в течение нескольких часов, но затем умирает с ошибкой:

FATAL:  remaining connection slots are reserved for non-replication superuser connections

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

Я также попытался увеличить max_connections Postgres со 100 до 200, но перезапуск дал мне ошибку:

2014-02-23 10:51:15 EST FATAL:  could not create shared memory segment: Invalid argument
2014-02-23 10:51:15 EST DETAIL:  Failed system call was shmget(key=5432001, size=36954112, 03600).
2014-02-23 10:51:15 EST HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.  You can either reduce the request size or reconfigure the kernel with larger SHMMAX.  To reduce the request size (currently 36954112 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
    If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising the request size or reconfiguring SHMMIN is called for.
    The PostgreSQL documentation contains more information about shared memory configuration.

У меня система Ubuntu 12.04 и 8 ГБ памяти, а все остальные настройки PG по умолчанию, поэтому я не уверен, почему она считает, что системе не хватает памяти.

Затем я попытался использовать pgbouncer для объединения и повторного использования соединений. Казалось, что это работает немного лучше, но даже у этого в конце концов закончились связи, что выдает мне ошибку

ERROR:  no more connections allowed

Как мне дополнительно диагностировать и устранить эту проблему?


Показать вывод pg_stat_activity
ETL

Ответы:


8

Вы можете увеличить максимальное количество подключений, изменив настройки максимальной общей памяти, однако, если проблема заключается в том, что ваши подключения не закрываются, вам следует действительно решить эту проблему. Если программное обеспечение находится вне вашего контроля и глючит из-за того, что не закрывает соединения, вы можете использовать некоторую работу cron, например:

select pg_terminate_backend(procpid)
from pg_stat_activity
where usename = 'yourusername'
 and current_query = '<IDLE>'
 and query_start < current_timestamp - interval '5 minutes'
;

Это то, что я делаю, чтобы убрать протекающие соединения от аналогичного программного обеспечения с ошибками.

Кроме того, вы можете запускать программное обеспечение с ошибками через пул соединений, который имеет аналогичные функциональные возможности для отключения неактивных соединений, таких как pgpool.

Примечание . В новых версиях Postgres имена столбцов немного отличаются:

select pg_terminate_backend(pid)
from pg_stat_activity
where usename = 'YOURDATABASEUSERNAME*'
 and state = 'idle'
 and query_start < current_timestamp - interval '5 minutes'
;

Должно ли это работать на 9.6? Когда я пытаюсь, я получаюpostgres=> select pg_terminate_backend(procpid) from pg_stat_activity where current_query = '<IDLE>' and query_start < current_timestamp - interval '5 minutes'; ERROR: column "procpid" does not exist LINE 1: select pg_terminate_backend(procpid) from pg_stat_activity ...
Magick

Это pidвместо procpidновых версий.
ETL

4

Для более новых версий PostgreSQL:

select pg_terminate_backend(pid)
from pg_stat_activity
where usename = 'YOUR_DATABASE_USERNAME*'
 and state = 'idle'
 and query_start < current_timestamp - interval '5 minutes'
;

Вышеуказанное поможет вам разорвать ваши незанятые соединения. У меня была та же проблема, но это оказалось проблемой с моим Flask и SQLAlchemy способом подключения к базе данных.

* имя пользователя не является опечаткой


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.