Memo: Vmstat + ネットワーク転送量 + dstat


# はじめに
あまり使わないが、システムの性能検証時に検証対象のリソース状態を取得するために使うsar、vmstatとネットワーク転送量を取得する方法をまとめてみた。

追記:
やりたいことを考えたときにdstatなら一つのコマンドで出来そうだったのでdstatについても記載する。

# 環境

- OS: CentOS7.1

# 一覧

- sar
- vmstat
- ネットワーク転送量取得方法
- dstat

# リソース状態取得ツール
## sar
manを和訳すると、システムの活動情報を収集、レポート、保存するツール。
intervalを指定するとその時間平均値を取得してくれるもので、過去のデータも取得可能なツール。

### 使い方
以下に主に使うシンタックスをわかりやすくまとめてくれている。
http://naoberry.com/tech/sar/#sar-2


## vmstat
manを見ると、仮想メモリの統計を報告するツール。
プロセス・メモリ・ページング・ブロック IO・トラップ・CPU 稼働状況 などに関する情報を報告するもの。

### 使い方
#### デフォルト

```
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 596108    684 307292    0    0     1     1   33   72  0  0 100  0  0
$
```

意味はマニュアルに記載にあるように以下。

|種別|項目名|意味|単位|
|:--|-----:|:--|--:|
|procs|r|ランタイム待ちのプロセス数|個数|
|procs|b|割り込み不可能なスリープ状態にあるプロセス数。本来は実行可能なプロセス数。|個数|
|memory|swpd|仮想メモリの量。Diskに退避されているデータ量|-Sで指定した単位による|
|memory|free|空きメモリの量|-Sで指定した単位による|
|memory|buff|カーネルがバッファに用いられているメモリの量|-Sで指定した単位による|
|memory|cache|ディスクキャッシュに用いられているメモリの量|-Sで指定した単位による|
|swap|si|ディスクからスワップインされているメモリの量|-Sで指定した単位による/s|
|swap|so|ディスクからスワップアウトされているメモリの量|-Sで指定した単位による/s|
|io|bi|ブロックデバイスから受け取ったブロック|blocks/s|
|io|bo|ブロックデバイスに送られたブロック|blocks/s|
|system|in|一秒あたりの割り込み回数|回数/s|
|system|cs|一秒あたりのコンテキストスイッチの回数|回数/s|
|cpu|us|カーネルコード以外の実行に使用した時間 (ユーザー時間、nice 時間を含む)の割合|%|
|cpu|sy|カーネルコードの実行に使用した時間 (システム時間)割合|無次元、%|
|cpu|id|アイドル時間の割合|無次元、%|
|cpu|wa|IO 待ち時間割合|無次元、%|
|cpu|st|仮想マシンから盗まれた時間割合|無次元、%|

### 補足

- コンテキストスイッチ: プログラムの実行を切り替えること。数が多いとオーバーヘッドが大きくなり全体の処理時間が遅くなる。
- cpu nice time: nice値(実行優先度)を変更したユーザプロセスによるCPU使用時間
- cpu steal time: ゲストOSがリソース要求を行ったにも関わらず割り当ててもらえなかった時間 
- 更新時間: delayが指定されない場合は最後の起動時間からの平均になる。


## ネットワーク転送量取得方法
やりたいこととしては、単位時間あたりのネットワーク転送量を取得する、もしくは計算すること。
コマンドラインでパイプなどで処理をしたかったので一行で出力されるものが良い。


### 取得方法
iftopやnethogsなどのツールを調べてみたが、そのまま取得出来なさそうで、ifconfigでパースすれば良いかなと思ったが、`/proc/net/dev`に以下のように記録されていた。

```
$ cat /proc/net/dev
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:   19412     201    0    0    0     0          0         0    19412     201    0    0    0     0       0          0
eno16777984: 33095493   55941    0    0    0     0          0         0 10025373   45050    0    0    0     0       0          0
$

```

Receiveが受信で、Transmitが送信側のトラヒック情報でResetしていない限り起動時からの積算値になっているよう。

前回保存したファイルと現在の値とで計算すれば単位時間あたりのネットワーク転送量を取得出来そう。


## dstat
manを訳すと、多岐に渡るシステムリソース統計情報を生み出すためのツール。

### Install

```
$ sudo yum install -y dstat
$ dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
  0   0 100   0   0   0| 641B 1087B|   0     0 |   0     0 |  35    76 
  0   0 100   0   0   0|   0     0 | 132B  838B|   0     0 |  53   108 
```
### 使い方

以下のように実行すれば、CSV形式でファイル出力をしてくれる。

```
$ dstat --output /tmp/dstat.txt
$ cat /tmp/dstat.txt
"Dstat 0.7.2 CSV output"
"Author:","Dag Wieers <dag@wieers.com>",,,,"URL:","http://dag.wieers.com/home-made/dstat/"
"Host:","influxdb.cs1aidcfcloud.internal",,,,"User:","root"
"Cmdline:","dstat --output /tmp/dstat.txt",,,,"Date:","23 Aug 2015 18:55:01 JST"

"total cpu usage",,,,,,"dsk/total",,"net/total",,"paging",,"system",
"usr","sys","idl","wai","hiq","siq","read","writ","recv","send","in","out","int","csw"
0.091,0.059,99.840,0.009,0.0,0.000,640.222,1086.246,0.0,0.0,0.0,0.0,34.804,75.841
0.0,0.0,100.0,0.0,0.0,0.0,0.0,0.0,66.0,886.0,0.0,0.0,60.0,123.0
$
```

### 補足

- cpu-usage-hiq: ハードウェア割り込みに割り当てられた時間の割合
- cpu-usage-siq: ソフトウェア割り込みに割り当てられた時間の割合

おしまい。