IBM Support

[Db2] リモート・クライアントの終了を検知する方法

Question & Answer


Question

リモート・アプリケーションとの通信が切れると、アプリケーションが確保したロックやログなどのリソースが、サーバーに残ってしまい、ロック待機やログフルなどの問題が起きることがあります。 Db2 サーバーがリモート・クライアントの異常終了を検知して、アプリケーション接続を解放するタイミングは、どのように設定できますか。

Answer

アプリケーションがデータベース接続を切断せずに終了した場合、あるいは TCP/IP 通信不能となった場合、Db2 サーバーによりクライアントの終了として検出されるまでデータベース接続が残ります。
このような状態は以下の設定で検出して対処できます。
  1.  エージェントの状態が『UOW 実行中 (UOW-Executing)』の場合
    UOW 実行中 のエージェントがリモート・クライアントへの TCP/IP 接続を検査する頻度は、Db2 レジストリー変数 DB2CHECKCLIENTINTERVAL で制御します。
    • 例:
      db2set DB2CHECKCLIENTINTERVAL=100
      db2start
      ※ レジストリー変数の変更は、 db2start コマンドを実行する前に設定しなければなりません。
      DB2CHECKCLIENTINTERVAL

      * オペレーティング・システム: すべて、ただしサーバーのみ
      * デフォルト = 100。値: ゼロ以上の数値。
      * この変数は、TCP/IP クライアント接続検査の頻度を指定します。照会完了まで待つ代わりに、クライアント終了を早期に検出できるようにします。この変数が 0 に設定されている場合、検査は実行されません。

      低い値ほどチェックが頻繁になります。低い頻度の場合は 100、中位の頻度の場合は 50、高い頻度の場合は 10 を目安にしてください。
      値は内部 DB2 メトリックで測られます。値は線形スケールを表します。つまり、値が 50 から 100 に増えると、間隔は 2 倍になります。
      データベース要求の実行中に、クライアントの状況を頻繁にチェックすればするほど、照会が完了するまでの時間が長くなります。
      DB2 のワークロードが重い (内部要求が多い) 場合、DB2CHECKCLIENTINTERVAL に低い値を設定すると、ワークロードが軽い状況よりも、パフォーマンスに重大な影響があります。

    UOW 実行中にリモート・クライアントへの TCP/IP 接続を検査した結果、リモート・クライアントがすでに存在しないことがわかると、エージェントは処理を中止してアプリケーション接続を切断します。
    このとき、db2diag.log に以下の FAQ で説明されているログを記録します。
    [Db2] db2diag.log に出力される Detected client termination メッセージの意味 (IM-11-00C)
     
  2. エージェントの状態が『UOW 待機中 (UOW-Waiting)』の場合
    待機中のエージェントがリモートクライアントの終了を検出する間隔は、オペレーティング・システム固有の TCP/IP keepalive 設定で制御します。
    TCP/IP keepalive settings and related DB2 registry variables

    Db2 V10.1 以降、Solaris を除くサーバー・プラットフォームでは、DB2TCP_SERVER_KEEPALIVE_TIMEOUT (デフォルト 60 秒) によって、リモート接続の終了を早期に検出できます。
    DB2TCP_SERVER_KEEPALIVE_TIMEOUT

    たとえば Keepalive が 10分に設定されている場合、通信相手のクライアントが存在していれば接続は続きますが、存在していなければ接続は切断され、アプリケーション接続は解放されます。
     
  3. 特定の期間にトランザクションが終了しないアプリケーション
    トランザクションを開始したあと、指定した期間にトランザクションが終了しないアプリケーションは、ワークロード・マネージャーを使用して自動的に停止できます。

    10分以上 COMMIT も ROLLBACK もしないトランザクションを自動停止する設定
    1. データベースに DBADM または WLMADM で接続し、しきい値を設定します。
      $ db2 connect to <db_name> user <dbadm>
      $ db2 "CREATE THRESHOLD STOPUOW10M FOR DATABASE WHEN UOWTOTALTIME > 10 MINUTES STOP EXECUTION"
      対象を絞りたい場合や、アイドル時間で切断したい場合、またしきい値超過のログを収集したい場合は以下の Technote を参照してください。
      [Db2] How to stop long running SQLs or long running transactions or high CPU usage applications by threshold.
運用上の考慮点
  • この Technote で以前紹介していたガバナー・ユーティリティーは Db2 V9.7 以降推奨されなくなりました。今後のリリースでは除去される可能性があります。
    Db2 V9.7 で非推奨になった機能: Db2 ガバナーと Query Patroller が推奨されなくなった
  • KeepAlive 自体はオペレーティングシステムの TCP/IP プロトコル・スタックによって制御されています。
    Db2 はソケットに対して setsockopt で TCP_KEEP* オプションを指定することで各接続の KeepAlive を指定しています。たとえば、60 秒 (デフォルト) の場合は以下のオプションを指定しています。
    TCP_KEEPIDLE(17) = 20
    TCP_KEEPINTVL(18) = 4
    TCP_KEEPCNT(19) = 10
    

関連情報
通信変数 DB2CHECKCLIENTINTERVAL
TCP/IP keepalive settings and related DB2 registry variables
 
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PkdAAE","label":"Connectivity"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
05 October 2023

UID

swg21627367