プールされた接続を閉じることができないため、アプリケーションで接続リークが発生しているようです。セッションだけでなく、全体的に接続が多すぎるという問題はありません。<idle> in transaction
接続を殺すことはそのための正しい答えではありませんが、それはOKっぽい一時的な回避策です。
他のすべての接続をPostgreSQLデータベースからブートするためにPostgreSQLを再起動するのではなく、他のすべてのユーザーをpostgresデータベースからデタッチする方法を参照してください。そしてそれへのアクティブな接続がある場合、どのようにPostgreSQLデータベースをドロップするには?。後者はより良いクエリを示しています。
タイムアウトの設定については、@ Doonが提案したように、PostgreSQLのアイドル接続を自動的に閉じる方法を参照してください。PgBouncerを使用してPostgreSQLのプロキシを作成し、アイドル接続を管理することをお勧めします。とにかく接続をリークするバグのあるアプリケーションがある場合、これは非常に良いアイデアです。私は非常に強く PgBouncerの設定をお勧めします。
TCPキープアライブはアプリがまだ接続して生きているので、それだけではありません、ここで仕事をしません。
PostgreSQL 9.2以降では、新しいstate_change
タイムスタンプ列とstate
フィールドを使用pg_stat_activity
して、アイドル接続リーパーを実装できます。cronジョブで次のように実行します。
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'regress'
AND pid <> pg_backend_pid()
AND state = 'idle'
AND state_change < current_timestamp - INTERVAL '5' MINUTE;
古いバージョンでは、接続がアイドルになったときを追跡する複雑なスキームを実装する必要があります。邪魔しないで; pgbouncerを使用してください。