接続リークがあるようです プールされた接続を閉じることができないため、アプリケーションで 。 <idle> in transaction
だけで問題が発生しているわけではありません セッションですが、全体的に接続が多すぎます。
接続を切断することはそのための正しい答えではありませんが、それはOKっぽい一時的な回避策です。
PostgreSQLを再起動してPostgreSQLデータベースから他のすべての接続を起動するのではなく、「postgresデータベースから他のすべてのユーザーを切り離すにはどうすればよいですか?」を参照してください。 PostgreSQLデータベースへのアクティブな接続がある場合に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を使用するだけです。