全力で怠けたい

怠けるために全力を尽くしたいブログ。

vmstat コマンドでよく使うオプションのメモ。

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 の値が上昇しているかチェックしてみるのがよさそう。

参考ページ