IBM i 待機アカウンティングの基礎
待機アカウンティングは IBM® i オペレーティング・システムに組み込まれている特許取得済みテクノロジーであり、スレッドまたはタスクが何もしていないように見えるときにそれが何をしているかをユーザーが分かるようにします。
スレッドまたはタスクは、実行中でなければ待機しています。 待機アカウンティング (IBM i だけにしかない概念) は、パフォーマンスの詳細分析のための非常に強力な機能です。ここでは、待機の概念とスレッドが待機する理由、およびパフォーマンス上の問題をトラブルシューティングする場合や単にアプリケーションのパフォーマンスを向上させる場合に待機アカウンティングを使用する方法について焦点を当てていきます。
ジョブは、作業を行うための基本的なメカニズムです。 どのジョブも少なくとも 1 つのスレッドを持ち、複数のスレッドを持つ場合もあります。 1 つ 1 つのスレッドがライセンス内部コード (LIC) タスクによって表されますが、IBM i のスレッド・レベルの構造がなくてもタスクは存在します。LIC タスクは通常、IBM i Performance Tools またはサービス・ツール以外では外部から不可視です。待機アカウンティングの概念はスレッドとタスクの両方に適用されるので、1 つの実行可能作業部分を指す場合にスレッドとタスクという用語を使用します。
スレッドまたはタスクが取りうる基本状態として、次の 2 つがあります。
- プロセッサーで実行中。「実行中」状態です。
- プロセッサーで実行待機中。
主に次の 3 つの待ち状態があります。
- 実行準備済みでプロセッサー待ち。特殊な待ち状態であり、一般に CPU キューイング と呼ばれます。これは、スレッドまたはタスクが待ち行列に入れられていて、CPU での実行を待機していることを意味します。CPU キューイングが起こるのには、いくつかの異なる理由があります。例えば、区画が過負荷状態であり、区画の受け入れ可能限度を超える作業がある場合、作業は待ち行列に入れられて CPU を待機することになります。 これは、ランプ・メーターが設置された高速道路に例えることができます。高速道路が混んでいるときは、ランプ・メーターの信号が赤になるので、車は止まって本線に入れるようになるまで待たなければなりません。 論理区画と同時マルチスレッド化も、CPU キューイングにつながることがあります。
- アイドル待機。アイドル待機は、予期される正常な待ち状態です。 アイドル待機になるのは、スレッドが外部入力を待っているときです。 この入力は、ユーザー、ネットワーク、または別のアプリケーションからもたらされる場合があります。 その入力を受け取るまで、行わなければならない作業はありません。
- ブロック待機。ブロック待機は、共有リソースへのアクセスを同期化するための直列化メカニズムの結果です。 ブロック待機は、予期される正常な待ち状態である場合があります。 例として、表の行の更新、ディスク入出力操作、または通信入出力操作のための直列化アクセスが挙げられます。 一方、ブロック待機が正常でない場合もあります。 待ち状態を待機アカウンティングを使用して分析できるのは、このような予期しないブロック・ポイントのときです。
スレッドまたはタスクの存続時間を、実行または待機に費やした時間に分解してグラフィカルに考えることができます。 このグラフィカル記述を「実行/待機時間こん跡」といいます。 このこん跡は、大まかに次のようになります。

従来、アプリケーションのパフォーマンスを向上させるための焦点は、アプリケーションに CPU をできるだけ効率的に使用させることに当てられていました。 待機アカウンティング機能のある IBM i では、待機に費やした時間を調べて、その待機時間の要因を把握できます。削減または除去できる待機要素がある場合は、全体パフォーマンスも向上させることができます。
IBM i オペレーティング・システムにおけるほぼすべての待ち状態は、識別されており列挙済みです。換言すれば、固有待機ポイントそれぞれに数値が割り当てられています。これが可能なのは、IBM がライセンス内部コードとオペレーティング・システムの両方を完全に管理しているからです。 IBM i 6.1 のリリースの時点で、固有待ち状態は 268 あります。スレッドおよびタスクごとに 250 を超える固有待ち状態を追跡すると、ストレージを過剰に消費することになるので、グループ化アプローチが採用されています。 固有待ち状態はそれぞれ、32 あるグループ (「バケット」) のうちの 1 つに割り当てられています。 スレッドまたはタスクが待ち状態に入ったときと待ち状態から抜けたとき、タスク・ディスパッチャーが待ち状態を該当グループにマッピングします。
待機アカウンティングを使用して実行/待機時間こん跡を調べることにより、スレッドまたはタスクの待機時間について、その構成要素を識別できるようになりました。 以下に例を示します。

スレッドの待機時間の要因がディスク・データの読み取りと書き込み、直列化アクセスのためのレコードのロッキング、およびデータのジャーナリングだった場合、待機をこのように分解してとらえることができます。 関係している待機のタイプが分かると、確認すべきことがいくつか出てきます。 この例の場合、その中には以下のような事柄が含まれます。
- ディスク読み取りでページ不在になっていないか。そうであれば、プール・サイズは適切か。
- ディスクの読み取りと書き込みの要因になっているのはどのプログラムか。削減または除去できる不必要な入出力はないか。 あるいは、入出力を非同期で行えないか。
- レコード・ロッキング・ストラテジーは最適か。あるいは、レコードを不必要にロックしていないか。
- ジャーナル処理されているのはどのファイルか。すべてのジャーナルが必要か、また最適に構成されているか。
定義済みの 32 の待機グループ (「バケット」) は、以下のとおりです。 待機グループの定義はリリースによって異なり、今後変更される可能性があります。
- CPU 上のディスパッチ時間
- CPU キューイング
- 予約済み
- その他の待機
- ディスク・ページ不在
- 障害なしディスク読み取り
- ディスク・スペース使用の競合
- ディスク操作開始の競合
- ディスク書き込み
- ディスク (その他)
- ジャーナリング
- セマフォーの競合
- mutex の競合
- マシン・レベルのゲートの直列化 - IBM サポートをコール
- 占有の競合 - IBM サポートをコール
- データベース・レコード・ロックの競合
- オブジェクト・ロックの競合
- 不適格な待機
- 主記憶域プールの競合 - IBM サポートをコール
- 活動時ジャーナル保管
- 予約済み
- 予約済み
- 予約済み
- ソケット送信
- ソケット受信
- ソケット (その他)
- IFS
- PASE
- データ待ち行列受け取り
- アイドル/作業待ち
- 同期トークンの競合
- 異常な競合 - IBM サポートをコール
これらの待機グループの多くは、アプリケーションの待機分析をするうえで表面的なものにすぎない場合もあります。 これらの状況でアプリケーションが何を行っていてなぜ待機しているのかを理解すると、不必要な待機を削減したり除去したりする助けになることがあります。
- 読み取り
- 更新
- 脆弱
- 転送
- 検査
- 競合出口
ホルダーとウェイター
IBM i は、スレッドまたはタスクが待機しているリソースを追跡するだけでなく、リソースが割り振られたスレッドまたはタスクも追跡します。これは非常に強力な機能です。 「ホルダー」は、直列化リソースを使用しているスレッドまたはタスクです。 「ウェイター」は、その直列化リソースへのアクセスを要求しているスレッドまたはタスクです。
コール・スタック
IBM i は、スレッドまたはタスクごとにコール・スタックも管理します。これは、待機アカウンティング情報から独立しています。 コール・スタックは呼び出されたプログラムを示しており、待ち状態を把握する、つまり結果としてリソースを保持していたかまたはリソースの利用を要求していたロジック部分を知るうえで、非常に役立つことがあります。 ホルダー、ウェイター、コール・スタックの組み合わせは、待ち状態を分析するための非常に強力な機能になります。
データの収集と分析
IBM i には、待機アカウンティング情報を収集するためのパフォーマンス・データ収集メカニズムとして、収集サービスと Job Watcher の 2 つがあります。Job Watcher は、ホルダーとウェイターの情報およびコール・スタックも収集します。 パフォーマンス・データが収集されると、データをグラフィカルに分析できます。 iDoctor 製品には、パフォーマンス・データをグラフィカル表示するための Windows クライアント機能があります。 IBM Navigator for i Web コンソールには、Web ブラウザー・インターフェースでパフォーマンス・データをグラフィカル表示するための「データの調査」機能があります。