mutao.net

いわゆる雑記。

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の算出処理はカーネルのコードのこの辺りから追える。

github.com

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待ち率が判明したら各プロセスからボトルネックを見つけていく。

mutaonet.hatenablog.com

以前の記事で書いてある通り、プロセスの状態は以下の通り。

$ 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として親プロセスにリープされるまでの状態