サーバの負荷を調べるコマンド集その2:ディスクI/O、ネットワークI/Oの確認

サーバの負荷を確認する、サーバの負荷を調べるコマンド集その1の続きです。

ディスクI/Oの確認:sar、dstat

ディスクI/Oがどうであるか、一番手っ取り早いのがsarです。

$ sar
 Linux 2.6.32-220.7.1.el6.x86_64 (feanor.localdomain)     2012年07月07日     _x86_64_    (2 CPU)

 00時00分01秒       CPU     %user     %nice   %system   %iowait    %steal     %idle
 00時10分01秒       all     12.29      0.00      4.91      0.14      0.00     82.66
 00時20分01秒       all      6.21      0.00      4.16      0.04      0.00     89.59

「%iowait」の数値が他と比べて大きければ、ディスクI/Oに引きずられている可能性が高いです。時系列に並ぶので、どの時刻から上がっているか、定期バッチ処理が契機の時などはわかりやすいです。

契機がなく定常的に負荷が高い場合、現在どのプロセスが高いかを確認します。「dstat -al –top-bio」です。

$ dstat -al --top-bio
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system-- ---load-avg--- ----most-expensive----
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw | 1m   5m  15m |  block i/o process   
 29   4  50  16   0   2| 914k 1994k|   0     0 | 210B   84B| 104  9732 |1.19 1.28 1.32|init [3]    173k 2032k
 13   4  49  33   0   3|1504k  164k|1068k 2282k|   0     0 |8212    13k|1.19 1.28 1.32|nfsd        324k    0
 13   3  76   5   0   2|1852k  100k|1669k 4248k|   0     0 |7286    11k|1.10 1.26 1.31|nfsd        304k    0
 29   8  44  14   1   5|1928k   84k|1444k 4733k|   0     0 |  13k   20k|1.10 1.26 1.31|nfsd        316k    0
 28   6  45  18   0   5| 272k  148k|1643k 3038k|   0     0 |  12k   19k|1.10 1.26 1.31|nfsd        104k    0

コマンドがない場合は、centosの場合はepel導入後「yum install dstat」で幸せになれます。
vmstatのように、1秒ごとに1行ずつ表示されていきます。最初の1・2行は表示がなんだかおかしいのですが、3行目あたりから見ると安定します。
見るべきは一番右の「block i/o process」で、これに出てくるプロセスがそのタイミングで一番I/O負荷をかけているプロセスです。これでいうとnfsdをなんとかしてやろう、ということになります。

ネットワークI/Oの確認:dstat

ネットワークI/Oの負荷が問題になる場合はzabbix等の監視ソフトが導入されている場合が多いのでコマンドで頑張るシーンはあまりないとは思いますが、dstatの「net/total」の欄がネットワークの通信量になります。これが回線契約の上限値にはりつきっぱなしになっているなどあれば、ネットワークの見直しが必要になります。

ネットワークを使っているプロセスが特定できずに困ったという経験がないためプロセスを特定するちょうど良いコマンドは知らないのですが、ネットワークだけを使うというのはルータでもない限りあまり考えられないので、topなどでCPUなりを使っているプロセスを特定するとだいたい特定できます。

さいごに

緊急対応の場合はアプリケーションの特性であるなどを知っておかないと迅速な対応はできないので上記コマンドだけでは難しいものがありますが、普段からずっと重いなどの場合はこれらのコマンドでおおよそ原因プロセスを特定できています。プロセスを特定できれば「どこから手を付ければいいかわからない」ということにならず、「これこれを改善すれば効果が期待できる」と言い切りやすい状態になると思います。