ablog

不器用で落着きのない技術者のメモ

vmstat の"r"列とマクドナルドのレジカウンター

最近、マクドナルドのレジカウンターの店員がサーバー・プロセス、その後ろでハンバーガーやポテト、ドリンクなどを作っている店員がバックグラウンド・プロセス、並んでいる客がクライアント・プロセスに見える今日この頃です。


vmstat でCPU負荷を見るときになぜ使用率だけじゃなくて"r"列を見る必要があるかについて、マクドナルドの店頭で例えてみるとわかりやすいのではないかと思って絵を描いてみました。以下はいずれも店員のガンバリ具合(CPU使用率)は 100% で、行列("r"列)の数だけ異なる絵です。店員は客の数に関わらず 100% でオーダーを処理します。これは客が1人でも、10人の行列ができていても同じです。

1. CPU使用率100%でvmstatの"r"列が「4」の場合

2. CPU使用率100%でvmstatの"r"列が「8」の場合

3. CPU使用率100%でvmstatの"r"列が「12」の場合


CPU使用率は全て同じだから上の3つの例の、負荷は同じでしょうか?
「1.」の場合、コア数を増やしてもスループットは変わりませんが、クロック数を上げるとスループットが上がります。
「2.」、「3.」の場合、コア数を増やせばスループットが上がります。もしくは、クロック数を上げてもいいですね。コア数を倍にしても、クロック数を倍にしてもどちらでも同じですね。たぶん。


マクドナルドが混んでいるかどうか見るときに店員の様子を見て、「100%でやっとるな」と見るのではなく、行列を見て「混んどるな」と判断するのではないかと思います。CPU負荷も同じく使用率だけでなく、どれだけ客(タスク = プロセス or スレッド)を待たせているか見ることが大切なのだと思います。

"r"は"run queue"の"r"で、実行可能で実行中もしくはCPU割り当て待ちのタスクの数です。
もう少し詳しくは load average ってなんじゃい? - ablog に書いています。


追記(2010/12/11):
この記事を見られた何人かの方から「ハイパースレッディングの場合はどうなるの?」って聞かれました。「おそらく、店員が倍になる感じではないかと思います。」と答えました。
ちょっと調べてみたところ、OS からはコアが倍に見えるが、物理的には1コアが2タスク処理しているようです。例えると、二股されてる感じかな?2人の男が1人の女性に二股されているが、男はそんなことは知らず、自分の彼女だと思っている。土曜日は片方とデートして、日曜日はもう片方とデートするとかすれば、並列処理することができる。が、同棲とかは難しい。なので、あまり忙しくないタスクを並列処理する場合はハイパースレッディングは有効なのではないかと思います。例えに品がないですね。。。


追記(2010/12/12):
もうひとつ、「b列についてはどうなんですか?」と聞かれましたが。これは id:happs さんから素晴らしいコメントをいただきました。

自分もレジカウンターがrun queueに見えた時期がありましたw 注文を終えて、横で商品が来るのを待ってる客はI/O待ちのプロセスだな・・とかそんな妄想w

vmstat の"r"列とマクドナルドのレジカウンター - ablog


ブログに書くといろいろツッコミがあって、理解が深まっていいですね。
デザイナーの友達には絵がださいと言われましたw