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で表示できるようにできる点もよいですね。