Load Averagesでシステム全体の負荷を確認する
インフラの監視を行っている中でLoad Averagesの数字が何を示しているのか気になったので調べました。
コマンドに関しては、手元のMac(Apple M2 Pro 12Core/32GB
)で実行確認しています。
Load Averagesとは
Load Averagesは、システム全体の負荷状況を表す指標です。1CPUにおける単位時間あたりの実行待ち状態とディスクI/Oの完了待ち状態のプロセス数の平均値[1]で計算されます。
この2つのプロセス数が多い場合、「多くの処理が行う必要が発生しているがCPUの処理が間に合ってなく、プロセスの待ち行列が発生している」ことになります。
そのため、Load Averageの数値が高いほど、「多くのタスクが発生している」もしくは、「1つのタスクに多くの時間がかかっている」ことが分かり、システム全体が高負荷状態であることが分かります。
数値が低い場合、スループットが高く良い状態と判断できます。
プロセスの状態
実行待ち状態とディスクI/Oの完了待ち状態プロセスについて確認します。
プロセスの状態は以下のように区別されます。
Load AveragesはこのうちTASK_RUNNING
とTASK_UNINTERRUPTABLE
の状態のものが計測されます。
プロセスの状態 | 概要 |
---|---|
TASK_RUNNING | 実行可能な状態。CPUが空いていれば実行できる。 |
TASK_UNINTERRUPTABLE | 割り込み不能な待ち状態。ディスクI/O待ちなど、短時間で復帰するもの。 |
TASK_INTERRUPTIBLE | 割り込み可能な待ち状態。ユーザの入力待ちなど、復帰時間が予測できないもの。 |
TASK_STOPPED | 実行中断状態。 |
TASK_ZOMBIE | ゾンビプロセス。子プロセスがexitして親プロセスにwaitされていないものなど。 |
Load Averagesの確認
Load Averagesを確認するコマンドの一つにuptime
コマンドがあります。
[dev@host:~$] uptime
14:44 up 42 days, 16:54, 3 users, load averages: 1.86 2.37 3.80
この場合、
- 1分平均:
1.86
- 5分平均:
2.37
- 15分平均:
3.80
であることが確認できます。
他にも、top
コマンドやw
コマンドなどでも確認できます。
[dev@host:~$] w
16:07 up 42 days, 18:17, 3 users, load averages: 3.05 3.05 3.26
USER TTY FROM LOGIN@ IDLE WHAT
dev console - 24Jul23 96days -
dev s000 - 24Jul23 34days zsh (figterm)
dev s007 - 14:24 - zsh (figterm)
[dev@host:~$] top
Processes: 668 total, 4 running, 664 sleeping, 5378 threads
Load Avg: 1.78, 2.70, 3.11 CPU usage: 6.70% user, 3.35% sys, 89.94% idle SharedLibs: 483M resident, 95M data, 31M linkedit. MemRegions: 832717 total, 9537M resident, 184M private, 5700M shared.
PhysMem: 31G used (3281M wired, 11G compressor), 125M unused. VM: 324T vsize, 4283M framework vsize, 8469(0) swapins, 86300(0) swapouts. Networks: packets: 144836021/165G in, 25478342/5167M out.
Disks: 22490364/391G read, 25348953/335G written.
...
まとめ
Load Averagesは、システム全体の負荷状況を確認するのに用いる数値で、「実行待ち状態とディスクI/Oの完了待ち状態のプロセス数の数」を示す指標です。
-
正確には指数移動平均で計算されているようです。指数移動平均は、過去の値よりも直近の値になるほど比重を置いて計算された平均値です。 ↩︎
Discussion