はじめに
運用保守の業務に携わっていて、CPU、Memory、Diskのリソース監視の項目の並びにLoadAverageなるものが存在します。『サーバー負荷の状況を判断する項目』くらいの浅い認識しか持っていなかったので、これの正体について調べてみました。
LoadAverageとは?
LoadAverageとは、『1CPUに対して、平均的にどれだけプロセスが実行待ちになっているか』を示す指標で、この数値が高いとLinuxのシステムが高負荷の状況であることを意味します。
そして、Linuxプロセスの状態について、以下の表が示すように複数の状態が存在します。この中で、LoadAverageの数値に影響するのが、**TASK_RUNNING
とTASK_UNINTERRUPTIBLE
**となります。この2つのプロセス数が多いと、色んなプロセスがCPUに対して処理を求めているけど、サーバが捌き切れないため、そのプロセスが後ろに待ち行列を作っている状態を意味しています。そのため、LoadAverageの数値が高いほど、そのサーバの負荷は高い状態ということになります。
プロセス | 状態 |
---|---|
TASK_RUNNING | CPU上で実行中、あるいは実行可能で CPUの割り当てを待っている状態 |
TASK_INTERRUPTIBLE | 割り込みが可能だけど、ユーザの入力待ちなどで、いつ復帰するかわからない状態 |
TASK_UNINTERRUPTIBLE | サーバの負荷が高く、ディスクI/Oなどで割り込み不可の待ち状態 |
TASK_STOPPED | プロセス停止状態 |
TASK_ZOMBIE | ゾンビ化状態。いわゆるゾンビプロセス |
LoadAverageを炙り出すには?
LoadAverageの正体がわかったので、次は実際にこの数値を炙り出します。
- uptimeコマンド
[hoge@test ~]$ uptime
16:06:08 up 248 days, 5:56, 1 user, load average: 0.54, 0.57, 0.35
[hoge@test ~]$
- topコマンド
[hoge@test ~]$ top
top - 16:05:35 up 248 days, 5:55, 1 user, load average: 0.47, 0.57, 0.34
Tasks: 135 total, 1 running, 105 sleeping, 0 stopped, 0 zombie
Cpu(s): 4.8%us, 0.7%sy, 0.0%ni, 94.3%id, 0.2%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 7953580k total, 6483128k used, 1470452k free, 215532k buffers
Swap: 7953576k total, 28672k used, 7924904k free, 1781460k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17164 jetty 20 0 5913m 2.4g 19m S 7.3 31.4 9:23.61 java
3827 rundeck 20 0 3802m 1.3g 17m S 3.3 17.7 168:27.61 java
2382 root 20 0 574m 59m 3860 S 0.3 0.8 34:22.45 ruby
1 root 20 0 19692 1668 1408 S 0.0 0.0 0:04.29 init
[hoge@test ~]$ top
他にも確認方法ありますが、代表的な2つのコマンドで試しました。実行結果の以下部分がLoadAverageの数値となります。
load average: 0.54, 0.57, 0.35
数値が3つ並んでおり、左から順に、1分前の数値(0.54)
、5分前の数値(0.57)
、15分前の数値(0.35)
となります。
LoadAverageの正常値は?
先ほど、LoadAverageの数値を確認しましたが、正常値かどうかの判断はCPUのコア数で判断します。かつてシングルコアが主流の時代は、LoadAverageは1以下であれば無条件で正常値と判断されていたようですが、現在はマルチコアも存在するため、コア数によって正常値が異なる点は注意が必要です。
そのため、コア数が1つであれば、正常値は1以下になり、コア数が2つであれば、正常値は2以下になります。では、先程のサーバーのコア数を確認してみましょう。
- コア数確認のコマンド
[hoge@test ~]$ grep cpu.cores /proc/cpuinfo | sort -u
cpu cores : 1
[hoge@test ~]$
このサーバーはコア数1と分かりましたので、正常値は1以下となり、今回炙り出したLoadAverageは正常値と判断されます。
最後に
今回、Linuxのシステム限定の話でしたが、Windowsの場合はLoadAverageを確認できるコマンドやツールがないらしく、CPUやMemoryの使用率から判断したり、タスクマネージャから負荷状況を確認するそうです。私の浅いリサーチによる情報ですので、もし認識違ってましたら、ご指摘いただけますと幸いです。
##参考
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
マルチコア時代のロードアベレージの見方
ロードアベレージでサーバの負荷を確認する
【CPUの基本】図解でよくわかる「マルチコア / スレッド」の意味