dstatの万能感がハンパない

サーバーのリソースを見るにはグラフ化は重要ですが、推移ではなくリアルタイムな状況、例えば秒単位のスパイキーな負荷を見るには、サーバー上でvmstatやiostatなどの*statファミリーを叩く必要があります。

さて、vmstatはメモリの状況やブロック数単位のI/O状況は見られますが、バイト単位の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
 3  1      0 4724956 355452 726532    0    0    54    484    3     3  1  0 99  0  0
 2  0      0 4737428 355384 720420    0    0  9460  73808 6980 18667 10  1 87  2  0
 3  0      0 4718524 355452 731884    0    0  8832  80508 6639 13714  9  1 89  1  0
 2  0      0 4713248 355512 737528    0    0 11360 204772 9424 19438 10  1 85  4  0
 2  0      0 4710788 355516 739904    0    0  9352  58064 5688 13238  8  1 90  1  0

他方、iostat -dkxではIOPSやバイト単位の値など、I/Oに関する詳細は確認できますが、CPU使用率など他の統計値は同時に見ることができません。

# iostat -dkx /dev/sda 1

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.67   332.17 146.27 338.57  1295.64 11647.60    53.39     0.25    0.52   0.10   4.83

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda              26.00  2901.00 964.00 338.00  9768.00 20560.00    46.59     0.78    0.60   0.17  22.70

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               4.00  2883.00 917.00 791.00  8900.00 41292.00    58.77     0.85    0.50   0.16  26.60

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda              22.00  4393.00 983.00 978.00  9236.00 59608.00    70.21     0.88    0.45   0.15  29.50

mpstat、ifstatもしかりです。


ターミナルを複数上げてvmstatとiostatをそれぞれ実行してもいいのですが、できれば一つのターミナルでいろいろな値を見たい。というわけで、dstatの出番です。

dstatで特徴的なのは、表示する統計情報をオプションで選択できる点です。

例えば、

  • CPUとメモリ関連なら-Tclm
  • ディスクI/O関連(バイト数とI/Oリクエスト数)なら-Tcldr
  • ネットワークI/Oも含めて全部入れなら-Tclmdrn

といった塩梅です。

自分はオプション覚えられないので、↓のようなaliasを当ててます。

alias dstat-full='dstat -Tclmdrn'
alias dstat-mem='dstat -Tclm'
alias dstat-cpu='dstat -Tclr'
alias dstat-net='dstat -Tclnd'
alias dstat-disk='dstat -Tcldr'


他にもユニークな統計情報を見ることができます。

MySQL

PythonのMySQLdbが必要です。

$ export DSTAT_MYSQL_USER=root
$ export DSTAT_MYSQL_PWD=pa55w0rd
$ export DSTAT_MYSQL_HOST=127.0.0.1
$ dstat -T --mysql5-cmds --mysql5-conn --mysql5-io --mysql5-keys
--epoch--- ------mysql5-cmds------ mysql5-co -mysql5-io- ---mysql5-key-status----
  epoch   | sel   ins   upd   del |ThCo %Con| recv  sent|used read writ rreq wreq
1330500331|    0     0     0     0|0.00 0.00|0.02  0.11 |  0    0    0    0    0 
1330500332|    8     0     0     0|4.00 1.60|9796B 59.8k|  0    0    0    0    0 
1330500333|    8     0     0     0|4.00 1.60|9.90k 61.1k|  0    0    0    0    0 
1330500334|    8     0     0     0|4.00 1.60|10.2k 62.5k|  0    0    0    0    0 

MySQL Innodb

mysqlコマンドが/usr/bin/mysqlにある必要があります。

$ export DSTAT_MYSQL='-uroot -ppa55w0rd -h127.0.0.1'
$ dstat -T --innodb-io --innodb-buffer --innodb-ops
--epoch--- innodb-io-o innodb-pool ---innodb-ops--
  epoch   |rea wri syn|crt rea wri|ins upd del rea
1330500814|  0   0   0|0.2 1.0  11|  0   0   0   0
1330500815|  0   0   0|3.0 1.0 139|  0   0   0   0
1330500816|  0   0   0|3.0 5.0 172|  0   0   0   0
1330500817|  0   0   0|5.0 5.0 133|  0   0   0   0

最も{CPUを使っている,I/Oしている}プロセス

top-cpu-adv, top-bio, top-ioは最近のkernel(vanilla kernelですと2.6.20以上)が必要です。

$ dstat --top-cpu --top-cputime
-most-expensive- --highest-total--
  cpu process   | cputime process 
X            0.0|X             910
bash          25|bash         1000
bash          25|bash         1000
bash          25|bash         1000

$ dstat --top-cpu-adv
-------most-expensive-cpu-process-------
process              pid  cpu read write
X                    128150.0%   0    0 
bash                 13522 25%   0    0 
bash                 13522 25%   0    0 
bash                 13522 25%   0    0 
bash                 13522 25%   0    0 
$ dstat --top-io --top-bio
----most-expensive---- ----most-expensive----
     i/o process      |  block i/o process   
bash       6593B 6508B|bash          2B 6394B
dd          366M  366M|dd            0   366M
dd          360M  360M|dd            0   360M
dd          287M  287M|dd            0   287M
dd          237M  237M|dd            0   237M
$ dstat --top-io-adv --top-bio-adv
-------most-expensive-i/o-process------- ----most-expensive-block-i/o-process----
process              pid  read write cpu|process              pid  read write cpu
dd                   771    19k  19k0.0%|dd                   771     0   19k0.0%
dd                   771   214M 214M 16%|dd                   771     0  214M 16%
dd                   771   216M 216M 16%|dd                   771     0  216M 16%
dd                   771   211M 211M 16%|dd                   771     0  211M 16%

また、dstatはPythonで書かれているので、ぺろっと置くだけですぐに使えますし、先に見た--mysql5-cmdや--top-bioなどもそうなのですが、Pythonでプラグインを書けば好きな統計値をdstatで表示できるようにできる点もよいですね。

追記 2012-02-29

id:sh2 さんのブコメより、--output FILENAMEすると、通常通り画面には表示しつつ、CSV形式でファイルに落とすことができます。これは便利すね!!