PostgreSQL でのデッド接続の処理 - Amazon Aurora

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_idletcp_keepalives_interval、および tcp_keepalives_count を調整します。例えば、Aurora PostgreSQL のデフォルトでは、デッド接続を検出するのに約 1 分 (2 プローブ × 30 秒) かかります。これらの値を小さくすると、検出を速めることができます。

  • tcp_user_timeout を使用して、確認の最大待機時間を指定します。

TCP キープアライブ設定は、カーネルがデッド接続を検出するのに役立ちますが、PostgreSQL はソケットが使用されるまで動作しない場合があります。セッションが長いクエリを実行している場合、デッド接続はクエリの完了後にのみ検出される可能性があります。PostgreSQL 14 以降のバージョンでは、client_connection_check_interval はクエリの実行中にソケットを定期的にポーリングすることで、デッド接続の検出を迅速化できます。

ベストプラクティス

  • 妥当なキープアライブ間隔を設定する: tcp_user_timeouttcp_keepalives_idletcp_keepalives_count、および tcp_keepalives_interval を調整して、検出速度とリソースの使用のバランスを取ります。

  • 環境に合わせて最適化する: 設定をネットワーク動作、ファイアウォールポリシー、およびセッションのニーズに合わせます。

  • PostgreSQL の機能を活用する: PostgreSQL 14 以降のバージョンで client_connection_check_interval を使用して、効率的な接続チェックを行います。