単独のサーバーの「負荷」の正体を突き止める

指標を読む

ロードアベレージ
# uptime
 15:40:33 up 357 days, 22:34,  2 users,  load average: 0.19, 0.17, 0.12
コマンド
uptime。load averageに続く3つの数字が過去1分間、5分間、15分間の平均値を表します。
意味
処理を実行したいが、なにかしらの要因で実行を待たされているプロセスの数を表します。したがって、ロードアベレージが高い状態とは多くのプロセスが処理を実行できずに待たされている状態、ということになります。
解釈
なにかしらの要因としては「ほかのプロセスにCPUが使われていて、空くのを待っている状態」と「ディスクに読み書き要求を発行していて、その結果を待っている状態」の二種類が考えられます。前者は「CPU使用率」、後者は「I/O待ち率」として数値化することができます。ロードアベレージを見ただけでは原因を切り分けることはできないため、次にCPU負荷が高いのか、I/O負荷が高いのかの切り分けに進むことになります。一方、ロードアベレージが低い(のにスループットが上がらない)場合は、ネットワーク的な要因(パケットロスなど)を疑うことになります。


CPU使用率
# sar
Linux 2.6.18-194.32.1.el5 (rm21881198) 	2012年01月05日

00時00分01秒       CPU     %user     %nice   %system   %iowait    %steal     %idle
00時10分01秒       all      1.73      0.01      0.35      0.72      0.00     97.19
00時20分01秒       all      1.73      0.01      0.33      0.82      0.00     97.11
00時30分01秒       all      1.62      0.01      0.35      0.85      0.00     97.17
00時40分01秒       all      1.55      0.01      0.34      0.88      0.00     97.22
00時50分01秒       all      1.15      0.01      0.28      0.54      0.00     98.02
コマンド
sar
意味
%userがユーザー空間でCPUが使われた時間の割合、%systemがシステム空間でCPUが使われた時間の割合を表します。割合は百分率です。
解釈
%userが高い場合は、ユーザー空間のプロセスがCPUを消費しています。よくある要因としては「純粋にCPUパワーが必要な処理(数値計算、画像や動画の変換など)を行っている」ことや「意図しない暴走でCPUを消費している」ことが考えられます。前者はCPUをより高性能なものに交換したり、アルゴリズムを見直して処理効率を改善するといった対策が考えられます。後者は原因を突き止めて暴走を停止する必要があります。一方、%systemが高い場合は、システム空間のプロセスがCPUを消費しています。よくある要因としては「I/O待ちでCPU時間を消費している」ことや「大きめのプロセスを頻繁にforkしている」ことが考えられます。


I/O待ち率
コマンド
sar
意味
%iowaitがCPUがディスクI/Oの結果を待っていた時間の割合を表します。
解釈
%iowaitと%systemがともに高い場合は、readやwriteの応答を待ってI/O待ちが発生しています。これは、I/O待ちが発生するとreadやwriteのシステムコールに要する時間も増えるため、%systemも上昇するためです。逆に、%iowaitが高いにもかかわらず%systemが低い場合は、物理メモリ量を超えてメモリを使ってしまい、スワップが大量に発生している可能性があります。この場合は、sar -Wコマンドでスワップ頻度を、freeコマンドでメモリ使用状況を、topコマンドをメモリ使用率でソートしてメモリを消費しているプロセスを確認します。


スワップ頻度
# sar -W
Linux 2.6.18-194.32.1.el5 (rm21881198) 	2012年01月05日

00時00分01秒  pswpin/s pswpout/s
00時10分01秒      0.00      0.00
00時20分01秒      0.00      0.00
00時30分01秒      0.00      0.00
00時40分01秒      0.00      0.00
00時50分01秒      0.00      0.00
コマンド
sar -W


メモリ使用状況
# free
             total       used       free     shared    buffers     cached
Mem:      24660136   24534520     125616          0     236268   10033728
-/+ buffers/cache:   14264524   10395612
Swap:     50331636        152   50331484
コマンド
free


プロセス毎のメモリ使用率
# top
top - 15:50:42 up 357 days, 22:44,  2 users,  load average: 0.20, 0.17, 0.12
Tasks: 163 total,   1 running, 162 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.2%us,  0.2%sy,  0.0%ni, 97.0%id,  1.5%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  24660136k total, 24531064k used,   129072k free,   236352k buffers
Swap: 50331636k total,      152k used, 50331484k free, 10030204k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                              
 6516 mysql     15   0 13.9g  13g 5932 S 11.0 56.0  96039:24 mysqld                               
 3391 root      15   0  154m 8116 4100 S  0.0  0.0  22:33.12 snmpd                                
32292 ntp       15   0 19832 5528 4424 S  0.0  0.0   0:00.02 ntpd                                 
 3513 named     19   0  283m 4656 1996 S  0.0  0.0   0:20.97 named                                
 3234 haldaemo  15   0 31196 4364 1680 S  0.0  0.0   0:05.80 hald                                 
コマンド
top



原因プロセスを特定する

# ps -lp 6516
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S    27  6516  5984 22  75   0 - 3640236 725761 ?      66-16:48:21 mysqld

CPU使用率が高い場合は、topコマンドをCPU使用率でソートしてCPUを消費しているプロセスのPIDを確認し、psでプロセスの情報を表示します。STATが「R」であれば、「実行中または実行可能(だけど実行待ち)」なので、そのプロセスが原因の可能性が高いと判断できます。

I/O使用率が高い場合は、topコマンドをCPU使用率(%systemが高い場合)やメモリ使用率(%systemが低い場合)でソートしてプロセスのPIDを確認し、psでプロセスの情報を表示します。STATが「D」であれば、「割り込み不可能な待機状態(普通はI/O)」なので、そのプロセスが原因の可能性が高いと判断できます。

topコマンドの操作コマンド

M メモリ使用量が多いもの順
N プロセスID順
P CPUの使用時間率の長いもの順
R ソート順の逆転
T 実行時間が長い順
q topコマンドの終了
s 表示の更新間隔(単位は秒)
u 特定のユーザー権限のプロセスだけ

psコマンドのSTAT(ステータス)

PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers
(header "STAT" or "S") will display to describe the state of a process.
D    Uninterruptible sleep (usually IO)
R    Running or runnable (on run queue)
S    Interruptible sleep (waiting for an event to complete)
T    Stopped, either by a job control signal or because it is being traced.
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    Defunct ("zombie") process, terminated but not reaped by its parent.

For BSD formats and when the stat keyword is used, additional characters may be
displayed:
<    high-priority (not nice to other users)
N    low-priority (nice to other users)
L    has pages locked into memory (for real-time and custom IO)
s    is a session leader
l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+    is in the foreground process group



ロードアベレージを知る

おなじみのtopコマンドは右上にロードアベレージを表示します。

# top
top - 18:52:32 up 80 days, 15 min,  1 user,  load average: 0.58, 0.78, 0.88
Tasks: 164 total,   1 running, 163 sleeping,   0 stopped,   0 zombie
Cpu(s):  4.2%us,  0.2%sy,  0.0%ni, 95.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  24659372k total, 11901752k used, 12757620k free,   302260k buffers
Swap: 50331636k total,        0k used, 50331636k free,  8835812k cached

/proc/loadavgは左から1分間、5分間、15分間の平均値、4番目が現在実行しているプロセス数/総プロセス数、5番目が最後に使用されたプロセスIDを意味します。

# cat /proc/loadavg 
1.16 0.91 0.91 3/527 28107



sarコマンドで統計情報を知る
sar -u CPU使用率を表示する
sar -b ディスクI/Oの使用状況を表示する
sar -W スワップ頻度を表示する
sar -q ロードアベレージやrunqの大きさを表示する
sar -r メモリの使用状況を表示する
sar -P {0, 1, ... | ALL} プロセッサごとに統計値を表示する
sar -f /var/log/sa/sann 日付を指定して過去の統計情報を表示する
sar -A すべての情報を表示する
# sar -u
Linux 2.6.18-274.3.1.el5 (rm25221198) 	2012年01月05日

00時00分01秒       CPU     %user     %nice   %system   %iowait    %steal     %idle
00時10分01秒       all     13.13      0.01      0.28      0.05      0.00     86.54
00時20分01秒       all     12.43      0.01      0.26      0.05      0.00     87.25
00時30分01秒       all     17.87      0.01      0.28      0.06      0.00     81.79
00時40分01秒       all     15.84      0.01      0.27      0.06      0.00     83.83
00時50分01秒       all     13.58      0.01      0.43      0.05      0.00     85.93
# sar -b
Linux 2.6.18-194.32.1.el5 (rm21881198) 	2012年01月05日

00時00分01秒       tps      rtps      wtps   bread/s   bwrtn/s
00時10分01秒    161.93     16.75    145.17    534.30   6523.02
00時20分01秒    159.18     16.17    143.01    515.57   6404.59
00時30分01秒    160.00     18.54    141.46    591.59   6130.04
00時40分01秒    141.71     12.19    129.51    388.39   5485.18
00時50分01秒    132.08     10.21    121.87    325.98   5407.91
# sar -W
Linux 2.6.18-274.3.1.el5 (rm25221198) 	2012年01月05日

00時00分01秒  pswpin/s pswpout/s
00時10分01秒      0.00      0.00
00時20分01秒      0.00      0.00
00時30分01秒      0.00      0.00
00時40分01秒      0.00      0.00
00時50分01秒      0.00      0.00
# sar -q
Linux 2.6.18-274.3.1.el5 (rm25221198) 	2012年01月05日

00時00分01秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
00時10分01秒         4       726      0.51      0.91      1.15
00時20分01秒         4       755      1.50      1.05      1.06
00時30分01秒         1       755      1.06      1.31      1.24
00時40分01秒         0       333      1.60      1.42      1.29
00時50分01秒         0       523      1.19      1.10      1.15
# sar -r
Linux 2.6.18-274.3.1.el5 (rm25221198) 	2012年01月05日

00時00分01秒 kbmemfree kbmemused  %memused kbbuffers  kbcached kbswpfree kbswpused  %swpused  kbswpcad
00時10分01秒  13167640  11491732     46.60    301488   8467272  50331636         0      0.00         0
00時20分01秒  13157192  11502180     46.64    301492   8475636  50331636         0      0.00         0
00時30分01秒  13145024  11514348     46.69    301504   8486788  50331636         0      0.00         0
00時40分01秒  13150916  11508456     46.67    301516   8497012  50331636         0      0.00         0
00時50分01秒  13134316  11525056     46.74    301540   8505956  50331636         0      0.00         0
# sar -P ALL
Linux 2.6.18-274.3.1.el5 (rm25221198) 	2012年01月05日

00時00分01秒       CPU     %user     %nice   %system   %iowait    %steal     %idle
00時10分01秒       all     13.13      0.01      0.28      0.05      0.00     86.54
00時10分01秒         0      4.74      0.00      0.12      0.32      0.00     94.81
00時10分01秒         1     15.49      0.01      0.34      0.01      0.00     84.15
00時10分01秒         2     17.32      0.01      0.23      0.01      0.00     82.44
00時10分01秒         3     16.47      0.01      0.36      0.01      0.00     83.15
00時10分01秒         4      6.41      0.00      0.30      0.07      0.00     93.23
00時10分01秒         5     21.23      0.01      0.32      0.01      0.00     78.44
00時10分01秒         6      3.97      0.01      0.24      0.00      0.00     95.79
00時10分01秒         7     19.39      0.01      0.32      0.00      0.00     80.28
...
平均値:        CPU     %user     %nice   %system   %iowait    %steal     %idle
平均値:        all      9.13      0.01      0.21      0.04      0.00     90.61
平均値:          0      3.28      0.00      0.10      0.20      0.00     96.42
平均値:          1     11.85      0.01      0.28      0.01      0.00     87.85
平均値:          2     11.65      0.01      0.18      0.00      0.00     88.16
平均値:          3     11.98      0.01      0.28      0.00      0.00     87.72
平均値:          4      3.07      0.00      0.15      0.09      0.00     96.69
平均値:          5     14.50      0.01      0.25      0.00      0.00     85.23
平均値:          6      2.35      0.01      0.20      0.00      0.00     97.44
平均値:          7     14.37      0.01      0.28      0.00      0.00     85.34
# sar -f /var/log/sa/sa28
Linux 2.6.18-274.3.1.el5 (rm25221198) 	2011年12月28日

00時00分01秒       CPU     %user     %nice   %system   %iowait    %steal     %idle
00時10分01秒       all      5.42      0.01      0.21      0.04      0.00     94.33
00時20分01秒       all      6.49      0.01      0.20      0.04      0.00     93.26
00時30分01秒       all      5.63      0.01      0.18      0.04      0.00     94.14
00時40分01秒       all      5.51      0.01      0.18      0.04      0.00     94.26
00時50分01秒       all      5.27      0.01      0.17      0.04      0.00     94.51