Kodama's home / tips.

処理が遅い場合の調査

処理が遅い場合, 問題が, ディスク I/O, CPU能力, ネットワ−ク, メモリ不足, NFS 等のうちどこにあるかが問題になる.(いや,他にもありうるけど) ディスク I/O や ネットワ−クが問題になることが多いと思う.

ネットワ−ク関連では, hosts ファイル や DNS に無登録のマシンだったり, NIS 参照に問題が出ていたり, また, 自分自身でなく NFS サ−バが遅いのが原因の例もあった. 機材の故障やケ−ブル不良で, ネットワ−クに大量のエラ−がでているのが 原因のことも多い. 複数の DNS サ−バを参照しているばあい, DNS サ−バの参照順が適切か考え直してみる.

使用する tool

vmstat, free, top, netstat,tcpdump 等は普通に使えると思う. 負荷のモニタは procmeter が気に入っている. ネットワ−クの状況は IPTraf が分かりやすい.

/proc/loadavg, /proc/meminfo, /proc/stat, /proc/swaps など(Linux kernel 2.4).

ディスク I/O

ディスクI/O を調べてみる. 一見,負荷が,集中していないように見えても, くわしく見ると ディスクが原因であったりする.

実行例
# /sbin/hdparm -t /dev/sda

/dev/sda:
 Timing buffered disk reads:  120 MB in  3.05 seconds =  39.30 MB/sec
bash-3.2# /sbin/hdparm -T /dev/sda

/dev/sda:
 Timing cached reads:   8264 MB in  1.99 seconds = 4143.25 MB/sec

# vmstat 30
 procs                  memory    swap        io    system         cpu
 r b w  swpd  free  buff cache  si  so   bi   bo   in   cs  us  sy  id
 1 0 0 23032   496   432  4700   3   3    6    7  168   70  19   7  74
 1 0 0 20576   980   212  5100  46  13   76    5  358  288  33   8  59
 2 0 0 20576   644   396  5228   2   0    6   11  162  312  27   6  68
 2 0 0 20364   208   100  4732  16   9   93    4  363  349  34  10  56
 1 0 0 21896   388    84  5400  12  55   87   27  432  315  45  12  42

iostat 相当のコマンドは無いのかな? ディスクのサ−ビスの遅延とかを知りたいんだけど...

メモリは足りているか

メモリー不足だと処理が遅くなったり処理できなかったりする.

free または top コマンドで現在のメモリの利用状況を調べる事ができる.

$ free
             total       used       free     shared    buffers     cached
Mem:         22292      21872        420      11128        560       4644
-/+ buffers:            16668       5624
Swap:       120956      22124      98832

上の数値の単位は kbyte. このマシン(僕の愛用 PC)は 約24M byte のメモリを積んでいるが, total=22292 の自由に使えるメモリがある. このうち used=21871 使用し free=420 空き. used=21872 の内 buffers=560, cashed=4644 は 空いているメモリを作業用に転用しているだけなので, free が数百k 程度なのが普通. これを実質的には 空きと考えると, +/-buffers の補正後, used=16668 使い free=5624 空いている事になる.

swap にはみ出していたとしても, それだけでは メモリ不足の証拠にはならない. あまり使わないコ−ドを追い出して cache と buffre に転用しているだけかも知れない.

本当にメモリが逼迫しているかどうか調べるには, vmstat の si と so 欄を見ながら, 実際の作業をやってみる. ある程度の si(swap in) があるのは正常と思う. あまりにも so(swap out)が多いのは メモリ不足の兆候かも知れない. 下の例では, メモリが不足気味.

$ vmstat 30    # 30秒毎にメモリー関連の統計を出力
 procs                  memory    swap        io    system         cpu
 r b w  swpd  free  buff cache  si  so   bi   bo   in   cs  us  sy  id
 1 0 0 23032   496   432  4700   3   3    6    7  168   70  19   7  74
 1 0 0 20576   980   212  5100  46  13   76    5  358  288  33   8  59
 2 0 0 20576   644   396  5228   2   0    6   11  162  312  27   6  68
 2 0 0 20364   208   100  4732  16   9   93    4  363  349  34  10  56
 1 0 0 21896   388    84  5400  12  55   87   27  432  315  45  12  42
 2 0 0 22468   816   144  5452   6  22   22    6  217  155  53   4  42
 2 0 0 22540   416   384  5732   3   3   12   12  160  224  15   3  82

CPU の利用状況

CPU の負荷の状況を示す指数としては "load average" と "CPU利用率" がある.

load average の調べ方

  1. top コマンドを用いる
  2. w コマンドを用いる
  3. vmstat の r 欄
  4. xload : Xの画面で見る事ができる.
  5. xosview : Xの画面で見る事ができる.
  6. procmeter : Xの画面で見る事ができる.

CPU 利用率 の調べ方

  1. vmstat の us sy id の欄を見る. 各々 user の処理時間, system の処理時間, idle 時間の割合.
  2. top コマンドを用いる.
  3. xcpustate : Xの画面で見る事ができる.
  4. xosview : Xの画面で見る事ができる.
  5. procmeter : Xの画面で見る事ができる.

CPU の負荷の基準としては, CPU 利用率よりも load average が役にたつ. CPU の速度と要求される処理速度にもよるが, load average が 4*(CPU数) 以上なら (そして他の要因でなく CPUが問題と確信できるなら) CPU を買足す方がよいかも. ただ, 処理待ちのプロセスが溜る原因が, ディスクや ネットワ−クの IO待ちにある方が多いかも.

vmstat または top の CPU 利用率の user と system の割合に注意. NFS サ−バは別として, system 時間が多すぎるとか load が高いのに CPU が遊んでいるようなら, 入出力とか 割込みとかに問題があるかも.

ネットワーク

ネットワークの入出力が関係すると状況の判断が困難になってくる.

考慮すべき主な要素:

NFS

NFS の性能評価は結構厄介だ. どれかが原因となっていても,処理の遅れから要求が重なって複合した症状になってしまう可能性が高い.

sendmail などネットワークサービスの起動や処理が遅い

/etc/hosts ファイルの自分の項が guppy.kobe-kosen.ac.jp みたいな ドメイン名も含む名でなく 略名(guppy とか) のため(?) sendmail の起動が遅くなった事がある.(ほんと?) hosts に書く場合, 下のように, ip-address に続けて 長い名前, 略名 の順でかくと良いかも.

10.10.10.10 guppy.kobe-kosen.ac.jp guppy

/etc/hosts ファイル, DNS への参照(/etc/resolv.conf), DNS サーバの動作 など.


Kodama's home / tips.