PostgreSQL でのデッド接続の処理
デッド接続は、クライアントアプリケーションが終了または異常終了したにもかかわらず、データベースセッションがサーバー上でアクティブのままである場合に発生します。この状況は通常、データベース接続を適切に閉じたり、進行中のリクエストをキャンセルしたりせずに、クライアントプロセスがクラッシュまたは予期せず終了した場合に発生します。
PostgreSQL は、サーバープロセスがアイドル状態のとき、またはクライアントにデータを送信しようとしたときに、デッド接続を効率的に識別してクリーンアップします。ただし、アイドル状態のセッション、クライアント入力を待っているセッション、またはクエリがアクティブに実行されているセッションでは、検出は困難です。これらのシナリオを処理するために、PostgreSQL は tcp_keepalives_*
、tcp_user_timeout
、および client_connection_check_interval
パラメータを提供します。
TCP キープアライブを理解する
TCP キープアライブは、接続の整合性の維持と検証に役立つプロトコルレベルのメカニズムです。各 TCP 接続は、キープアライブ動作を管理するカーネルレベルの設定を維持します。キープアライブタイマーの有効期限が切れると、システムは以下を実行します。
-
データがなく、ACK フラグが設定されているプローブパケットを送信します。
-
TCP/IP 仕様に従ってリモートエンドポイントからのレスポンスを待ちます。
-
応答の有無に基づいて接続状態を管理します。
Aurora PostgreSQL の主要な TCP キープアライブパラメータ
パラメータ | 説明 | デフォルト値 |
---|---|---|
tcp_keepalives_idle |
Specifies number of seconds of inactivity before sending keepalive message. | 300 |
tcp_keepalives_interval |
Specifies number of seconds between retransmissions of unacknowledged keepalive messages. | 30 |
tcp_keepalives_count |
Maximum lost keepalive messages before declaring connection dead | 2 |
tcp_user_timeout |
Specifies how long (in Milliseconds) unacknowledged data can remain before forcibly closing the connection. | 0 |
client_connection_check_interval |
Sets the interval (in Milliseconds) for checking client connection status during long-running queries. This ensures quicker detection of closed connections. | 0 |
TCP キープアライブ設定のユースケース
アイドルセッションを存続させる
アイドル状態が原因でファイアウォールまたはルーターによってアイドル状態の接続が終了されないようにする方法。
-
キープアライブパケットを定期的に送信するように
tcp_keepalives_idle
を設定します。
デッド接続の検出
デッド接続を迅速に検出する方法。
-
tcp_keepalives_idle
、tcp_keepalives_interval
、およびtcp_keepalives_count
を調整します。例えば、Aurora PostgreSQL のデフォルトでは、デッド接続を検出するのに約 1 分 (2 プローブ × 30 秒) かかります。これらの値を小さくすると、検出を速めることができます。 -
tcp_user_timeout
を使用して、確認の最大待機時間を指定します。
TCP キープアライブ設定は、カーネルがデッド接続を検出するのに役立ちますが、PostgreSQL はソケットが使用されるまで動作しない場合があります。セッションが長いクエリを実行している場合、デッド接続はクエリの完了後にのみ検出される可能性があります。PostgreSQL 14 以降のバージョンでは、client_connection_check_interval
はクエリの実行中にソケットを定期的にポーリングすることで、デッド接続の検出を迅速化できます。
ベストプラクティス
-
妥当なキープアライブ間隔を設定する:
tcp_user_timeout
、tcp_keepalives_idle
、tcp_keepalives_count
、およびtcp_keepalives_interval
を調整して、検出速度とリソースの使用のバランスを取ります。 -
環境に合わせて最適化する: 設定をネットワーク動作、ファイアウォールポリシー、およびセッションのニーズに合わせます。
-
PostgreSQL の機能を活用する: PostgreSQL 14 以降のバージョンで
client_connection_check_interval
を使用して、効率的な接続チェックを行います。