1 S postgres 5038 876 0 80 0 - 11962 sk_wai 09:57 ? 00:00:00 postgres: postgres my_app ::1(45035) idle
1 S postgres 9796 876 0 80 0 - 11964 sk_wai 11:01 ? 00:00:00 postgres: postgres my_app ::1(43084) idle
たくさん見かけます。接続リークを修正しようとしています。しかし、その間、これらのアイドル接続にタイムアウトを設定したいと考えています。最大 5 分程度です。
ベストアンサー1
あなたは接続リークあなたのアプリケーションではプールされた接続を閉じることができないセッションだけでなく<idle> in transaction
、全体的に接続が多すぎるという問題が発生しています。
接続を切断するのは正しい答えではありませんが、一時的な回避策としては問題ありません。
PostgreSQL を再起動して PostgreSQL データベースから他のすべての接続をブートするのではなく、次を参照してください。他のすべてのユーザーを postgres データベースから切り離すにはどうすればよいですか?そしてアクティブな接続がある場合に PostgreSQL データベースを削除するにはどうすればよいでしょうか?後者の方がより良いクエリを示しています。
タイムアウトの設定については、@Doonが提案したように、PostgreSQL でアイドル接続を自動的に閉じる方法は?は、PostgreSQLのプロキシとしてPgBouncerを使用し、アイドル接続を管理することを推奨しています。これは、とにかく接続が漏れてしまうバグのあるアプリケーションがある場合には非常に良いアイデアです。非常に強く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 を使用してください。