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技術ブログ