システム全体のどこで時間が費やされているかを調べる

消費時間モニター・エレメントを使用して、システムのどこで時間が費やされているかを可視化することができます。 消費時間モニター・エレメントを使用して、特定の作業単位、サービス・サブクラス、ワークロード、または接続について報告できます。

このタスクについて

システムのどこで時間が費やされているかを報告する各種モニター・エレメントを検索したら、それらをさまざまに表示することができます。 最も基本的なレベルでは、報告された値をリストとして表示できます。 例えばロック待機時間の合計要求時間に対する比率など、値を使用して比率を算出することもできます。 あるいは、検索した値を使用してグラフを作成することにより、消費時間モニター・エレメント間の相対比較を視覚化できます。
注 :
  • 照会の出力で示される値は例示のみを目的としており、ご使用のシステムで表示される可能性のあるものを代表していると解釈すべきではありません。
  • このタスクでは、特定の消費時間モニター・エレメントを検索する方法を示します。 バージョン 9.7 フィックスパック 1 で導入された新しいフォーマット関数を使用することにより、特定の基準を満たす消費時間モニター・エレメントを検索することもできます。例えば、値がゼロ以外のもの、指定した値の一定範囲に入っているもの、または上位 n 個のモニター・エレメント (例えば上位 5 つの待機時間) などを検索できます。 これらの関数の機能を、例 4 で示しています。

手順

  1. まず、関心のある消費時間エレメントを決定します。
    例えば、システムのすべての接続を対象に、合計待機時間を合計要求時間と比較して調べるとします。
  2. 関心のあるエレメントを検索するモニター表関数の 1 つを使用して、SQL 照会を作成します。
    この場合は、次のように MON_GET_CONNECTION 表関数を使用することによって、接続の total_request_time および total_wait_time モニター・エレメントを検索できます。
    SELECT APPLICATION_HANDLE,
           TOTAL_WAIT_TIME, 
           TOTAL_RQST_TIME 
    FROM TABLE(MON_GET_CONNECTION(NULL,NULL))
    上記の照会は、次のような出力を戻します (時間はミリ秒単位で報告されます)。
    APPLICATION_HANDLE   TOTAL_WAIT_TIME      TOTAL_RQST_TIME
    -------------------- -------------------- --------------------
                      39                  179                  269
                      78                    0                    0
                      51                  207                  316
                      77                    0                   21
                      50                 1014                 1408
                      40                  109                  351
                      79                   89                  167
    
      7 record(s) selected.
  3. この場合は、7 つのアプリケーション接続があります。2 番目と 3 番目の列の結果を使用すれば、待機に費やした時間のパーセンテージをアプリケーションごとに割り出すことができます。
    例えばアプリケーション 50 の場合、合計要求時間に対するこのアプリケーションが費やした待機時間のパーセンテージは、(1014 ÷ 1408) × 100 ≈ 72% になります。

例 1: 全体要求時間に対する待機に費やした時間の全接続平均比率を割り出す。
この例は前のものと似ていますが、待機時間の平均パーセンテージの計算が以下の SQL 内で行われます。
WITH PCTWAIT AS (
     SELECT SUM(TOTAL_WAIT_TIME)AS WAIT_TIME, 
            SUM(TOTAL_RQST_TIME)AS RQST_TIME 
     FROM TABLE(MON_GET_CONNECTION(NULL,NULL)) AS METRICS)
     SELECT WAIT_TIME,
            RQST_TIME,
     CASE WHEN RQST_TIME > 0 
     THEN DEC((FLOAT(WAIT_TIME))/FLOAT(RQST_TIME) * 100,5,2) 
     ELSE NULL END AS WAIT_PCT FROM PCTWAIT
この照会の実行結果は、次のようなものになります。
WAIT_TIME            RQST_TIME            WAIT_PCT
-------------------- -------------------- --------
                1515                 2439    62.11

  1 record(s) selected.
例 2: 特定のサービス・サブクラスについて、合計待機時間と選択したコンポーネント処理時間を比較する。
この例は、特定のタイプのコンポーネント処理で費やされた時間と待機に費やされた時間を比較する方法を示しています。
SELECT SUM(TOTAL_WAIT_TIME) AS WAIT,
       SUM(TOTAL_COMPILE_PROC_TIME) AS COMPILE,
       SUM(TOTAL_IMPLICIT_COMPILE_PROC_TIME) AS IMP_COMPILE,
       SUM(TOTAL_SECTION_PROC_TIME) AS SECTION,
       SUM(TOTAL_COMMIT_PROC_TIME) AS COMMIT,
       SUM(TOTAL_REORG_PROC_TIME) AS REORG,
       SUM(TOTAL_RUNSTATS_PROC_TIME) AS RUNSTATS,
       SUM(TOTAL_ROLLBACK_PROC_TIME) AS ROLLBACK,
       SUM(TOTAL_LOAD_PROC_TIME) AS LOAD
 FROM TABLE(MON_GET_SERVICE_SUBCLASS( 'SYSDEFAULTUSERCLASS','SYSDEFAULTSUBCLASS',NULL))
この照会の結果は、次のようなものになります (表示形式上、照会の出力行が分割されています)。

WAIT                 COMPILE              IMP_COMPILE          SECTION              COMMIT               
-------------------- -------------------- -------------------- -------------------- -------------------- 
                 611                 1931                    0                  395                   15 
                                                                                                                                                                                 
REORG                RUNSTATS             ROLLBACK             LOAD                                      
-------------------- -------------------- -------------------- --------------------                      
                   0                  432                   18                    0                      
                                                                                                         
                                                                                                         
  1 record(s) selected.  
報告された数値を使用して、待機に費やされた時間とさまざまな処理ステージで費やされた時間の相対比較を示す円グラフを構成することもできます (コンポーネント時間 0 は含まれません)。
待機時間と処理時間の相対比較を示す円グラフ。
例 3: 合計消費時間と各コンポーネントでの処理時間の比率を表示する。

この例は、処理の各ステージ (コンポーネント) での作業に費やされた時間の概要を、そのコンポーネントで費やされた合計時間に対する相対比較で知る方法を示しています。 次の照会は、特定のコンポーネントで費やされた合計経過時間に対する実際の処理で費やされた時間の比率 (パーセンテージとして表される) を計算します。

WITH PCTPROC AS (
     SELECT SUM(TOTAL_SECTION_TIME) AS SECT_TIME, SUM(TOTAL_SECTION_PROC_TIME) AS SECT_PROC_TIME, 
            SUM(TOTAL_COMPILE_TIME) AS COMP_TIME, SUM(TOTAL_COMPILE_PROC_TIME) AS COMP_PROC_TIME,
            SUM(TOTAL_IMPLICIT_COMPILE_TIME) AS IMP_C_TIME, SUM(TOTAL_IMPLICIT_COMPILE_PROC_TIME) AS IMP_C_PROC_TIME,
            SUM(TOTAL_COMMIT_TIME) AS COMMIT_TIME, SUM(TOTAL_COMMIT_PROC_TIME) AS COMMIT_PROC_TIME,
            SUM(TOTAL_ROLLBACK_TIME) AS ROLLBACK_TIME, SUM(TOTAL_ROLLBACK_PROC_TIME) AS ROLLBACK_PROC_TIME,
            SUM(TOTAL_RUNSTATS_TIME) AS RUNSTATS_TIME, SUM(TOTAL_RUNSTATS_PROC_TIME)AS RUNSTATS_PROC_TIME,
            SUM(TOTAL_REORG_TIME) AS REORG_TIME, SUM(TOTAL_REORG_PROC_TIME) AS REORG_PROC_TIME,
            SUM(TOTAL_LOAD_TIME) AS LOAD_TIME, SUM(TOTAL_LOAD_PROC_TIME) AS LOAD_PROC_TIME
     FROM TABLE(MON_GET_CONNECTION(NULL, -2)) AS METRICS)
     SELECT CASE WHEN SECT_TIME > 0 
                 THEN DEC((FLOAT(SECT_PROC_TIME) / FLOAT(SECT_TIME)) * 100,5,1) 
                 ELSE NULL END AS SECT_PROC_PCT,
            CASE WHEN COMP_TIME > 0 
                 THEN DEC((FLOAT(COMP_PROC_TIME) / FLOAT(COMP_TIME)) * 100,5,1) 
                 ELSE NULL END AS COMPILE_PROC_PCT,
            CASE WHEN IMP_C_TIME > 0 
                 THEN DEC((FLOAT(IMP_C_PROC_TIME) / FLOAT(IMP_C_TIME)) * 100,5,1) 
                 ELSE NULL END AS IMPL_COMPILE_PROC_PCT,
              CASE WHEN ROLLBACK_TIME > 0 
                 THEN DEC((FLOAT(ROLLBACK_PROC_TIME) / FLOAT(ROLLBACK_TIME)) * 100,5,1) 
                 ELSE NULL END AS ROLLBACK_PROC_PCT,
              CASE WHEN COMMIT_TIME > 0 
                 THEN DEC((FLOAT(COMMIT_PROC_TIME) / FLOAT(COMMIT_TIME)) * 100,5,1) 
                 ELSE NULL END AS COMMIT_PROC_PCT,
              CASE WHEN RUNSTATS_TIME > 0 
                 THEN DEC((FLOAT(RUNSTATS_PROC_TIME) / FLOAT(RUNSTATS_TIME)) * 100,5,1) 
                 ELSE NULL END AS RUNSTATS_PROC_PCT,
            CASE WHEN REORG_TIME > 0 
                 THEN DEC((FLOAT(REORG_PROC_TIME) / FLOAT(REORG_TIME)) * 100,5,1) 
                 ELSE NULL END AS REORG_PROC_PCT,
            CASE WHEN LOAD_TIME > 0 
                 THEN DEC((FLOAT(LOAD_PROC_TIME) / FLOAT(LOAD_TIME)) * 100,5,1) 
                 ELSE NULL END AS LOAD_PROC_PCT
       FROM PCTPROC
この照会は、以下の出力を生成します。
SECT_PROC_PCT COMPILE_PROC_PCT IMPL_COMPILE_PROC_PCT ROLLBACK_PROC_PCT COMMIT_PROC_PCT RUNSTATS_PROC_PCT REORG_PROC_PCT LOAD_PROC_PCT
------------- ---------------- --------------------- ----------------- --------------- ----------------- -------------- -------------
         57.6              0.1                     -              96.9            95.6               0.0           71.1          84.6
  1 record(s) selected.
このデータのグラフィカル表現は、図 1 に示すようなものになります。
図 1. 全体消費時間に対するパーセンテージで表されたコンポーネント処理時間
処理時間と他の時間を加えた積み重ね棒グラフ。各種コンポーネントの合計が 100 パーセントになります。
例 4: 消費時間モニター・エレメントのランキングを表示する。
これまでの例では、表示されるモニター・エレメントはすべて照会 SQL で明示的に指定されており、照会結果ではそれぞれが独自の列に表示されます。 しかし、調べる消費時間モニター・エレメントが分かっていないときもあります。例えば、上位 10 の待機時間モニター・エレメントを知りたい場合や、ゼロ以外の消費時間モニター・エレメントのみを知りたい場合があります。
行指向のフォーマットでモニター・エレメントを表示できる表関数が複数あります。このフォーマットでは、エレメントごとに別々の行に表示されます。 この処理に使用できる表関数には、MON_FORMAT_XML_* _BY_ROW 形式の名前が付けられています。 これらの関数は、特定のモニター・インターフェースから返される XML 文書からメトリックを抽出します。 (詳しくは、モニター・データを XML 文書で返すインターフェースを参照してください。)
MON_FORMAT_XML_* _BY_ROW 関数は、表示したいエレメントが分かっていないときに便利です。 例えば、CLPWORKLOAD というワークロードの待機時間モニター・エレメントの上位 10 エレメントを調べることもできます。 この情報を収集するには、DBSTATS (event_wlstats 論理データ・グループ) という統計イベント・モニターを作成します。表に書き込むようこのイベント・モニターをセットアップしたとすると、デフォルトで WLSTATS_DBSTATS という表の DETAILS_XML という列にメトリックが記録されます。 以下のように、イベント・モニターからの出力表にモニター・データを設定したら、MON_FORMAT_XML_WAIT_TIMES_BY_ROW 関数を使用する照会を構成することによって、調べたいモニター・エレメントを抽出できます。

SELECT SUBSTR(STATS.WORKLOAD_NAME,1,15) AS WORKLOAD_NAME,
       SUBSTR(METRICS.METRIC_NAME,1,30) AS METRIC_NAME, 
       SUM(METRICS.TOTAL_TIME_VALUE) AS TOTAL_TIME_VALUE
FROM   WLSTATS_DBSTATS AS STATS, 
       TABLE(MON_FORMAT_XML_WAIT_TIMES_BY_ROW(STATS.DETAILS_XML)) AS METRICS 
WHERE  WORKLOAD_NAME='CLPWORKLOAD' AND (PARENT_METRIC_NAME='TOTAL_WAIT_TIME')
GROUP  BY WORKLOAD_NAME,METRIC_NAME 
ORDER  BY TOTAL_TIME_VALUE DESC
FETCH FIRST 10 ROWS ONLY
要確認: 消費時間モニター・エレメントは、階層的に編成されています。 この例では、待機時間の二重カウントを避けるために、total_wait_time に累積されるモニター・エレメントのみを含めています (上記 SQL ステートメントの WHERE 節を参照)。 そうしないと、個別の待機時間をいくつも含んでいる total_wait_time 自体が結果に入ってしまうことになります。
この照会の結果は、例えば以下のような出力になります。
WORKLOAD_NAME   METRIC_NAME                    TOTAL_TIME_VALUE
--------------- ------------------------------ --------------------
CLPWORKLOAD     LOCK_WAIT_TIME                             15138541
CLPWORKLOAD     DIRECT_READ_TIME                            6116231
CLPWORKLOAD     POOL_READ_TIME                              6079458
CLPWORKLOAD     DIRECT_WRITE_TIME                            452627
CLPWORKLOAD     POOL_WRITE_TIME                              386208
CLPWORKLOAD     IPC_SEND_WAIT_TIME                           283172
CLPWORKLOAD     LOG_DISK_WAIT_TIME                           103888
CLPWORKLOAD     DIAGLOG_WRITE_WAIT_TIME                       78198
CLPWORKLOAD     IPC_RECV_WAIT_TIME                            15612
CLPWORKLOAD     TCPIP_SEND_WAIT_TIME                           3291

  10 record(s) selected.