ロードアベレージの事がよく分かってなかったのでメモ。
実際には本を見つつ、コマンドの部分は実際に動かしながら確認。
参考
この本に全て書いてありました。
Linuxの性能の話などすごく分かりやすかったです。
詳細はこちらの4章を見ていただくのが良いかと思います。
[24時間365日]サーバ/インフラを支える技術 ……スケーラビリティ,ハイパフォーマンス,省力運用
結論
本に書いてあるまんまですが、ロードアベレージとは以下の状態のプロセス数を表示しています。
- プロセスの状態がTASK_RUNNINGの状態(実行はされていない)
- プロセスの状態がTASK_UNINTERRUPTIBLEの状態
TASK_RUNNINGはプロセスにCPUが割り当てられれば実行可能な状態。TASK_UNINTERRUPTIBLEはディスクのI/O待ち状態。
なので、 上記2つは処理を実行したくても待たされている状態 という意味になります。ロードアベレージでは上記のプロセス数を表示するので、値が高ければサーバーの処理が詰まってしまってしまい、負荷が高い状態となっていると言えると思います。
プロセスの状態
プロセスの状態には以下の5種類があるようです。
- TASK_RUNNING->CPUが割り当たれば実行可能な状態。CPUが割り当たって処理実行中もこの状態に当たる。(実行中のプロセスはロードアベレージの数値には換算されない)
- TASK_INTERRUPTIBLE->割り込み可能な待ち状態。sleepやユーザーからの入力待ちなど。 この状態のプロセスはロードアベレージには換算されない
- TASK_UNINTERRUPTIBLE->割り込み不可能な待ち状態。ディスクのI/O待ち
- TASK_STOPPED->サスペンドのシグナルが送られて実行中断になっている状態
- TASK_ZOMBIE->子プロセスがexitして親プロセスにリープされるまでの状態
どうやってロードアレベージを調べるのか
top,uptime,sarコマンドなどで確認できます。
以下はtopコマンド実行結果のキャプチャです。
$top
top - 23:01:13 up 9:38, 2 users, load average: 0.00, 0.01, 0.04
Tasks: 71 total, 1 running, 70 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.1%st
Mem: 1019444k total, 450140k used, 569304k free, 16368k buffers
Swap: 0k total, 0k used, 0k free, 369504k cached
上記の場合、 「load average: 0.00, 0.01, 0.04」という表示の部分がロードアベレージの値です。左から直近1分, 5分, 15分間のロードアベレージの値です。
uptimeコマンドでも同様に現在の状態を確認できます。
ロードアベレージだけ見たい場合にはこちらの方が見易いですね。
$uptime
23:08:34 up 9:45, 2 users, load average: 0.00, 0.01, 0.04
sarコマンドでは過去の状況の確認もできます。(sysstatパッケージのインストールが必要)
$sar -q
Linux 4.1.17-22.30.amzn1.x86_64 (ip-172-31-29-53) 2016年03月07日 _x86_64 (1 CPU)
13時30分01秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
13時40分01秒 0 76 0.00 0.01 0.03
13時50分01秒 0 76 0.00 0.01 0.03
14時00分01秒 0 76 0.00 0.01 0.03
14時10分01秒 0 77 0.00 0.01 0.03
「ldavg-1,ldavg-5,ldavg-15」がtopやuptimeと同じように対象時間をベースにした直近1分、5分、15分間のロードアベレージの時間となっています。