Linuxでよく使われる「vmstat」コマンドとは、メモリの空き容量やCPUの負荷状況、ディスクI/Oなどを表示・確認するコマンドです。
リアルタイムでもシステムの負荷状況を確認することができるので、ボトルネックを切り分けるときに「vmstat」コマンドを使います。
vmstatの統計情報
- プロセス(procs)
- メモリ(memory)
- スワップ(swap)
- ブロックI/O(io)
- システム情報(system)
- CPU(cpu)
サーバーの処理が遅いと感じたら「vmstat」コマンドで調べてみてください。
vmstatコマンドの基礎知識
vmstatコマンドを使う前に必要最低限の知識は身につけておきましょう。
こちらでは、vmstatの基本的な知識をご紹介します。
vmstatのバージョン確認方法
vmstatのバージョンを調べる場合は、
「vmstat --version」で確認することができます。
$ vmstat --version
vmstat from procps-ng 3.3.10
vmstatのヘルプ確認方法
vmstatでヘルプを調べる場合は、
「vmstat --help」または、「vmstat -h」で確認することができます。
$ vmstat --help
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).
vmstatコマンドのオプション
vmstatコマンドを使用する場合は、オプションも覚えておくことをおすすめします。
オプション解説
-a:メモリの使用状況を表示
-f:ブート後のフォーク数を表示
-m:スタブの情報を表示
-n:ヘッダがコマンド投入時に一回だけ表示
-s:メモリの統計表示
-d:全ディスクの統計を表示
-p:パーティションの詳細表示
-S:「k」「K」「m」「M」をつけると、メモリ単位で表示
-V:バージョン情報を表示
procs:プロセス
procsは、アクティブなプロセスに関する統計になります。
r:実行待ち状態にあるプロセス数
b:割り込み不可能なスリープ状態にあるプロセス数
w:スワップアウトされており,実行可能なプロセス数
memory:メモリ
memoryは、メモリの使用量と使用可能量に関するデータになります。
swpd:仮想メモリー量
free:空きメモリー量(Kバイト)
buff:バッファとして用いられているメモリー量(Kバイト)
swap:スワップ
swapは、スワップに関する統計になります。
si:ディスクからスワップインしているメモリー量(Kバイト/秒)
so:ディスクにスワップしているメモリー量(Kバイト/秒)
io:ブロックI/O
ioは、デバイスとの転送量になります。
ioは、Input/outputの略です。
ファイルのダウンロードやデータの読み込みを行ったりするとioの数値が高くなります。
長時間ioの数値が高い場合は、ディスクioが頻発しています。
そのため、ディスクの増設やサーバーの負荷分散などを検討する必要があります。
bi:ブロック・デバイスから受け取ったブロック数(ブロック/秒)
bo:ブロック・デバイスに送られたブロック数(ブロック/秒)
system:システム情報
systemは、システム全体の割り込みおよびコンテキストの切り替えレート
in:毎秒の割り込み回数
cs:毎秒のコンテキスト・スイッチ回数
cpu:CPU
cpuは、CPUの使用量の割合になります。
id(アイドル時間)の数値が100に近いほどサーバーが安定している状態になります。
目安としてidが90以上あることが望ましいです。
idの数値が低いとCPUに負荷がかかっている状況になりますので調査を行う必要があります。
us:ユーザー時間
sy:システム時間
id:アイドル時間
wa:IO待ち時間
vmstatコマンドの使い方
実際にvmstatコマンドの使い方についてご紹介します。
vmstat
オプションを指定しない場合の「vmstat」コマンドの結果はこちらです。
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 3705840 252023792 0 9325548 1 3 53 153 0 0 8 4 88 0 0
vmstatを〇秒間隔で実行
10秒間隔でメモリやCPU、ディスクi/oなどをリアルタイム表示する場合は、「vmstat 〇」を実行します。
「〇」には秒数を指定します。
vmstatを10秒間隔で実行する場合の例はこちらです。
$ vmstat 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 3686512 252115072 0 9221152 1 3 53 153 0 0 8 4 88 0 0
10 0 3686504 252102288 0 9221392 0 0 1370 4343 32156 31125 11 3 87 0 0
7 0 3686512 252097856 0 9221236 0 0 1069 3336 27250 25523 8 2 89 0 0
2 0 3686512 252086576 0 9220500 0 0 1514 14537 33882 74228 15 13 72 0 0
5 0 3686512 252103920 0 9218848 0 0 1652 6022 28570 30210 9 3 88 0 0
6 0 3686512 252111200 0 9220496 0 0 1795 3700 30529 30174 11 2 87 0 0
8 0 3686512 252091712 0 9223356 0 0 531 10390 33161 31358 10 2 88 0 0
10 0 3686512 252098816 0 9221888 0 0 222 3265 37758 38715 9 2 88 0 0
6 0 3686512 252111328 0 9220492 0 0 876 4130 26984 26560 9 2 90 0 0
6 0 3686512 252110624 0 9222664 0 0 1216 19309 38156 80161 17 13 70 0 0
7 0 3686512 252108848 0 9224104 0 0 1493 8532 34255 32517 12 3 86 0 0
「vmstat -t 10」でも10秒間隔で表示することができます。
「-t」を追加することでtimestampを表示できます。
$vmstat -t 10
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
5 0 3686532 252083632 0 9128132 1 3 53 153 0 0 8 4 88 0 0 2021-02-18 13:23:20
3 0 3686532 252068368 0 9128924 0 0 1331 5993 38883 37514 13 3 83 0 0 2021-02-18 13:23:30
4 2 3686532 252065744 0 9128996 0 0 1233 9512 31061 30797 10 2 88 0 0 2021-02-18 13:23:40
2 0 3686532 252069376 0 9128220 0 0 212 8212 30537 29469 9 2 89 0 0 2021-02-18 13:23:50
11 0 3686532 252057296 0 9129364 0 0 1934 6238 29718 28451 9 2 89 0 0 2021-02-18 13:24:00
「vmstat」と「awk」を組み合わせることで日時を表示することもできます。
$ vmstat -a 1 | awk '{print strftime("%Y/%m/%d %H:%M:%S" ), $0}'
2021/02/18 13:48:20 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
2021/02/18 13:48:20 r b swpd free inact active si so bi bo in cs us sy id wa st
2021/02/18 13:48:20 7 0 3686436 252044064 3989760 7544736 1 3 53 153 0 0 8 4 88 0 0
2021/02/18 13:48:30 5 0 3686436 252040976 3990008 7547068 0 0 290 1957 27796 28076 8 2 89 0 0
途中でコマンドを終了する場合は、「Ctrl+c」を実行します。
vmstatを〇秒間隔を〇回表示
vmstatを10秒間隔で3回表示する場合の例はこちらです。
$ vmstat 10 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
8 0 3686492 252073760 0 9120124 1 3 53 153 0 0 8 4 88 0 0
5 0 3686536 252081728 0 9120692 0 0 1022 11542 34337 34504 13 4 83 0 0
8 0 3686536 252081344 0 9119896 0 0 251 3940 33262 31662 10 2 88 0 0
表示単位を変更して表示
表示単位をメガバイトで表示したい場合は、「vmstat -S m」コマンドを実行します。
$ 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
10 0 3774 258134 0 9411 0 0 53 153 0 0 8 4 88 0 0
キロバイトで表示したい場合は、「vmstat -S k」コマンドを実行します。
$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
18 0 3774967 258017664 0 9503482 1 3 53 153 0 0 8 4 88 0 0
表示を見やすくする
表示を見やすくする場合は、「vmstat -w」コマンドを実行します。
$ 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
9 0 3686448 251638960 0 9705516 1 3 53 153 0 0 8 4 88 0 0