Linuxカーネルソースから理解するロードアベレージ/CPU負荷

はてなのnaoyaさんの記事「負荷とは何か」で、Linuxでtopやsarを実行した時に出てくるロードアベレージや、CPU時間について。実際のカーネルソースを紹介しながら、挙動を非常にわかりやすく解説していた。

ロードアベレージとは、実行したいが実行できないプロセスの数が時間あたりいくつあるかの数値。この実行待ちのプロセス数を更に細かく見ると、TASK_RUNNINGとTASK_UNINTERRUPTIBLEを合わせた数であるという事だった。

TASK_RUNNING
実行中もしくは実行可能でCPU割り当てを待っている状態
TASK_INTERRUPTIBLE
割り込み可能な待ち状態。ユーザーからの入力待ちなど比較的時間がかかる事象。
TASK_UNINTERRUPTIBLE
割り込み不可能な待ち状態。ディスクI/O待ちなど短い事象。

あれ?TASK_RUNNINGは実行中のプロセスも含むんだなぁ。
という事は、以下の説明は微妙に違っているという事になる。naoyaさんの記事中にあるこの説明は、

ロードアベレージは過去1分、5分、15分の間の実行待ちプロセス数の平均数 = 実行したくても他のプロセスが実行中で実行できないプロセスが平均で何個ぐらい存在してるか

こう記述する方がより正確という事か。

ロードアベレージは過去1分、5分、15分の間の実行待ちプロセス数の平均数 = 実行中のプロセスと、実行したくても他のプロセスが実行中であったりIO待ちで実行できないプロセスが平均で何個ぐらい存在してるか

これではちょっと文章が長過ぎるけど:-)