hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

vmstatコマンドの使い方



1 vmstatコマンドとは?

以下の状態を確認するためのコマンドです。
・プロセスの状態
・メモリの使用状況
・スワッピングの状況
・ブロックI/Oの状況
・割り込みやコンテキストスイッチの回数
・CPUの使用状況(ユーザモード、カーネルモード等の使用割合)

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

vmstatの版数は以下のとおりです。

[root@server ~]# vmstat -V
vmstat from procps-ng 3.3.10

仮想マシンの搭載CPU数を確認します。搭載CPUは4個であることがわかります。

[root@server ~]# cat /proc/cpuinfo |grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

3 オプション一覧

オプションは以下のとおりです。

[root@server ~]# vmstat -h

Usage:
 vmstat [options] [delay [count]]

Options:
 -a, --active           active/inactive memory
 -f, --forks            number of forks since boot
 -m, --slabs            slabinfo
 -n, --one-header       do not redisplay header
 -s, --stats            event counter statistics
 -d, --disk             disk statistics
 -D, --disk-sum         summarize disk statistics
 -p, --partition <dev>  partition specific statistics
 -S, --unit <char>      define display unit
 -w, --wide             wide output
 -t, --timestamp        show timestamp

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see vmstat(8).

4 基本的な使い方

4.1 定期的に実行する方法(<実行間隔>)

vmstatを1秒間隔で実行してみます。このとき-tオプションを指定すると、時刻を表示することができます。vmstat実行結果の右端を確認すると、1秒間間隔でvmstatが実行されていることがわかります。

[root@server ~]# vmstat -t 1
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 3092088   2084 288320    0    0    10     1   16   23  0  0 100  0  0 2022-02-01 21:49:43
 0  0      0 3092088   2084 288320    0    0     0     0   39   48  0  0 100  0  0 2022-02-01 21:49:44
 0  0      0 3091940   2084 288320    0    0     0     0   38   60  0  0 100  0  0 2022-02-01 21:49:45
-snip-

4.2 実行回数を指定する方法(<実行間隔> <実行回数>)

1秒間隔で3回実行してみます。右端を確認すると1秒間隔で実行されていることがわかります。

[root@server ~]# vmstat -t 1 3
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 3091988   2084 288372    0    0    10     1   16   22  0  0 100  0  0 2022-02-01 21:53:10
 0  0      0 3091880   2084 288372    0    0     0     0   64   85  0  0 100  0  0 2022-02-01 21:53:11
 0  0      0 3091880   2084 288372    0    0     0     0   46   77  0  0 100  0  0 2022-02-01 21:53:12

次に2秒間隔で3回実行してみます。右端を確認すると2秒間隔で実行されていることがわかります。

[root@server ~]# vmstat -t 2 3
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 3092160   2084 288372    0    0    10     1   16   22  0  0 100  0  0 2022-02-01 21:53:23
 0  0      0 3092012   2084 288372    0    0     0     0   52   79  0  0 100  0  0 2022-02-01 21:53:25
 0  0      0 3092012   2084 288372    0    0     0     0   52   85  0  0 100  0  0 2022-02-01 21:53:27

4.3 表示の幅を広げる方法(-w)

表示する幅を広げて見やすくするオプションです。

[root@server ~]#  vmstat -w 1 3
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      3091460         2084       288400    0    0     9     1   16   22   0   0 100   0   0
 0  0            0      3091560         2084       288400    0    0     0     0   56   82   0   0 100   0   0
 0  0            0      3091568         2084       288400    0    0     0     0   47   78   0   0 100   0   0

5 cpu欄の見方

stressコマンドを使ってCPU使用率を上げて、us、sy、idがどのように変化するのかを確認してみます。なお、stressコマンドの使い方は、stressコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

項目 意味
us ユーザ空間のプログラムの実行に費やしたCPUの実行時間の割合を表す
sy カーネル空間のプログラムの実行に費やしたCPUの実行時間の割合を表す
id CPUがアイドル状態の時間の割合を表す
wa ディスクI/O 待ちの時間の割合を表す
st 仮想マシンがCPUを割り当てられなかった時間の割合を表す

5.1 usの意味確認

まず、CPUがほとんど使用されていない状態でvmstatコマンドを実行します。idが100%で推移しているため、CPUがほとんど使用されていないことがわかります。

[root@server ~]#  vmstat -w 1
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      3305168         2084       206216    0    0   138     5  113  132   1   2  95   2   0
 0  0            0      3303408         2084       206216    0    0     0     0   93  153   0   0 100   0   0
 0  0            0      3303460         2084       206216    0    0     0     0   91  159   0   0 100   0   0
-snip-

次にstressコマンドを使って、CPU使用率を上げてみます。-cオプションを付けると、rand関数が繰り返し実行されます。システムコールは実行されません。したがって、CPUのほとんどが、ユーザ空間のプログラムの実行に費やされることになります。つまり、-cオプションを付けると、vmstatコマンドのusが上昇することを意味します。rand関数が繰り返し実行されることについては、stressコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# stress -c 1 -q &
[1] 1942

psコマンドでstressプロセスの状態を確認してみます。stressプロセスの親プロセス(PID=4832)はwaitシステムコールを実行して、子プロセス(PID=4833)の終了を待っています。do_waitはwaitシステムコールの延長で呼び出すカーネルの関数です。そして、子プロセスは、CPU=2で動作しており、CPU使用率が94.7%であることがわかります。

[root@server ~]# ps -C stress -o comm,pid,ppid,psr,%cpu,wchan
COMMAND            PID   PPID PSR %CPU WCHAN
stress            4832   4389   3  0.0 do_wait
stress            4833   4832   2 94.7 -

このとき、vmstatの実行結果を確認します。usの値が0%から25%に増加していることがわかります。4個のCPUのうち、1個のCPUのCPU使用率が100%であるため、usの値が25になっています。

[root@server ~]#  vmstat -w 1
-snip-
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
 2  0            0      3303792         2084       206244    0    0     0     0 1104  151  25   0  75   0   0
 1  0            0      3303792         2084       206244    0    0     0     0 1118  161  25   0  75   0   0
 2  0            0      3303792         2084       206244    0    0     0     0 1126  175  25   0  75   0   0
-snip-

5.2 syの意味確認

次に、stressコマンドに、-mオプションを付けて実行します。-mオプションを付けると、mmap/munmapシステムコールを繰り返し実行します。

[root@server ~]# stress -m 1
stress: info: [2130] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd

このとき、vmstatの実行結果を確認します。syの値は0%から24%に増加していますが、usの値は2%までしか増加していません。つまり、ほとんどの時間、カーネル空間でプログラムが実行されていて、ユーザ空間ではプログラムが、ほとんど実行されていないことがわかります。

[root@server ~]#  vmstat -w 1
-snip-
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
 2  0            0      3079044         2084       210132    0    0     0     0 1395  742   2  23  75   0   0
 1  0            0      3249276         2084       210132    0    0     0     0 1423  738   2  24  75   0   0
 1  0            0      3187836         2084       210132    0    0     0     0 1424  758   2  23  75   0   0
-snip-

6 memory欄の見方

stressコマンドを使ってメモリ使用量を上げると、swpd,si,soがどのように変化するのかを確認してみます。

項目 意味
swpd 使用されているスワップの量
free 未使用のメモリ量
buff 使用されているバッファの量
cache 使用されているキャッシュの量

stressコマンドを実行していない状態を確認します。未使用(free)のメモリが約3.5Gあることがわかります。

[root@server ~]#  vmstat -w 1
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        27228      3477216            0        75568    0    6    16     7  245  126   3  14  83   0   0
 0  0        27228      3477200            0        75568    0    0     0     0   52   65   0   0 100   0   0
 0  0        27228      3477200            0        75568    0    0     0     0   43   57   0   0 100   0   0
-snip-

stressコマンドを使って、メモリを3G獲得します。

[root@server ~]# stress -m 1 --vm-bytes 3G --vm-hang 0 -q &
[1] 3230

およそ3.5Gあったメモリが、350M程度に減っていることがわかります。

[root@server ~]#  vmstat -w 1
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
 1  0        35524       345748            0        55068    0    0     0     0   27   37   0   0 100   0   0
 0  0        35524       345748            0        55068    0    0     0     0   62   81   0   0 100   0   0
 0  0        35524       345748            0        55068    0    0     0     0   39   51   0   0 100   0   0
 0  0        35524       345748            0        55068    0    0     0     0   28   45   0   0 100   0   0
-snip-

さらに300Mのメモリを獲得してみます。

[root@server ~]# stress -m 1 --vm-bytes 300M --vm-hang 0 -q &
[2] 3253

300Mのメモリを追加で獲得すると、スワップ領域(swpd列)の使用量が増加していくのがわかります。また、siやsoの値が一時的に増加しているのがわかります。

[root@server ~]#  vmstat -w 1
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       130644       102916            0        35736  116    0   116     0  129  148   0   0  99   0   0
 0  0       130628       102916            0        35740   16    0    32     0   51   67   0   0 100   0   0
 0  0       130628       102916            0        35756    0    0     0     0   34   49   0   0 100   0   0
 0  0       130628       102916            0        35756    0    0     0     0   26   39   0   0 100   0   0
-snip-

stressコマンドを終了します。

[root@server ~]# pkill stress
[1]-  Terminated              stress -m 1 --vm-bytes 3G --vm-hang 0 -q
[2]+  Terminated              stress -m 1 --vm-bytes 300M --vm-hang 0 -q

7 パーティションの統計情報を表示する方法(-p)

仮想マシンパーティションを確認します。/boot,/(root),swapの3つがあることがわかります。

[root@server ~]# lsblk -i
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   30G  0 disk
|-sda1   8:1    0  256M  0 part /boot
|-sda2   8:2    0  128M  0 part [SWAP]
`-sda3   8:3    0 29.6G  0 part /
sr0     11:0    1  4.4G  0 rom

/bootの統計情報を確認してみます。/dev/sda1に/bootが割り当てられているので、-pオプションには/dev/sda1を指定します。

[root@server ~]# vmstat -p /dev/sda1
sda1          reads   read sectors  writes    requested writes
                 221      47822        257       4096

次に、/(root)の統計情報を確認してみます。/dev/sda3に/(root)が割り当てられているので、-pオプションには/dev/sda3を指定します。

[root@server ~]# vmstat -p /dev/sda3
sda3          reads   read sectors  writes    requested writes
              209417   44136756       2170      68668

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ