dstat - versatile tool for generating system resource statistics
背景
mpstatやらvmstatやらでリソース監視をやっていたらターミナルの数が無限に増えていくのに嫌気がさした。
ちょっと調べてみるとdstatというコマンドがいろいろ見れて便利って聞いたので紹介してみます。
dstatとは
dstatとは簡単に説明するとCPU負荷をコアごと、IO負荷をディスクごと、ネットワーク転送量をインターフェイスごとに表示できるコマンド。
topやiostat,netstatを使って監視しているリソースがコマンド一つで監視できます。
GitHubにてソースは公開されています。言語はPython
dagwieers/dstat
公式サイト
http://dag.wiee.rs/home-made/dstat/
インストール
$ sudo apt install -y dstat
$ sudo yum istall -y dstat
# GitHubからも取ってこれます(Pythonの必要なパッケージは自前で用意する必要あり)。
$ git clone https://github.com/dagwieers/dstat.git
$ cd dstat/
$ ./dstat
# バージョン確認
$ dstat -V
Dstat 0.7.3
Written by Dag Wieers <dag@wieers.com>
Homepage at http://dag.wieers.com/home-made/dstat/
使ってみる
インストールしたら何も考えずにdstatと打つだけでvmstatのようにリソース使用量が表示されます。
出力を停止するにはCtrl+Cを押します。
オプション概要
-
-t … 時間を表示
-
-c … CPU使用時間の割合を表示
- usr … ユーザ空間で使われたCPU使用時間の割合
- sys … システム空間で使われたCPU仕様時間の割合
- idl … アイドル状態のCPU時間の割合
- wai … 応答の待ち状態にあったCPU時間の割合
- hiq … ハードウェア割り込み処理に使われたCPU時間の割合
- siq … ソフトウェア割り込み処理に使われたCPU時間の割合
-
-m … メモリの状態を表示
- used … 物理メモリ全体での使用容量
- buff … バッファキャッシュで使っているメモリ使用容量
- cach … ページキャッシュからバッファキャッシュを引いたメモリ使用容量
- free … 未使用のメモリ使用容量
-
–vm … バーチャルメモリの利用状態を表示
- majpf … 物理メモリ上に該当データがロードされなかった回数
- minpf … 物理メモリに該当データがロードされた回数
- alloc … 空きメモリを探して割り当てた回数
- free … メモリを解放した回数
-
-s … スワップの利用状態を表示
- used … スワップ全体での使用容量
- free … 未使用のスワップ容量
-
-g … ページの入出力数を表示
- in … ディスクからメモリに読み込んだバイト数
- out … メモリ不足時にディスクに書き出したバイト数
-
-d … ディスクの状態を表示
- read … ディスクの読み込みバイト数
- writ … ディスクの書き込みバイト数
-
-r … ディスクへの読み書きリクエスト数(IOPS)
- read … ディスクの読み込みリクエスト数
- writ … ディスクの書き込みリクエスト数
-
-i … 割り込み処理の状態を表示
- interrupts … 実行待ちのプロセス数
-
-l … ロードアベレージの状態を表示
- 1m … 1分平均でのCPU時間の利用割合
- 5m … 5分平均でのCPU時間の利用割合
- 15m … 15分平均でのCPU時間の利用割合
-
-p … プロセスの状態を表示
- run … 実行中プロセス数
- blk … ブロック中のプロセス数
- new … 新しく実行されたプロセス数
-
-y … システム状態を表示
- int … 割り込み回数
- csw … コンテキストスイッチの回数
-
–lock … ファイルロックの状態を表示
- pos … posixロック数
- lck … flockロック数
- rea … 読み込みロック数
- wri … 書き込みロック数
-
-n … ネットワーク状態を表示
- recv … ネットワーク全体の受信データ量
- send … ネットワーク全体の送信データ量
-
–ipc … プロセス間通信の状態を表示
- msg … メッセージキュー
- sem … セマフォ
- shm … 共有メモリセグメント
-
–unix … UNIXドメインソケットの状態を表示
- dgm … Datagram通信の件数
- str … Stream通信の件数
- lis … listenな通信の件数
- act … activeな通信の件数
-
–tcp … TCP通信のバイト数を表示
- lis … 待ちうけ状態の数
- act … ACTIVE状態の数
- syn … SYN状態の数
- tim … TIME_WAIT状態の数
- clo … CLOSE状態の数
-
–udp … UDP通信のバイト数を表示
- lis … 待ちうけ状態の数
- act … ACTIVE状態の数
-
--float 小数点も含めて表示する
-
--noheaders ヘッダ表示を一回だけにします
自分で使いたいものをオプションで指定した順番で表示されます。
以下に使用例を記載します。
ネットワークやディスク状態いろいろ
$ dstat -Tclmdrn
--epoch--- --total-cpu-usage-- ---load-avg--- ------memory-usage----- -dsk/total- --io/total- -net/total-
epoch |usr sys idl wai stl| 1m 5m 15m | used free buff cach| read writ| read writ| recv send
1548760630| 2 3 93 3 0|0.92 1.91 2.14|1613M 71.1M 13.4M 180M|1178k 415k|97.8 46.6 | 0 0
1548760631| 2 7 86 5 0|0.92 1.91 2.14|1613M 69.4M 13.7M 182M|2304k 140k| 313 22.0 | 0 0
1548760632| 5 4 90 1 0|0.92 1.91 2.14|1613M 69.3M 13.7M 182M| 20k 64k|5.00 11.0 |2628B 1490
CPUとメモリ関連をとりあえず
$ dstat -Tclm
--epoch--- --total-cpu-usage-- ---load-avg--- ------memory-usage-----
epoch |usr sys idl wai stl| 1m 5m 15m | used free buff cach
1548760014| 2 3 93 3 0|0.95 2.01 2.11|1618M 61.9M 12.3M 181M
1548760015| 3 13 82 2 0|0.95 2.01 2.11|1616M 81.6M 12.0M 167M
CPUの使用率をコアごとに見る
$ dstat -c -C 0,1,total
-----cpu0-usage----------cpu1-usage-------total-cpu-usage--
usr sys idl wai stl:usr sys idl wai stl:usr sys idl wai stl
1 3 93 3 0: 2 3 92 3 0: 2 3 93 3 0
10 30 3 56 0: 20 25 0 56 0: 15 27 2 56 0
実行結果をログをファイルへ出力する
$ dstat --output dstat.csv
プラグイン
dstatパッケージをインストールすると、「/usr/share/dstat」ディレクトリに大量のPythonスクリプトがコピーされます。このスクリプトがdstatのプラグインです。
このディレクトリに自分でプラグインを追加することもできます。
また--list
オプションを指定することでも見ることができます。
$ cd /usr/share/dstat
$ ls *.py
dstat.py dstat_gpfs.py dstat_nfs3.py dstat_snmp_net_err.py dstat_top_oom.py
dstat_battery.py dstat_gpfs_ops.py dstat_nfs3_ops.py dstat_snmp_sys.py dstat_utmp.py
dstat_battery_remain.py dstat_helloworld.py dstat_nfsd3.py dstat_snooze.py dstat_vm_cpu.py
dstat_condor_queue.py dstat_innodb_buffer.py dstat_nfsd3_ops.py dstat_squid.py dstat_vm_mem.py
dstat_cpufreq.py dstat_innodb_io.py dstat_nfsd4_ops.py dstat_test.py dstat_vm_mem_adv.py
dstat_dbus.py dstat_innodb_ops.py dstat_nfsstat4.py dstat_thermal.py dstat_vmk_hba.py
dstat_disk_avgqu.py dstat_lustre.py dstat_ntp.py dstat_top_bio.py dstat_vmk_int.py
dstat_disk_avgrq.py dstat_md_status.py dstat_postfix.py dstat_top_bio_adv.py dstat_vmk_nic.py
dstat_disk_svctm.py dstat_memcache_hits.py dstat_power.py dstat_top_childwait.py dstat_vz_cpu.py
dstat_disk_tps.py dstat_mysql5_cmds.py dstat_proc_count.py dstat_top_cpu.py dstat_vz_io.py
dstat_disk_util.py dstat_mysql5_conn.py dstat_qmail.py dstat_top_cpu_adv.py dstat_vz_ubc.py
dstat_disk_wait.py dstat_mysql5_innodb.py dstat_redis.py dstat_top_cputime.py dstat_wifi.py
dstat_dstat.py dstat_mysql5_innodb_basic.py dstat_rpc.py dstat_top_cputime_avg.py dstat_zfs_arc.py
dstat_dstat_cpu.py dstat_mysql5_innodb_extra.py dstat_rpcd.py dstat_top_int.py dstat_zfs_l2arc.py
dstat_dstat_ctxt.py dstat_mysql5_io.py dstat_sendmail.py dstat_top_io.py dstat_zfs_zil.py
dstat_dstat_mem.py dstat_mysql5_keys.py dstat_snmp_cpu.py dstat_top_io_adv.py
dstat_fan.py dstat_mysql_io.py dstat_snmp_load.py dstat_top_latency.py
dstat_freespace.py dstat_mysql_keys.py dstat_snmp_mem.py dstat_top_latency_avg.py
dstat_fuse.py dstat_net_packets.py dstat_snmp_net.py dstat_top_mem.py
dstat --list
internal:
aio, cpu, cpu-adv, cpu-use, cpu24, disk, disk24, disk24-old, epoch, fs, int, int24, io, ipc, load, lock, mem, mem-adv, net, page, page24,
proc, raw, socket, swap, swap-old, sys, tcp, time, udp, unix, vm, vm-adv, zones
/usr/share/dstat:
battery, battery-remain, condor-queue, cpufreq, dbus, disk-avgqu, disk-avgrq, disk-svctm, disk-tps, disk-util, disk-wait, dstat,
dstat-cpu, dstat-ctxt, dstat-mem, fan, freespace, fuse, gpfs, gpfs-ops, helloworld, innodb-buffer, innodb-io, innodb-ops, lustre,
md-status, memcache-hits, mysql-io, mysql-keys, mysql5-cmds, mysql5-conn, mysql5-innodb, mysql5-innodb-basic, mysql5-innodb-extra,
mysql5-io, mysql5-keys, net-packets, nfs3, nfs3-ops, nfsd3, nfsd3-ops, nfsd4-ops, nfsstat4, ntp, postfix, power, proc-count, qmail,
redis, rpc, rpcd, sendmail, snmp-cpu, snmp-load, snmp-mem, snmp-net, snmp-net-err, snmp-sys, snooze, squid, test, thermal, top-bio,
top-bio-adv, top-childwait, top-cpu, top-cpu-adv, top-cputime, top-cputime-avg, top-int, top-io, top-io-adv, top-latency,
top-latency-avg, top-mem, top-oom, utmp, vm-cpu, vm-mem, vm-mem-adv, vmk-hba, vmk-int, vmk-nic, vz-cpu, vz-io, vz-ubc, wifi, zfs-arc,
zfs-l2arc, zfs-zil
以下はプラグインの使用例です。
OOM-Killerになる可能性の高いプロセスを出力
dstat --top-oom
--out-of-memory---
kill score
rancher 133
最もCPU使用率の高いプロセスを特定する
$ dstat -ta --top-cpu
----system---- --total-cpu-usage-- -dsk/total- -net/total- ---paging-- ---system-- -most-expensive-
time |usr sys idl wai stl| read writ| recv send| in out | int csw | cpu process
29-01 11:34:36| 2 3 93 3 0|1195k 421k| 0 0 | 369k 335k|1417 4216 |rancher 1.3
29-01 11:34:37| 12 9 71 8 0|1992k 11M| 898B 229B| 300k 10M|5285 12k|rancher 4.0^
まとめ
dstatの素晴らしさは一つのコマンドで多彩な情報を取得できる点だと思います。
バックグラウンドでCSVへ出力させ可視化するのもいいと思います。
プラグインとか書くのも勉強にはよさそうですね
参考リンク
https://nsmr.tk/dstat.html
http://hirose31.hatenablog.jp/entry/20120229/1330501968
https://qiita.com/harukasan/items/b18e484662943d834901