load average
load average
「LAが急上昇しました。」とかそういうことを聞いたりする。
load averageについてこの機会におさらいかねてまとめておくことにした。
実行するタスクが増えてくるとタスクの実行待ちが発生する。
この待ち状態がプログラムの遅延状態としてload averageに表示される。
$ top top - 18:59:58 up 27 days, 20:23, 1 user, load average: 0.15, 0.30, 0.24 ⭐ Tasks: 134 total, 1 running, 133 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.9 us, 0.6 sy, 0.0 ni, 98.4 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 3797.7 total, 938.1 free, 1031.2 used, 1828.5 buff/cache MiB Swap: 488.0 total, 488.0 free, 0.0 used. 2508.8 avail Mem ## 実行した時間が違うのでload averageが異なる。 $ uptime 19:10:43 up 27 days, 20:33, 1 user, load average: 0.07, 0.14, 0.17 ⭐
load average: 0.15, 0.30, 0.24
左から順に1分、5分、15分の単位でどの程度タスクの待ち時間が発生したかを表している。
load averageが高いということは、遅延が発生しているということになるので、負荷が高いということになる。
しかし、CPU負荷なのかI/O負荷なのかはこれだけでは判断できない。
Load averageの算出処理はカーネルのコードのこの辺りから追える。
sar
Load averageからCPU負荷なのかI/O負荷なのかを見極めていく。
$ sar Linux 5.4.65-v8.2.el8 (localhost.localdomain) 2021年09月17日 _aarch64_ (4 CPU) 00時00分00秒 CPU %user %nice %system %iowait %steal %idle 00時10分00秒 all 2.14 0.00 1.09 0.17 0.00 96.60 00時20分00秒 all 1.55 0.00 0.76 0.14 0.00 97.55 00時30分00秒 all 1.61 0.00 0.81 0.14 0.00 97.45 00時40分00秒 all 1.61 0.00 0.78 0.40 0.00 97.21 00時50分00秒 all 1.62 0.00 0.79 0.18 0.00 97.41 01時00分00秒 all 1.54 0.04 0.76 0.15 0.00 97.51 01時10分00秒 all 1.61 0.00 0.80 0.34 0.00 97.24 01時20分00秒 all 1.62 0.00 0.81 0.13 0.00 97.44 01時30分00秒 all 1.60 0.00 0.80 0.34 0.00 97.26 01時40分00秒 all 1.59 0.00 0.78 0.16 0.00 97.47 01時50分01秒 all 1.57 0.00 0.77 0.20 0.00 97.46 02時00分01秒 all 1.62 0.22 0.84 0.17 0.00 97.15 02時10分00秒 all 1.67 0.00 0.83 0.32 0.00 97.18
CPU負荷
以下の項目に注目する。
- %user: ユーザモード
ユーザプログラム(アプリケーション等)で実行したCPU使用率
- %system: システムモード
カーネル(システム)で実行したCPU使用率
I/O負荷
- %iowait:
ディスクI/O待ち。スワップアウト時などに値が上昇する。
プロセスの状態
load averageが分かり、CPU使用率・I/O待ち率が判明したら各プロセスからボトルネックを見つけていく。
以前の記事で書いてある通り、プロセスの状態は以下の通り。
$ ps aux | head -1 && ps aux | grep httpd USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 6849 0.0 0.1 44256 6536 ? Ss 5月30 1:40 /usr/sbin/httpd -DFOREGROUND www 225430 0.0 0.1 56460 4592 ? S 6月13 0:00 /usr/sbin/httpd -DFOREGROUND www 225431 0.0 0.1 2293576 6108 ? Sl 6月13 1:59 /usr/sbin/httpd -DFOREGROUND www 225432 0.0 0.1 2490256 6340 ? Sl 6月13 2:03 /usr/sbin/httpd -DFOREGROUND www 225433 0.0 0.1 2293576 6140 ? Sl 6月13 1:59 /usr/sbin/httpd -DFOREGROUND
STAT | 状態 | 説明 |
---|---|---|
R (Run) | TASK_RUNNING | 実行可能状態。CPUが空きさえすればいつでも実行可能 |
S (Sleep) | TASK_INTERRUPTED | 割り込み可能。入力待ち、スリープ等 |
D (Disk Sleep) | TASK_UNINTERRUPTIBLE | 割り込み不可能。主に短時間で復帰する場合の状態。ディスク入出力待ち |
Z(Zombie) | TASK_ZOMBIE | ゾンビ状態。子プロセスがexitとして親プロセスにリープされるまでの状態 |