dstatコマンドでサーバリソースをリアルタイム監視

![timthumb.png](https://qiita-image-store.s3.amazonaws.com/0/258841/eaaa3b75-9ee1-f48c-e174-1ac958953e60.png)

dstat - versatile tool for generating system resource statistics

## 背景

mpstatやらvmstatやらでリソース監視をやっていたらターミナルの数が無限に増えていくのに嫌気がさした。
ちょっと調べてみるとdstatというコマンドがいろいろ見れて便利って聞いたので紹介してみます。

## dstatとは

dstatとは簡単に説明するとCPU負荷をコアごと、IO負荷をディスクごと、ネットワーク転送量をインターフェイスごとに表示できるコマンド。
topやiostat,netstatを使って監視しているリソースがコマンド一つで監視できます。

GitHubにてソースは公開されています。言語はPython
[dagwieers/dstat](https://github.com/dagwieers/dstat)

公式サイト
http://dag.wiee.rs/home-made/dstat/

## インストール

``` bash
$ 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を押します。

![スクリーンショット 2019-01-29 19.13.21.png](https://qiita-image-store.s3.amazonaws.com/0/258841/62a995f9-5b4a-0a38-3e14-7c77e4cd0361.png)


## オプション概要

- -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 ヘッダ表示を一回だけにします

自分で使いたいものをオプションで指定した順番で表示されます。
以下に使用例を記載します。

#### ネットワークやディスク状態いろいろ

``` bash
$ 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とメモリ関連をとりあえず

``` bash
$ 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の使用率をコアごとに見る

``` bash
$ 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
```

#### 実行結果をログをファイルへ出力する

``` bash
$ dstat --output dstat.csv
``` 

## プラグイン

dstatパッケージをインストールすると、「/usr/share/dstat」ディレクトリに大量のPythonスクリプトがコピーされます。このスクリプトがdstatのプラグインです。
このディレクトリに自分でプラグインを追加することもできます。
また```--list```オプションを指定することでも見ることができます。

``` bash
$ 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
```

``` bash
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になる可能性の高いプロセスを出力

``` bash
dstat --top-oom
--out-of-memory---
    kill score
rancher       133
```

#### 最もCPU使用率の高いプロセスを特定する

``` bash
$ 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