シナリオ: 完了に時間がかかり過ぎているアクティビティーの識別

ワークロード管理表関数を使用すると、データ・サーバー内の特定のアクティビティーを識別したり、必要に応じてアプリケーション全体を終了させることなくそのアクティビティーを取り消したりするタスクを単純化することができます。

完了に時間がかかり過ぎているアクティビティーの識別

以下は、長時間実行照会の識別の例です。 SalesReport アプリケーションを実行中の販売部のユーザーから、アプリケーションの完了に時間がかかり過ぎているとの苦情が報告されたとします。

アプリケーション・ハンドルを識別した後、WLM_GET_WORKLOAD_OCCURRENCE_ACTIVITIES 表関数を使用して、このアプリケーションで現在実行中のすべてのアクティビティーを調べます。 例えば、アプリケーション・ハンドルが 1 の場合、照会は以下のようになります。
SELECT SUBSTR(CHAR(COORD_MEMBER),1,5) AS COORD,
       SUBSTR(CHAR(MEMBER),1,4) AS MEMB,
       SUBSTR(CHAR(UOW_ID),1,5) AS UOWID,
       SUBSTR(CHAR(ACTIVITY_ID),1,5) AS ACTID,
       SUBSTR(CHAR(PARENT_UOW_ID),1,8) AS PARUOWID,
       SUBSTR(CHAR(PARENT_ACTIVITY_ID),1,8) AS PARACTID,
       SUBSTR(ACTIVITY_TYPE,1,8) AS ACTTYPE,
       SUBSTR(CHAR(NESTING_LEVEL),1,7) AS NESTING
   FROM TABLE(WLM_GET_WORKLOAD_OCCURRENCE_ACTIVITIES(1, -2)) 
       AS WLOACTS
   ORDER BY MEMB, UOWID, ACTID

COORD MEMB UOWID ACTID PARUOWID PARACTID ACTTYPE NESTING
----- ---- ----- ----- -------- -------- -------- -------
    0    0     2     3        -        -     CALL       0
    0    0     2     5        2        3 READ_DML       1
該当するアクティビティーは、作業単位 ID が 2、アクティビティー ID が 5 であると識別されます。 その後、WLM_GET_SERVICE_CLASS_AGENTS 表関数を使用して、このアクティビティーを処理するエージェントが何を実行しているかを検出できます。
SELECT APPLICATION_HANDLE, UOW_ID, ACTIVITY_ID,
       SUBSTR(REQUEST_TYPE,1,8) AS REQUEST_TYPE,
       SUBSTR(EVENT_TYPE,1,8) AS EVENT_TYPE,
       SUBSTR(EVENT_OBJECT,1,8) AS EVENT_OBJECT
   FROM TABLE(WLM_GET_SERVICE_CLASS_AGENTS('', '', CAST(NULL AS BIGINT),-2))
       AS AGENTS
   WHERE APPLICATION_HANDLE = 1
   AND UOW_ID = 2
   AND ACTIVITY_ID = 5
例えば、このアクティビティーがキューに入れられる場合や、実行中、またはロックで待機中の場合があります。 アクティビティーがキューに入れられた場合の結果は、次のようになります。
APPLICATION_HANDLE UOW_ID ACTIVITY_ID REQUEST_TYPE EVENT_TYPE EVENT_OBJECT
------------------ ------ ----------- ------------ ---------- ------------
                 1      2           5         OPEN       WAIT    WLM_QUEUE
アクティビティーが実行中の場合の結果は、次のようになります。
APPLICATION_HANDLE UOW_ID ACTIVITY_ID REQUEST_TYPE EVENT_TYPE EVENT_OBJECT
------------------ ------ ----------- ------------ ---------- ------------
                 1      2           5          OPEN   PROCESS      REQUEST
アクティビティーがロック待機中の場合の結果は、次のようになります。
APPLICATION_HANDLE UOW_ID ACTIVITY_ID REQUEST_TYPE EVENT_TYPE EVENT_OBJECT
------------------ ------ ----------- ------------ ---------- ------------
                 1      2           5         OPEN    ACQUIRE         LOCK
アクティビティーが現在行っている事柄を確認したなら、それに応じて以下のように続行できます。
  • アクティビティーがキューに存在する場合、照会の実行時間が長すぎてもはやユーザーが結果に関心がない、または照会が消費しているリソース量が多すぎると判断するのであれば、その照会を取り消せます。
  • 重要なアクティビティーがキューに存在する場合、現在実行中の作業のうちそれほど重要でない他のものを取り消すことを考慮するか (並行性を減らして重要なアクティビティーがキューに入れられたままにする)、また、その作業がハングしているわけではなく、待機しているだけであることが分かるとユーザーは納得する場合もあります。
  • アクティビティーがロックを待機している場合、スナップショット・モニターを使用してアプリケーションが待機しているロックについて調査できます。
  • アクティビティーが待機しているロックが優先度の低いアクティビティーによって保持されているのであれば、その優先度の低いアクティビティーを取り消すことを考慮してください。

アクティビティー 5 が実行中の DML ステートメントについて把握することが役立つ場合もあります。 アクティブ・アクティビティー・イベント・モニターがあると仮定します。WLM_CAPTURE_ACTIVITY_IN_PROGRESS プロシージャーを実行すると、アクティビティー 5 が実行中の DML ステートメントに関する情報および他の情報をキャプチャーできます。 WLM_CAPTURE_ACTIVITY_IN_PROGRESS プロシージャーを使用すると、ステートメント・イベント・モニターとは異なり、その時点で実行されているすべてのステートメントではなく特定の照会に関する情報をキャプチャーできます。 MON_GET_ACTIVITY_DETAILS を使用してステートメント・テキストを取得することもできます。

アクティビティーを取り消す必要があると判断する場合、WLM_CANCEL_ACTIVITY ルーチンを以下のように使用すると、アクティビティーを発行したアプリケーションを終了させなくてもそのアクティビティーを取り消せます。
CALL WLM_CANCEL_ACTIVITY (1, 2, 5)

アクティビティーを発行したアプリケーションは SQL4725N エラーを受け取ります。 負の SQL コードを処理するアプリケーションはこの SQL コードを処理できます。

ロック競合によるアクティビティー・ハングの識別

あるユーザーから時間がかかり過ぎているアプリケーションに関して苦情が報告されたとします。 さらに、その長期実行アプリケーションのアプリケーション名または許可 ID のいずれかが分かっていると想定してください。 この情報を使用すると、 LIST APPLICATIONS コマンドを使用してアプリケーション・ハンドルを取得できます。 LIST APPLICATIONS コマンドによって返されるアプリケーション・ハンドルが 2 であるとすると、WLM_GET_SERVICE_CLASS_AGENTS 表関数を使用して、このアクティビティーを処理しているエージェントを判別できます。 照会は次のようになります。


SELECT SUBSTR(CHAR(APPLICATION_HANDLE),1,7) AS APPHANDLE,
       SUBSTR(CHAR(MEMBER),1,4) AS MEMB,
       SUBSTR(CHAR(AGENT_TID),1,9) AS AGENT_TID,
       SUBSTR(AGENT_TYPE,1,11) AS AGENTTYPE,
       SUBSTR(EVENT_OBJECT,1,11) AS EVENTOBJECT,
       SUBSTR(REQUEST_TYPE,1,7) AS REQTYPE,
       SUBSTR(CHAR(UOW_ID),1,6) AS UOW_ID,
       SUBSTR(CHAR(ACTIVITY_ID),1,6) AS ACT_ID
   FROM TABLE(WLM_GET_SERVICE_CLASS_AGENTS('', '', 2, -2)) AS SCDETAILS
   ORDER BY APPHANDLE, MEMB, AGENT_TID

APPHANDLE MEMB AGENT_TID AGENTTYPE   EVENTOBJECT  REQTYPE UOW_ID ACT_ID
--------- ---- --------- ----------- -----------  ------- ------ ------
2         0    1         COORDINATOR REQUEST      OPEN    2      1
2         1    3         SUBAGENT    LOCK         -       2      1

エージェント 1 がリモート応答を待機中であることを結果は示しています。 同じアクティビティーを操作しているリモート・メンバー上のエージェントを見ると、そのエージェントがロックを取得するために待機中であることが EVENTOBJECT フィールドから分かります。

次のステップでは、ロックの所有者を判別します。 この情報は以下の例に示されているように、モニター・スイッチをオンにして、スナップショット・モニター表関数を使用すると取得できます。
SELECT REQ_APPLICATION_HANDLE AS WAITING_FOR_LOCK,
       HLD_APPLICATION_HANDLE AS HOLDING_LOCK,
       CAST(LOCK_MODE_REQUESTED AS SMALLINT) AS WANTED,
       CAST(LOCK_MODE AS SMALLINT) AS HELD
    FROM TABLE(MON_GET_APPL_LOCKWAIT (null, -1)) AS SLW

WAITING_FOR_LOCK     HOLDING_LOCK           WANTED HELD
-------------------- ---------------------- ------ ------
                   2                      7      9      5
また以下の一連のコマンドを使用しても、ロック所有者を判別できます。
db2pd -db database alias -locks
db2pd -db database alias -transactions

長期実行アクティビティーを取り消す場合には、WLM_CANCEL_ACTIVITY プロシージャーを使用できます。 長期実行アプリケーションを正常終了させる方がロックを所有しているアプリケーションを正常終了させるよりも重要な場合には、ロックを所有しているアプリケーションを強制終了させます。