「なんだかサーバーが重いな...」 と思った時の負荷調査チャート。
top(1), ps(1), netstat(8) などの標準的なツールを使用します。
ロードアベレージとは実行待ちジョブの平均数です。数値が高ければ高いほど処理が詰まっているということです。
top コマンドの1行目の右端に表示されます。
$ top
top - 10:39:09 up 2 days, 2:11, 2 users, load average: 0.35, 0.45, 0.28
...
左から過去1分間、5分間、15分間の平均値となります。
- ロードアベレージが 低い 場合は 2. ネットワークが原因? へ。
- ロードアベレージが 高い 場合は 3. CPU使用率を確認 へ。
パケットロスなどが疑われます。
netstat -i コマンドなどで確認してみましょう。
netstat -i コマンドの結果表示のRXは受信、TXは送信・転送関連の統計値です。左から正常、エラー、破棄、オーバーロードパケット数となります。
$ netstat -i
Kernel Interface table
Iface(1) MTU(2) Met(3) RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 0 32110 0 0 0 962 0 0 0 BRU
eth1 1500 0 0 0 0 0 541 0 0 0 BRU
lo 3924 0 6080 0 0 0 6080 0 0 0 LRU
スイッチのポートをモニタリングしてみましょう。
topの3行目がCPU使用率です。
Cpu(s): 1.0% us, 0.3% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si
ここで注目すべきはus、sy、waの3つです。
-
us
ユーザー空間でCPUが使われた時間の割合。
I/O待ちなどのボトルネックがなく、数値計算や画像変換など、純粋にCPUパワーが必要な処理を行なっている状態。
-
sy
カーネル空間でCPUが使われた時間の割合。
I/O待ちでCPU時間を消費したり、大きいプロセスを高頻度でforkしている状態。
-
wa
CPUがディスクのI/O待ちをしていた時間の割合。
read/writeなどの応答待ちをしている状態。
これらの値を確認して次のような判断をします。
- usが高い場合は 4. CPUを浪費しているプロセスを探しましょう へ。
- syが高い場合は 5. I/O待ちか高頻度でforkしてるかと へ。
- usもsyも低く、waが高い場合は 6. スワップが発生してるかも へ。
topをCPU使用率でソートしてCPU使用率が高いプロセスを見つけます。(Shift-Oでソートメニュー表示)
プロセス番号を控えてpsコマンドで状態(STAT)を確認します。
- 「R」の場合は「実行中もしくは実行可能だけどCPUに空きがないため実行できない状態」です。
- 「D」の場合は「割り込み不可能な待機状態。大抵I/O待ち状態」です。
原因と思われるプロセスは見つかりましたか?
syと併せてwaも確認します。
waが高い場合はI/O待ちが原因となります。
vmstatでI/O待ちの状況を確認してみましょう。
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 228896 61828 40804 0 0 92 48 101 56 0 7 92 1 0
2 0 0 5656 61808 261540 0 0 0 207668 2700 1048 0 100 0 0 0
1 1 0 6268 61808 260580 0 0 188 263768 3161 1607 1 99 0 0 0
2 1 0 5648 61812 261636 0 0 188 248708 3018 1455 1 99 0 0 0
0 2 0 6128 61848 258920 0 0 36 85584 761 390 1 24 0 75 0
0 1 0 6252 61848 258760 0 0 0 15360 163 51 0 2 0 98 0
0 3 0 6484 61852 258428 0 0 0 15364 241 152 0 10 0 90 0
0 3 0 6732 61852 258408 0 0 0 15408 172 58 0 2 0 98 0
1 2 0 5988 61852 259328 0 0 0 20480 208 96 0 7 0 93 0
b の数値がI/O待ちのプロセス数です。b の数値が高いときに wa の数値も高くなっていますね。
メモリを大量に消費しているプロセスがあってスワップが発生しているかもしれません。
topでmを押すとシステムのメモリとスワップの使用状況がトグルします。まずはこれで確認します。
Mem: 1034348k total, 709724k used, 324624k free, 10640k buffers
Swap: 1748984k total, 6000k used, 1742984k free, 552664k cached
スワップが発生している場合はメモリ使用率でソートしてプロセスを特定しましょう。
原因と思われるプロセスは見つかりましたか?
しっかりと対処しましょう。