ロードアベレージについての再確認

システム管理をしていると避けて通れないのがロードアベレージですね。そしてCPU使用率とメモリ使用率。どれをどう見ればいいのか、仕組みを理解していないと困る人も多いはず。というわけで、システムの負荷の考え方をまとめてみました。

とりあえず、我が家のGentooマシンを再構築中の1シーン。
top-emerge
topコマンドの出力です。load averageが4.27です。この時点でロードアベレージ敏感派は諦めてしまうでしょう。けれどシステムは軽快に動いています。他のコマンドもサクサク帰ってきます。なぜでしょう。それはCPUが4つあるからですね。

具体的には3行目から6行目が個々のCPUの使用状況を表示しています。usがユーザのアプリケーション、syがシステムなのでカーネルと考えればいいでしょう。niがナイスなのですが、各プロセスにはniceという設定値があって、基本は0、大きくなると優先度を下げられるということになっており、そのniceが0より大きいプロセスのCPU利用率になります。idはアイドルなので暇。waはウェイトなので待ち、I/O待ちです。hi、si、stはなんだっけね。stは仮想マシンの場合の色々あって使えなかったCPUだったはずだけど。気になる人はtopのmanでも見てください。

ということですが、よく見ると各CPUはそれぞれ100%近く使われています。そしてロードアベレージが4ちょい。これはどういうことでしょうか。この意味を理解していないと、topを起動してこんな出力があった時にあたふたしてしまいます。

ここでuptimeというコマンドのmanを引用しておきます。uptimeはtopの1行目と同じ内容を表示するコマンドです。

System load averages is the average number of processes that are either in a runnable or uninterruptable state. A process in a runnable state is either using the CPU or waiting to use the CPU. A process in uninterruptable state is waiting for some I/O access, eg waiting for disk. The averages are taken over the three time intervals. Load averages are not normalized for the number of CPUs in a system, so a load average of 1 means a sin- gle CPU system is loaded all the time while on a 4 CPU system it means it was idle 75% of the time.
情報源: Linux 2.6 – man page for uptime (linux section 1) – Unix & Linux Commands.

英語ですね。かいつまんで言うと、システムのロードアベレージってのは実行可能と割込不可なプロセスの合計で、実行可能ってのはCPUが空いたら走るやつで、割込不可ってのはI/Oのアクセス待ちなやつだよ。そしてCPUの数で割ってないから、ロードアベレージが1ってのは4CPUのシステムでは75%の空きがあるってことさ。ということですね。

プロセスの状態遷移を理解していなくても、実行可能なプロセスと割込不可なプロセスが他のプロセスの実行を妨げるのは想像できると思います。そういうプロセスがまさにシステムの負荷を上げているのです。そういうプロセスを減らす=利用者を減らすということなので、あまり望まれない対策でしょう。利用者が増えてシステムの利用率が上がるとシステムの負荷が上がる。それは自然の摂理。

ところで、実行可能と割込不可と言えば、vmstatの出力を思い出します。

$ vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0   4448 3025256  37924 4143520    0    0     0    22    2    2  2  0 98  0  0
 1  0   4448 3027132  37924 4143640    0    0     0     0 1417 1534 18  8 73  0  0
 1  0   4448 3021352  37924 4143744    0    0     0     0 1267 1337 19  7 74  0  0

特に何中ってわけでもないので面白くないですが、vmstatではこんな出力が出ますね。これの左端、procsに注目しましょう。rとbがあります。これはRunnableとBlockingなので、まさに実行可能と割込不可です。そういうことだったんですね。

ロードアベレージについてはこんなところでしょうか。あと、システム管理者ならsarコマンドも知っておきたいところですが、自分もあまり使わないので置いておきます。最近はグラフィカルなツールが整っているから必要ないんだよね。でもCUIでシステムの稼働状況を見れるのは助かることもあるので、名前だけでも覚えていってください。

これでロードアベレージについての理解が広まることを祈ります。ロードアベレージが高いってことはCPUやI/Oの資源が足りていないってことなので、メモリを増やしても意味はあまりありません。メモリを増やした分、プロセスを増やすと負荷が高まる可能性もあります。許されるならプロセス数を絞るってのもひとつの選択肢だと思います。

ロードアベレージ、奥が深いなぁ。