vmstatコマンドで覚えておきたい使い方8個(+1個)

LinuxやUNIXでパフォーマンスを監視する際にはお約束とも言えるvmstatコマンド。
どの現場でもよく使われるものだが、今回はこのコマンドで覚えておきたい使い方を紹介する。

なお、この内容はCentOS 7にてバンドルされている「procps-ng 3.3.9」のバージョンのものを用いている。

1.基本的な使い方

オプション無しで実行すると、以下のように現時点でのパフォーマンス情報が出力される。

vmstat

[root@test-centos7 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  80556    128 1391560    0    0     5     6    9    2  0  0 100  0  0

それぞれの表示の内容は、以下のようになっている。

procs

  • r … 実行待ち(プロセスが実行キューに入っている状態)になっているプロセス数
  • b … 本来は実行可能だが、何らかの理由によって処理が停止(スリープ)しているプロセス数

r(実行待ちプロセス数)がある場合、CPUの処理が追いついていないか、そのプロセスを実行しているプログラム自体の問題によって実行順が回ってきていないプロセスが存在する事になる。
b(処理停止プロセス数)がある場合、例えばディスクやネットワークのIO待ちをしていたが、プログラムの実行順番が来てしまったプロセスがあることになる。

どちらにしても、このプロセスの実行者からすれば処理が遅く感じられる可能性が高いので、少し注意した方がいい値。

memory

  • swpd … 使用されているスワップメモリー容量
  • free … 未使用のメモリー容量
  • buff … カーネルがバッファ領域として利用しているメモリー容量
  • cache … キャッシュとして用いられているメモリー容量

なお、一般的に動作時間が長くなるにつれて、このcache容量が大きくなっていく傾向があるが、これはLinuxで動作を早く行わせるためにディスクなどから事前にデータを読み込んでいるだけなので、あまり気にしなくて良い。
swpdの値も、後述するsi、soが頻繁に増減している状態でなければパフォーマンスにそこまで影響があるわけではない。

swap

  • si … スワップ領域に退避していたデータを物理メモリーに書き戻している(スワップイン)容量
  • so … 必要のないデータを物理メモリーからスワップ領域に書き込みしている(スワップアウト)容量

もしもこの項目が頻繁に動いているようであれば、パフォーマンスに悪影響を与えている可能性が高いので注意。基本的には、どちらの値も可能な限り0である状態がいい。
(swpdの容量が多くても、この項目があまり変動していないようであれば影響が大きくない)

io

  • bi … ブロックデバイス(HDDなど)からの読み取り容量
  • bo … ブロックデバイスへの書き込み容量

複数のHDDがある場合でも、その合計の値で出力される(HDDごとに値が出力されない)ので注意。
デバイス・パーティションごとのIO値を確認する場合は、後述する「-d」や「-p」オプションで確認すると良いだろう。

system

cpu

  • us … カーネルコード以外(OS以外。例えばphpやperlのスクリプトなど)の実行でCPUが使用された時間の割合
  • sy … カーネルコードの実行でCPUが使用された時間の割合
  • id … CPUがアイドル状態(何もしてない待機状態)だった際の時間の割合
  • wa … ディスク・ネットワークへのデータの入出力でIO待ちだった時間の割合
  • st … ゲストOSがリソース要求を行ったが、CPUリソースを割り当ててもらえなかった時間の割合

2.○秒ごとに定期実行させる

引数として間隔(秒単位)を指定することで、その間隔ごとにパフォーマンス情報を出力させることができる。

vmstat 実行間隔(秒)

この実行間隔を指定してコマンドを実行すると、出力結果にヘッダーが定期的(コマンド実行時のウィンドウサイズによって行数が変動する)に挟まれてしまう。

邪魔であれば、「-n」オプションを付与することでヘッダーを最初の1回(実行時に最初に挿入される分)のみに抑える事ができる。

vmstat -n 実行回数

なお、実行回数の後ろに更に数字を引数として与える事で、実行回数も指定することができる。

vmstat 実行間隔(秒) 実行回数

3.メモリキャッシュのアクティブ/非アクティブ領域の内訳を確認する

「-a」オプションを付与することで、メモリキャッシュのアクティブ(利用中で、開放できない領域)/非アクティブ(最後に利用されてから一定時間が経過したため、すぐに廃棄できる領域)の内訳を確認することができる。

vmstat -a

[root@test-centos7 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  95740    128 1365428    0    0     4     6    9    4  0  0 100  0  0
[root@test-centos7 ~]#
[root@test-centos7 ~]# vmstat -a
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  95720 1273136 372676    0    0     4     6    9    4  0  0 100  0  0

比べて見るとわかるが、オプション無しとくらべて「buff」「cache」がなくなり、「inact」「active」がかわりに表示されている。

  • inact … 非アクティブ(最後に利用されてから一定時間が経過したため、内容をすぐに廃棄できる)な状態のメモリキャッシュの容量
  • active … アクティブ(何らかの形でシステムで利用中のため、開放できない)な状態のメモリキャッシュの容量

activeのメモリはすぐには利用できないので、free + inactの値が利用可能なメモリ容量だと考えるといいだろう。

4.パフォーマンス情報にタイムスタンプを付与する

「-t」オプションを付与することで、出力されるパフォーマンス情報にタイムスタンプを付与することができる。

vmstat -t

[root@test-centos7 ~]# vmstat 1 -t
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st                 JST
 1  0      0  95740    128 1365432    0    0     4     6    9    4  0  0 100  0  0 2015-07-20 10:19:15
 0  0      0  95732    128 1365432    0    0     0     0   66  115  0  0 100  0  0 2015-07-20 10:19:16
 0  0      0  95732    128 1365432    0    0     0     0   54   95  0  0 100  0  0 2015-07-20 10:19:17
 0  0      0  95732    128 1365432    0    0     0     0   72  127  0  0 100  0  0 2015-07-20 10:19:18
 0  0      0  95572    128 1365432    0    0     0     0  117  192  0  0 99  0  0 2015-07-20 10:19:19
 0  0      0  95572    128 1365432    0    0     0     0   60  100  0  0 100  0  0 2015-07-20 10:19:20
 0  0      0  95608    128 1365432    0    0     0     0   58  107  0  0 100  0  0 2015-07-20 10:19:21
 0  0      0  95608    128 1365432    0    0     0     0   57  104  0  0 100  0  0 2015-07-20 10:19:22
 0  0      0  95608    128 1365432    0    0     0     0   62  107  0  0 100  0  0 2015-07-20 10:19:23
 0  0      0  95608    128 1365432    0    0     0     0   61  108  0  0 100  0  0 2015-07-20 10:19:24
 0  0      0  95608    128 1365432    0    0     0     0   53   95  0  0 100  0  0 2015-07-20 10:19:25

5.表示される容量の単位を切り替える

通常、vmstatで表示される容量の単位はKB(キロバイト)となっているのだが、「-S」オプションでk(キロバイト)、m(メガバイト)を切り替える事もできる。

vmstat -S (k or m)

[root@test-centos7 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  95824    128 1365432    0    0     4     6    9    4  0  0 100  0  0
[root@test-centos7 ~]#
[root@test-centos7 ~]# # キロバイト
[root@test-centos7 ~]# vmstat -S k
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  98250    131 1398202    0    0     4     6    9    4  0  0 100  0  0
[root@test-centos7 ~]#
[root@test-centos7 ~]# # メガバイト
[root@test-centos7 ~]# vmstat -S m
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0     98      0   1398    0    0     4     6    9    4  0  0 100  0  0

6.各種カウンターの統計情報を出力する

「-s」オプションを付与すると、各種情報をその詳細な名称とともにリスト形式で出力させることができる。

vmstat -s

[root@test-centos7 ~]# vmstat -s
      1885468 K total memory
      1789744 K used memory
       372696 K active memory
      1273132 K inactive memory
        95724 K free memory
          128 K buffer memory
      1365432 K swap cache
      2113532 K total swap
            0 K used swap
      2113532 K free swap
        76349 non-nice user cpu ticks
          282 nice user cpu ticks
        71973 system cpu ticks
    379256851 idle cpu ticks
        31778 IO-wait cpu ticks
            7 IRQ cpu ticks
         4073 softirq cpu ticks
            0 stolen cpu ticks
     17023816 pages paged in
     21544483 pages paged out
            0 pages swapped in
            0 pages swapped out
     78935690 interrupts
    143253821 CPU context switches
   1435457229 boot time
        61294 forks

7.slabの使用状況を確認する

「-m」オプションを使用することで、メモリのslabの(slabinfo)情報について出力させることができる。

vmstat -m

[root@test-centos7 ~]# vmstat -m -n
Cache                       Num  Total   Size  Pages
ccid2_hc_tx_sock              0      0   1280     12
xfs_dqtrx                     0      0    576     14
xfs_icr                       0      0    144     28
xfs_ili                    3855   4004    152     26
xfs_inode                  9888   9888   1024     16
xfs_efd_item                160    220    400     20
xfs_da_state                 32     32    488     16
xfs_btree_cur                38     38    208     19
xfs_log_ticket              396    396    184     22
scsi_cmd_cache              324    324    448     18
kcopyd_job                    0      0   3312      9
dm_uevent                     0      0   2608     12
dm_rq_target_io               0      0    424     19
UDPLITEv6                     0      0   1152     14
UDPv6                        28     28   1152     14
tw_sock_TCPv6                32     32    256     16
TCPv6                        48     48   2048     16
cfq_queue                   374    442    232     17
bsg_cmd                       0      0    312     13
mqueue_inode_cache           18     18    896     18
hugetlbfs_inode_cache        26     26    608     13
configfs_dir_cache           92     92     88     46
dquot                         0      0    256     16
pid_namespace                 0      0   2176     15
posix_timers_cache            0      0    248     16
UDP-Lite                      0      0   1024     16
ip_fib_trie                  73     73     56     73
RAW                         187    187    960     17
UDP                          32     32   1024     16
tw_sock_TCP                  32     32    256     16
TCP                          34     34   1920     17
blkdev_queue                 34     34   1920     17
blkdev_requests            1218   1218    384     21
blkdev_ioc                   78     78    104     39
fsnotify_event_holder    121210 121210     24    170
fsnotify_event              476    476    120     34
sock_inode_cache            252    252    640     12
net_namespace                 0      0   4224      7
shmem_inode_cache           871    912    680     12
Acpi-ParseExt              5152   5152     72     56
Acpi-Namespace             4488   4488     40    102
taskstats                    24     24    328     12
proc_inode_cache           1224   1224    656     12
sigqueue                     50     50    160     25
bdev_cache                   38     38    832     19
sysfs_dir_cache           17364  17676    112     36
inode_cache               10999  12324    592     13
dentry                    44692  46599    192     21
iint_cache                    0      0     80     51
selinux_inode_security    23118  26571     80     51
buffer_head              158636 159120    104     39
vm_area_struct             8098   8280    216     18
mm_struct                    80     80   1600     20
files_cache                  96     96    640     12
signal_cache                150    210   1152     14
sighand_cache               158    165   2112     15
task_xstate                 167    266    832     19
task_struct                 181    209   2912     11
anon_vma                   4928   4928     64     64
shared_policy_node         2210   2210     48     85
numa_policy                  15     15    264     15
radix_tree_node           20739  22232    584     14
idr_layer_cache             165    165   2112     15
dma-kmalloc-8192              0      0   8192      4
dma-kmalloc-4096              0      0   4096      8
dma-kmalloc-2048              0      0   2048     16
dma-kmalloc-1024              0      0   1024     16
dma-kmalloc-512              16     16    512     16
dma-kmalloc-256               0      0    256     16
dma-kmalloc-128               0      0    128     32
dma-kmalloc-64                0      0     64     64
dma-kmalloc-32                0      0     32    128
dma-kmalloc-16                0      0     16    256
dma-kmalloc-8                 0      0      8    512
dma-kmalloc-192               0      0    192     21
dma-kmalloc-96                0      0     96     42
kmalloc-8192                 41     68   8192      4
kmalloc-4096                218    232   4096      8
kmalloc-2048                318    352   2048     16
kmalloc-1024               1219   1344   1024     16
kmalloc-512                 538    816    512     16
kmalloc-256                3230   3712    256     16
kmalloc-192                2243   2667    192     21
kmalloc-128                2238   3008    128     32
kmalloc-96                 4318   4872     96     42
kmalloc-64                37954  39808     64     64
kmalloc-32               165515 167296     32    128
kmalloc-16                50944  50944     16    256
kmalloc-8                 83456  83456      8    512
kmem_cache_node             128    128     64     64
kmem_cache                   96     96    256     16

8.デバイス・パーティションの統計情報を出力させる

vmstatでは、「-d」オプションでデバイスごとの統計情報を出力させることができる。

vmstat -d

[root@test-centos7 ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
fd0        2      0      16      85      0      0       0       0      0      0
sda   103345    837 34047617 1035927 500440  22513 43093959 6204752      0    862
sr0        0      0       0       0      0      0       0       0      0      0
dm-0     246      0    1968     721      0      0       0       0      0      0
dm-1  102522      0 34001881 1039381 521883      0 43089569 7236979      0    864

それぞれの項目の意味を、以下に記述する。

reads/writes

  • total … 読み込み/書き込みに成功した総数
  • merged … グループ化した読み込み/書き込みの数
  • sectors … 読み込み/書き込みに成功したセクタ数
  • ms … 読み込み/書き込みに使用した時間(ミリ秒)

この項目の値は起動時からの計測なので、リアルタイムでの性能計測には不向きなので注意。

IO

  • cur … 実行中のIO
  • s … IOに使用した時間(秒)

残念ながら各デバイスごとに出力を絞る機能はついていないため、必要であればgrepと組み合わせると良いだろう。

vmstat -nd 実行間隔(秒) | grep -e ^disk- -e デバイス名

なお、「-D」オプションを使用することで、全てのデバイスを統計してのステータスを表示させることもできる。

vmstat -D

[root@test-centos7 ~]# vmstat -D
            5 disks
            2 partitions
       206117 total reads
          837 merged reads
     68051546 read sectors
      2076216 milli reading
      1030952 writes
        22626 merged writes
     86263314 written sectors
     13458654 milli writing
            0 inprogress IO
         1730 milli spent IO

パーティションごとのIO値を取得する場合は、「-p」オプションを用いる。

vmstat -p 対象パーティション(デバイスファイル)

[root@test-centos7 ~]# vmstat -p /dev/sda2
sda2          reads   read sectors  writes    requested writes
              101975   34004905     503730   43130448
[root@test-centos7 ~]# vmstat -p /dev/sda2 1
sda2          reads   read sectors  writes    requested writes
              101975   34004905     503730   43130448
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494

それぞれの項目の意味は以下。

  • 指定したパーティションからの読み込み数
  • 指定したパーティションから読み出されたセクターの数
  • 指定したパーティションへの書き込み数
  • 指定したパーティションへの書き込み要求数

9.横に広く表示させる

パフォーマンス情報を出力させる際、ちょっと見にくいなと思ったら、「-w」オプションで横に広く表示させる事ができる。

vmstat -w

[root@test-centos7 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  96364    128 1365472    0    0     4     6   10    4  0  0 100  0  0
[root@test-centos7 ~]#
[root@test-centos7 ~]# vmstat -w
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
 1  0            0        96364          128      1365472    0    0     4     6   10    4   0   0 100   0   0

2016/05/10 追記

10.出力にタイムスタンプを付与する

以下のようにawkと組み合わせる事で、タイムスタンプを付与する事が出来る。

vmstat 10 | awk '{print strftime("%F %T ") $0}'
[root@test-node]# vmstat 10 | awk '{print strftime("%F %T ") $0}'
2016-05-10 13:10:16 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
2016-05-10 13:10:16  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2016-05-10 13:10:16  1  0      0 5519024 132456 2122020    0    0     0     1    2    3  0  0 100  0  0
2016-05-10 13:10:26  0  0      0 5518900 132456 2122020    0    0     0     0   44   66  0  0 100  0  0
2016-05-10 13:10:36  0  0      0 5518900 132456 2122020    0    0     0     0   40   61  0  0 100  0  0
2016-05-10 13:10:46  0  0      0 5518900 132456 2122020    0    0     0     0   41   62  0  0 100  0  0
2016-05-10 13:10:56  0  0      0 5518900 132456 2122020    0    0     0     0   41   61  0  0 100  0  0