2010年8月16日月曜日

サーバリソース(resource)最速確認ポイント



サーバのリソースでボトルネックになっている部分を把握するためには
どこをどう確認すればいいのか。
最低限ここを見ればいいというポイントをまとめておく。



◆ ロードアベレージを確認する
$ uptime
 09:00:00 up 100 days, 00:00,  1 user,  load average: 2.61, 3.10, 3.30

ロードアベレージ数は左から1分、5分、15分間の平均値で表示される。



◆ リアルタイムにCPU、メモリの利用率とそれを利用しているプロセスを特定する
$ top
top - 09:00:00 up 100 days, 00:00,  1 user,  load average: 2.61, 3.10, 3.30
Tasks: 239 total,   2 running, 236 sleeping,   0 stopped,   1 zombie
Cpu0  :  5.2%us, 0.7%sy, 0.0%ni, 73.8%id, 20.0%wa, 0.0%hi, 0.2%si, 0.0%st
Cpu1  : 20.1%us, 1.7%sy, 0.0%ni, 54.8%id, 22.7%wa, 0.0%hi, 0.6%si, 0.0%st
Cpu2  :  2.1%us, 0.5%sy, 0.0%ni, 91.3%id,  5.9%wa, 0.0%hi, 0.1%si, 0.0%st

  PID USER  PR NI  VIRT  RES  SHR S %CPU %MEM  TIME+ COMMAND
26258 user1 17  0 2237m 1.7g 6632 R 25.9 16.9 527:37 cmd1
19166 user2 16  0 2357m 1.7g 6664 S 23.6 17.5 574:20 cmd2

"1"を押すと全プロセッサ(CPU)が表示される。
"shift+p"で%CPU行でソートできる。
"shift+m"で%MEM行でソートできる。
プロセス状態を表すS行にも注目すること。
タスクの状態は以下のいずれかである。

"D" = 割り込み不可能なスリープ状態
"R" = 実行中
"S" = スリープ状態
"T" = トレース中/停止された
"Z" = ゾンビ

"D"の状態が続く場合は要注意である。
プロセスがIO処理待ち状態になっている可能性がある。



◆ CPUのステータスを確認する。
$ mpstat -P ALL
09:00:00 CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
09:00:00 all  5.39  0.00 0.90   10.58 0.01  0.22   0.00 82.91 533.08
09:00:00   0  5.24  0.01 0.74   19.98 0.00  0.18   0.00 73.84 246.11
09:00:00   1 20.14  0.00 1.74   22.70 0.04  0.59   0.00 54.78 266.01
09:00:00   2  2.14  0.01 0.50    5.91 0.00  0.13   0.00 91.32 174.10

あわせて、iowaitも注目して見ておくこと。
iowaitは、CPUがアイドル状態で、システムに未処理のディスク入出力要求が
あった時間の割合を意味する。
一点注意が必要である。
ネットーワークI/O待ちはiowaitではなく、idle扱いになる。

また下記の計算式が成り立つ。
%user + %sys + % iowait + %idle = 100%



◆ IOのステータスを確認する
$ iostat -x 10
avg-cpu:  %user   %nice    %sys %iowait   %idle
          20.31    0.00    7.93    1.19   70.57
Device: rrqm/s wrqm/s  r/s  w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda       0.60  76.60 0.10 3.00   5.63  58.59   2.81 29.30     4.90    0.00  0.09 0.00  0.00
sda1      0.00   0.00 0.00 0.00   0.00   0.01   0.00  0.00     2.84    0.00  1.43 0.97  0.00
sda2      0.19   0.47 0.02 0.05   1.72   4.21   0.86  2.10    78.66    0.00 19.98 3.98  0.03

2つのIOレスポンス値に注目する。
await:デバイスへのIOリクエストの平均待ち時間(ms)。キューにいる時間+処理時間
svctm:デバイスへのIOリクエストの平均処理時間(ms)
※当然awaitの方が大きな値になる。

IOPS(秒間のIOリクエスト数)にも注目する。
IOPS = r/s + w/s である。



◆ swapの発生状況を確認する。
$ vmstat 10
procs -----------memory---------- -swap- --io-- --system- -----cpu------
 r  b   swpd   free   buff  cache  si so bi bo  in cs     us sy id wa s
 2  2      0  36808 434172 5436128  0  0  1  6 112 52      5  1 83 11 0

swapが使われていることを確認するのではない。
頻繁にディスクからスワップイン(si)、またディスクにスワップアウト(so)しているかどうかを確認する。
swapとは何かについてこちらにまとめている。

inは割り込み回数である。
vmstatでは割り込みの合計回数しか確認できないが、/proc/interrupts から
内訳を確認することが可能である。

csはコンテキストスイッチの回数である。
csが数千の水準になっていれば、カーネル内部の処理オーバーヘッドが大きくなるはずである。usは小さいのに、syが増えるといった状況だ。
ただし、CPUコアあたりの数値なので、多数のコアを搭載しているマシンでは、例えば16コアだと10万程度までいくことはある。



◆ メモリの状況を確認する
$ free
             total         used        free    shared     buffers      cached
Mem:      10259640 A   10230080 B     29560 C       0 D    435368 E   5440144 F
-/+ buffers/cache:      4354568 G   5905072 H
Swap:     13109032 I        488 J  13108544 K

A = B + C
H = C + D + E + F
G = B - D - E - F
I = J + K


◆ プロセスごとのリソース消費を確認する
プロセスごとに利用しているリソースを確認するにはpidstatが便利である。
pidstat自体はsysstatの機能なので、負荷はsysstatと同じでほぼかからない。

$ pidstat -u -p <PID> 1 3600  ※1 3600は1秒間隔で3600回

$ pidstat -w -p <PID> 1 3600

$ pidstat -r -p <PID> 1 3600

-u: Report CPU utilization.
-w: Report task switching activity 
-r: Report page faults and memory utilization
-p: pid(pid is the process identification number)


どのシステムコールがどれくらい来ているのかを知るためにperfコマンドも使えるだろうか。