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
- in … 1秒辺りの割り込み処理の回数(クロック割り込み含)
- cs … 1秒辺りのコンテキストスイッチの回数
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