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
絵で見てわかるシステムパフォーマンスの仕組み