vmstat コマンドでわりとよく使うオプションのメモ。
普段は AWS の EC2 インスタンスに入って使うことが多いのでこのエントリーを書くときも EC2 インスタンスに入って vmstat コマンドを実行した結果とかをメモっている。
vmstat コマンドのバージョン。
$ vmstat --version vmstat from procps-ng 3.3.10
vmstat コマンドのオプション
vmstat コマンドはプロセスのメモリ、プロセス、スワップ、IO、割り込みと CPU の情報を表示するコマンド。
vmstat コマンドの名前の由来は virtual memory statistics
だと思うんだけど、メモリだけじゃなくてシステムの一通りの情報が揃っているので「なにか変だな」みたいなときはまず使ってみる、みたいな使い方をすることが多いように思う。
自分はなんとなく使うことが多い気がするのでよく使うオプションをメモしておく。
--help オプション: ヘルプ
--help
オプションを指定すると vmstat コマンドの使い方を表示する……んだけど man vmstat
が使えないときにしか使わない。
$ 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
delay, count
オプションじゃないんだけど vmstat コマンドを使うときは必ずといっていいほど指定するやつ。
vmstat
みたいに delay なしで実行するとこんな感じで起動 (再起動) してからの平均値を表示するんだけど、
$ vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 579228 2088 348192 0 0 84 123 90 2074 10 17 72 0 0
vmstat 5
みたいに delay を指定すると指定した delay 秒ごとに表示を更新する。
$ vmstat 5 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 579360 2088 348192 0 0 80 117 87 1977 10 16 73 0 0 0 0 0 579352 2088 348192 0 0 0 0 27 50 0 0 100 0 0 0 0 0 579352 2088 348192 0 0 0 8 22 40 0 0 100 0 0 0 0 0 579352 2088 348192 0 0 0 0 4 7 0 0 100 0 0 0 0 0 579352 2088 348192 0 0 0 0 5 10 0 0 100 0 0 0 0 0 579352 2088 348192 0 0 0 0 7 9 0 0 100 0 0
vmstat 5 3
みたいに delay と count を指定すると指定した delay 秒ごとに count 回分だけ表示を更新する。
$ vmstat 5 3 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 579360 2088 348192 0 0 80 117 87 1977 10 16 73 0 0 0 0 0 579352 2088 348192 0 0 0 0 27 50 0 0 100 0 0 0 0 0 579352 2088 348192 0 0 0 8 22 40 0 0 100 0 0
-t, --timestamp オプション: 日時を表示する
vmstat --timestamp 5
みたいに -t
オプションか --timestamp
オプションを指定すると日時も表示する。
$ vmstat --timestamp 5 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp----- r b swpd free buff cache si so bi bo in cs us sy id wa st UTC 0 0 0 579388 2088 348196 0 0 72 105 79 1777 9 15 76 0 0 2020-02-20 12:10:25 0 0 0 579380 2088 348196 0 0 0 0 24 46 0 0 100 0 0 2020-02-20 12:10:30 0 0 0 579380 2088 348196 0 0 0 3 23 44 0 0 100 0 0 2020-02-20 12:10:35 0 0 0 579256 2088 348196 0 0 0 4 35 56 0 0 100 0 0 2020-02-20 12:10:40 0 0 0 579256 2088 348196 0 0 0 0 23 45 0 0 100 0 0 2020-02-20 12:10:45
-n, --one-header オプション: ヘッダーは最初の1回だけ表示
vmstat 5
とか実行すると定期的 (ウィンドウのサイズによる) にヘッダー行を表示するけど -n
オプションか --one-header
オプションを指定するとヘッダーは最初の1回だけ表示する。
-S, --unit オプション: メモリの単位を指定する
memory
の表示単位はキロバイトがデフォルトだけど -S
オプションか --unit
オプションを指定すると memory
の表示単位を変更できる。
-S
オプションと --unit
オプションに指定できる値と表示単位は以下のとおり。
指定できる値 | 表示単位 |
---|---|
k | キロバイト (KB) |
K | キビバイト (KiB) |
m | メガバイト (MB) |
M | メビバイト (MiB) |
vmstat コマンドの表示項目
vmstat コマンドの表示項目について軽くメモしておく。
procs
プロセスの情報。 r + b = ロードアベレージ。
項目 | 意味 |
---|---|
r | 実行中もしくは実行待ちのプロセス数 |
b | ディスク I/O やロック待ちのプロセス数 |
memory
メモリの情報。
項目 | 意味 |
---|---|
swpd | 使用中の仮想メモリの量 |
free | 空きメモリの量 |
buff | バッファとして使用中のメモリの量 |
cache | キャッシュとして使用中のメモリの量 |
inact | アクティブになっていないメモリの量 |
active | アクティブになっているメモリの量 |
swap
スワップの情報。
項目 | 意味 |
---|---|
si | ディスクからスワップインしているメモリの量。KB / 秒 |
so | ディスクにスワップアウトしているメモリの量。 KB / 秒 |
io
IO の情報。
項目 | 意味 |
---|---|
bi | HDD のようなブロックデバイスから1秒あたりに受け取ったブロック数 |
bo | HDD のようなブロックデバイスに1秒あたりに送ったブロック数 |
system
項目 | 意味 |
---|---|
in | 1秒あたりの割り込み回数。タイマー割り込みを含む |
cs | 1秒あたりのコンテキストスイッチ回数 |
cpu
CPU の情報。 単位はトータル CPU 時間におけるパーセンテージ。
項目 | 意味 |
---|---|
us | ユーザー CPU 時間。カーネル以外が CPU を使用した時間 |
sy | システム CPU 時間。カーネルが CPU を使用した時間 |
id | CPU がアイドル状態だった時間 |
wa | プロセスが IO 待ちだった時間 |
st | 仮想マシンから盗まれた時間 ※ |
st: 仮想マシンから盗まれた時間とは
「仮想マシンから盗まれた時間」とはなにを意味するのか。
vmstat の man page は Time stolen from a virtual machine
とだけ書いてあってなんのことかよく分からないんだけど vmstat と同じくシステムの負荷監視系コマンドの sar の man page が分かりやすい。
Percentage of time spent in involuntary wait by the virtual CPU or CPUs while the hypervisor was servicing another virtual processor.
Google 翻訳にかけると ハイパーバイザーが別の仮想プロセッサーにサービスを提供している間に、1つまたは複数の仮想CPUが不本意に待機した時間の割合
って感じで、OS が仮想マシン (仮想サーバー) 上で動いているときに意味を持ってくる値で、仮想マシンが CPU を要求するけど CPU の使用率の上限が決められていて仮想マシンが CPU を利用できないときとか、仮想マシンが CPU を要求するけど 他の仮想マシンが CPU を使いまくってて CPU を利用できないときに st が上昇する。
自分は普段あまり st の上昇は見ないような気がするけど AWS の EC2 の t2 とかのバーストパフォーマンスインスタンスを使ってるときに見たりする。 たとえば、t2 インスタンスとかで CPU をぶん回して CPU バーストして CPU 使用率が 100% に張り付くような状態を続けていくといずれ CPU クレジットを使い切って CPU 使用率が落ちていく。 このへんを vmstat で見てると st の値が上昇していくのが分かる。
プログラムが仮想マシン上で動いていて CPU 使用率はそんなに高くないんだけど CPU バウンドっぽい……みたいなときは st の値が上昇しているかチェックしてみるのがよさそう。