複数プロセッサーシステムでのCPU使用率
前回 POWER5 プロセッサーのSMT機能について解説しました。SMTは、1つの物理プロセッサーを同時並行で利用することにより、論理的に2つのプロセッサーとして稼動させる技術です。では、その時のCPU使用率はどのように考えればいいでしょうか。
今回はSMT環境でのCPU使用率について説明します。
POWER5プロセッサーのSMTでは最大2つのスレッドが同時並行実行できますが、これをシステムに論理的なプロセッサーが2つあると考え、「論理プロセッサー(Logical
Processors)」と呼びます。
単純に考えれば、CPU使用率は、Mを経過したCPUサイクル数、LP1とLP2をMの間に各論理プロセッサーが稼動したサイクル数とすると、両方の論理プロセッサーの稼働時間の平均をとり、
![]()
とすればいいように思われます。実際、i5/OSでも従来のSMP(対称型マルチプロセッシング。N-Wayのことです)の場合はこのような考え方でCPU使用率が算出されます。
この考え方では、一方の論理プロセッサーが測定サイクル中ずっと稼働し、もう一方の論理プロセッサーが完全に遊休状態だった場合、CPU使用率は50%になり、システムは処理能力に残り50%の余裕を残していることになります。SMPの場合はこの考え方でほぼ問題ありませんが、SMTはプロセッサーの各機構を2つのスレッドで「できるだけ共有する」仕組みなので、2つの論理プロセッサーが完全に独立して稼動できるわけではなく、この状態で50%の余力があるわけではありません。したがってこの考え方でCPU使用率を算出した場合、SMTでは処理能力の余力を過大に(CPU使用率を過小に)見積もってしまうことになります。
i5/OSではSMT環境の場合、Wait State taskというタスクと、POWER5プロセッサーのPURRレジスターを使って、システムの処理能力の「余力」を基準にCPU使用率を定義しています。以下にこの仕組みを解説します。
Wait State task
一般にコンピューターのプロセッサーは、「遊休」状態でも完全に停止しているわけではなく、遊休の間は絶えず「自分にできる仕事はないか」と問いかけ続けるようなタスクを実行しています。例えばWindows
のタスクマネージャに表示される"System Idle Process"もこのタスクです。i5/OSでは、このタスクを「Wait
State task (待ち状態タスク)」と呼びます。SMTの2つの論理プロセッサーも、遊休状態ではWait
State taskが実行されます。
SMTの環境では負荷が小さい(スレッド数が少ない)場合、一方の論理プロセッサーが活動し、もう一方がWait
State Taskを実行しているような状態が頻繁に起きます。このため、スレッド数が少ない状態ではWait
State taskの稼動がシステムのパフォーマンスにわずかながら影響を与えます。この影響を最小化するため、SMTではハードウェアレベルで優先順位制御が行われ、他に実行するスレッドがある場合はWait
State taskのような優先度の低い処理にはあまり処理能力が割り当てられないようになっています。*1
PURR レジスター
プロセッサーの負荷をより的確に把握するために、POWER5プロセッサーでは、PURR(Processor
Utilization of Resource Registor) というレジスターが追加されています。PURRはSMTの論理プロセッサーごとに存在する64ビットのレジスターです。
POWER5プロセッサーでは、物理プロセッサーの1サイクルごとに2つあるPURRのうち必ずどちらか一方の値が1増やされます。両方のPURRの増分値の合計は、経過したサイクル数と等しくなります。あるサイクルにどちらかの論理プロセッサーに命令が割振られた(ディスパッチされた)場合、その論理プロセッサーのPURRが増やされます。どちらの論理プロセッサーにも命令が割振られなかった場合、どちらを増やすかはハードウェアが判断しますが、平均すれば両方のPURRが同じだけ増やされます。
PURRの値は双方の論理プロセッサーでタスク単位に集計されており、Wait State
taskの実行時もPURRは増加されます。
CPU使用率
i5/OSでは、SMT環境でのCPU使用率を「Wait State task以外のタスクが消費したサイクル数の割合」として定義しています。具体的には、次の式で表されます。
![]()
ここで、Mは経過したサイクル数、WS1とWS2はMの間に各論理プロセッサーがWait
State taskで消費したPURRカウント値です。
測定期間中プロセッサーがまったく使われなかった場合、両方の論理プロセッサーはずっとWait
State taskを実行していると考えられるため、WS1+WS2=Mとなり、CPU使用率は
0% となります。
測定期間中2つ以上のスレッドがずっと活動していた場合、Wait State taskはまったく動かないと考えられるので、WS1+WS2=0となり、CPU使用率は
100% になります。
測定期間中システム内の1つのスレッドだけがずっとプロセッサーを使用していた場合、片方の論理プロセッサーではWait
State taskはまったく実行されず(WS1=0)、もう一方の論理プロセッサーではWait
State taskだけが実行されます。Wait State taskの優先順位は低いので、結果としては大多数のサイクルがスレッドを実行する論理プロセッサーに割振られ(WS2はMに比べて非常に小さくなり)、CPU使用率は100%に近い値となります*2。
このように、i5/OSでは、Wait State taskの実行時間を全体から引くことによってCPU使用率を算出しています。厳密には、この値はCPUが「使用されている」時間を表してはいません。例えば、論理プロセッサーがメモリーからキャッシュへのデータの移動を待機しているような時間も「使用率」に含まれてしまいます。しかしこのような状態でも、もう一方の論理プロセッサーがWait
State taskを並行して実行していれば、この時間は処理能力の余力としてカウントされます。実際にもう一つスレッドがあればこの時間はそちらのスレッドに割振ることができるので、結果としては正しいことになります。
WRKSYSSTSやWRKACTJOBコマンドで表示されるCPU使用率はこの方法で算出されています。WRKACTJOBで表示されるジョブごとのCPU使用率も同じです。2Way以上のシステムでは、すべてのプロセッサーについて上記の方法で計算したCPU使用率の平均値が、システムのCPU使用率となります。
一般論としてはSMT環境でのCPU使用率の算出方法は1つではなく、OSによっても異なります。いずれの方法を採用しても、システムでスレッドがまったく活動しないときにはCPU使用率は0%で、2つ以上のスレッドが活動し続けた場合は100%になります。問題は実際のスレッドとWait
State Taskが混在した場合で、このときのCPU使用率を何をもって厳密に"正確"とするかは定義することができません。上記の方法で、「余力」とされている
Wait State Task の代わりに実際のスレッドを稼動させた場合に同じサイクルを消費するかというと、厳密にはそうはなりません。しかし、システムの余力に着目した場合、この方法は考えられる中で最良のものです。
結論
IBM POWER5プロセッサーの持つSMT(Simultaneous Multi-Threading)機能は、IBMのマイクロプロセッサーアーキテクチャー研究開発の成果であり、大きな技術革新です。ワークロードにもよりますが、SMTにより、POWER5ベースのIBM
System i5では35-40%もパフォーマンスが向上する場合があります。
*1*2
実際にi5で単純に無限ループを実行するようなプログラムを流した場合、SMTがオフの状態ではCPU使用率は100%になりますが、SMT
オンでは95%程度以上上がりません。残りの5%はWait State taskが実行されているものと考えられます。
