Processor Queue Length や Disk Queue Length の見方

こんにちは。 Windows サポートの水上です。

最近、 Windows サポート チームに、次のようなお問合せがありました。

お問合せ例 1:

Processor Queue Length パフォーマンス カウンターでのボトルネック判断基準を確認したい。

お問合せ例 2:

パフォーマンス カウンターを監視していたところ、 Disk Queue Length の上昇がみられた。どのように判断すればよいか、確認したい。

今回は、このような疑問に "Queue Length" の意味合いにも触れながらお答えします。
 

そもそも Queue Length とはなんなのか?

 
Queue Length とは、待ち行列の長さのことです。
Processor Queue Length であれば、 CPU コアの割り当てを待つスレッドの行列の長さを、 Disk Queue Length であれば、ディスクの読み書きを待つリクエストの行列の長さを指します。

CPU もディスク ドライブも、一度に 1 つの処理しか実行できません。
そのため、ある処理が CPU やディスク ドライブを使用している間、他の CPU やディスク ドライブを必要とする処理は実行中の処理が終わるのを待つ必要があります。
待ち行列の長さとは、この他の処理が終わるのを待っている処理の数のことです。

Windows では、 Processor Queue Length を監視するパフォーマンス カウンターとして、以下のカウンターが提供されています。

  • \System\Processor Queue Length
    CPU の処理を待つスレッドの数。カウンター採取時の瞬時値。

同様に、 Disk Queue Length を監視するパフォーマンス カウンターとして、以下のカウンターが提供されています。

  • \LogicalDisk\Current Disk Queue Length
    ディスクの読み書きを待つリクエストの数。パーティションごと。値はカウンター採取時の瞬時値。
  • \LogicalDisk\Avg. Disk Queue Length
    ディスクの読み書きを待つリクエストの数。パーティションごと。値はカウンター採取間隔の平均値。
  • \LogicalDisk\Avg. Disk Read Queue Length
    ディスクの読み込みを待つリクエストの数。パーティションごと。値はカウンター採取間隔の平均値。
  • \LogicalDisk\Avg. Disk Write Queue Length
    ディスクの書き込みを待つリクエストの数。パーティションごと。値はカウンター採取間隔の平均値。
  • \PhysicalDisk\Current Disk Queue Length
    ディスクの読み書きを待つリクエストの数。物理ドライブごと。値はカウンター採取時の瞬時値。
  • \PhysicalDisk\Avg. Disk Queue Length
    ディスクの読み書きを待つリクエストの数。物理ドライブごと。値はカウンター採取間隔の平均値。
  • \PhysicalDisk\Avg. Disk Read Queue Length
    ディスクの読み込みを待つリクエストの数。物理ドライブごと。値はカウンター採取間隔の平均値。
  • \PhysicalDisk\Avg. Disk Write Queue Length
    ディスクの書き込みを待つリクエストの数。物理ドライブごと。値はカウンター採取間隔の平均値。

ところで、待ち行列は、コンビニで 1 台のレジに並ぶお客さんの行列にたとえることができます。
1 台のレジ ( CPU コアやディスク ドライブ) は一度に 1 人のお客さん (処理) しか対応できないため、お会計を待つお客さんは行列を作ることになります。
お客さんの行列の長さ (Queue Length) は、コンビニの混雑状況を把握する重要な指標です。

また、コンビニでレジの台数を増やすと、同時に対応できるお客さんの数が増えお客さんの待ち時間を短縮できるように、 CPU のコアや物理ディスクの数を増やすと、同時に処理できるスレッドやリクエストの数が増え、システムの処理遅延を小さくすることができます。
 

Queue Length にはどのような意味があるのか?

 
待ち行列には、長期間観測した待ち行列の長さの平均が、システムの負荷量と処理遅延の積として得られる、という重要な性質があります。
この性質は、リトルの法則と呼ばれ、次の等式で説明されます:

<平均系内客数>  =  <平均到着率>  X  <平均サービス時間>

ここで、 <系内客数> は平均の待ち行列長、 <平均到着率> は単位時間あたりの処理要求数の平均 (つまりシステムの負荷量)、 <平均サービス時間> は 1 つの処理を行うのにかかった時間の平均 (つまり処理遅延) に相当します。

リトルの法則を読み解くと、 Queue Length を長期的に観測することによって、システムの負荷の状況やシステムの処理遅延の状況も把握できることがわかります。
 

どのように Queue Length の値を読むか?

 
Queue Length の判断基準に関するお問合せに対して、私たちは次のようにご案内しています:

まずは、 Queue Length が瞬間的に上下しているのか、常に高い状態にあるのかをご確認いただければと存じます。
Queue Length が急上昇後すぐに降下し、グラフがスパイク状になる場合、実行待ちは短期間で解消されていると判断できます。
一方で、 Queue Length の値が常時高い傾向にある場合や、上昇傾向にある場合は、調査が必要です。

先ほどのコンビニのレジの話でたとえてみましょう。

レジの待ち行列長がスパイク状に変動するとき、コンビニでは、時より複数のお客さんが同時に訪れ、すぐに立ち去る、という様子が観察できます。
確かに一時的に待ち行列の長さが長くなりますが、お客さんのお買い物は比較的短時間に終わります。

一方で、レジの待ち行列長が 0 にならない状況が持続するとき、コンビニでは、いつでもレジに人が並んでいる、という状況が発生します。
当然、レジ待ちに不満を持つお客さんが増え、お会計を待ちきれないお客さんも出てきます。

また、レジの待ち行列長がどんどん長くなるとき、コンビニでは、買い物を済ませるお客さんよりも、コンビニにやってくるお客さんの方が多いという状態が発生します。
最終的に、コンビニはお客さんであふれかえってしまいます。

同じことが、 Processor Queue Length や Disk Queue Length にも言えます。
待ち行列長がスパイク状に変動しているうちは、比較的処理遅延は短く抑えられていると考えることができます。
しかし、待ち行列長が 0 にならない状況では、常に処理遅延が発生していると考えられ、体感上のパフォーマンス劣化がみられる場合もあります。
さらに、待ち行列長が増加し続けるようであれば、負荷が処理能力を超えてしまっており、システムは不安定な状態に陥っていると判断できます。

先ほど登場したリトルの法則でも同じことが説明できます。
リトルの法則は、 Queue Length を長期的に観測し平均化した値について等式が成り立ちます。
Queue Length を平均化すると、スパイクの影響は相対的に小さくなるため、結果として平均の待ち行列長は小さくなり、等式からシステム負荷や処理遅延も小さくなります。
ゆえに、 Queue Length の変動がスパイク状であれば、パフォーマンスに大きな影響は出ていないと判断できます。
 

Queue Length を監視するにあたって注意したいこと

 
パフォーマンスの体感は最終的に遅延で決まる。
待ち行列が長いこと自体が問題なのではない。

Processor Queue Length や Disk Queue Length を監視するにあたっては、この 2 点に注意する必要があります。
これは、コンビニのお客さんにとって不満なのは、混雑していることではなくお会計に時間がかかることである、ということと似ています。
システムのパフォーマンスを評価する際には、特定のカウンターだけにとらわれず、複数の指標をつかって多角的に評価することを心がけてください。