LPIC201 の主題200(キャパシティプランニング)を学習する中で、vmstat の出力からボトルネックを判定する流れを整理した。コマンドの位置づけ、各列の意味、サンプル出力の読み解きまでを 1 本にまとめておく。

vmstat とは何を見るコマンドか

vmstat(Virtual Memory Statistics)は プロセス・メモリ・スワップ・I/O・CPU を 1 画面にまとめて表示 する総合モニタコマンド。procps パッケージに含まれる。

  • sar のように特定リソースに特化しておらず、システム全体のざっくりした状態 を見るのに最適
  • キャパシティプランニングの最初の一手(「どこがボトルネックか」の当たりをつける)
  • 継続ログ機能は持たない → 長期モニタリングは sar / sadc が担当

実行形式

vmstat [delay [count]]
引数意味
delay秒単位の表示間隔vmstat 5 → 5秒おきに表示
count表示回数(省略時は無限)vmstat 5 3 → 5秒おきに3回

ここで一つ落とし穴がある。

  • 引数なし(vmstat 単独)で実行 → 起動からの累積平均 を 1 行表示
  • delay を指定 → 1 行目は起動からの累積平均2 行目以降が指定間隔の瞬間値

→ 出力を読むときは 1 行目を無視して 2 行目以降を見る のが鉄則。

表示項目(6ブロック)

procs -----memory---------- --swap-- --io-- -system-- ----cpu----
 r b   swpd  free  buff cache  si  so  bi  bo  in  cs  us sy id wa st
ブロック意味
procsr実行待ち プロセス数(多ければ CPU 不足の兆候)
bI/O 待ちなど 割り込み不可スリープ のプロセス数
memoryswpd使用中 のスワップ領域サイズ (KB)
free空き物理メモリ (KB)
buffバッファキャッシュ (KB)
cacheページキャッシュ (KB)
swapsiスワップイン(ディスク→メモリ) (KB/s)
soスワップアウト(メモリ→ディスク) (KB/s)
iobiデバイスからの 読み取り ブロック数/秒
boデバイスへの 書き込み ブロック数/秒
systemin1秒あたりの 割り込み回数(クロック含む)
cs1秒あたりの コンテキストスイッチ回数
cpuusユーザ プロセス CPU 割合 (%)
syシステム(カーネル) CPU 割合 (%)
idアイドル 時間 (%)
waI/O 待ち 時間 (%)
st仮想化ホストに奪われた時間 (steal) (%)

覚え方(語感と対)

  • r / b:r=Running 待ち、b=Blocked(I/O 待ち)
  • si / so:si=swap in(読み込まれる)、so=swap out(書き出される) — 頻発 = メモリ不足
  • bi / bo:block in / block out — ディスク I/O
  • us / sy / id / wa:ユーザ / システム / アイドル / I/O 待ち — 合計 ≒ 100%
  • in / cs:interrupt / context switch

サンプル出力1: CPU ボトルネック

8 コアのビルドサーバで、並列コンパイルが詰まりがちなときの vmstat 2 5 想定例:

procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st gu
 2  0      0 5841200 218400 1976820   0    0    21    14  152  340  9  2 88  1  0  0
13  0      0 5762080 218400 1976840   0    0     0     6  583  912 96  3  1  0  0  0
14  0      0 5752440 218400 1976840   0    0     0    18  608  885 97  3  0  0  0  0
12  0      0 5746260 218400 1976840   0    0     0     4  594  872 96  3  1  0  0  0
13  0      0 5740120 218400 1976840   0    0     0    10  601  877 97  2  1  0  0  0

(1 行目は起動からの平均なので無視して 2 行目以降を読む)

観点評価
r(実行待ち)12-14多い(8 コアに対し常時 12 以上 → 実行待ち発生中)
us(ユーザCPU)96-97%張り付き
sy(システムCPU)2-3%低い(カーネル仕事は少ない、ユーザコードで詰まっている)
id(アイドル)0-1%CPU に余裕なし
si/so0スワップ発生なし → メモリは健全
bi/boほぼ 0ディスク I/O ほぼなし
wa0I/O 待ちなし

ボトルネックは CPU

判定のキーは「us が 90% 台」「id が 0」「r がコア数を超える」の 3 点セット。memory/swap/io はすべて静穏で、CPU だけが詰まっている構図。

サンプル出力2: メモリ + ディスクI/O ボトルネック

物理 RAM 4GB / Swap 4GB の小さな VM で、見積もりより重いバッチ処理を流したときの vmstat 3 4 想定例:

procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st gu
 1  0  82400 380200  1840 18620    24    36   180   620  290  410  5  3 88  4  0  0
 0  3 412800   8260   140 10240  8420 12640  8930 12970 1620 1840  2 12 38 48  0  0
 1  4 587120   7920   120  9650 10210 14200 10450 14210 1740 1955  1 14 35 50  0  0
 2  3 712640   8410   136  9180  9480 13880  9610 13895 1690 1898  1 13 41 45  0  0

(1 行目は起動からの平均、無視)

観点評価
free(空きメモリ)8260 → 8410 KB 付近で張り付きほぼ枯渇
swpd(累積スワップ使用)412800 → 712640 KB と単調増加スワップ領域がじわじわ食われている
si/so8000-14000 KB/sスワップ激しく発生 → メモリ不足確定
bi/bo9000-14000 ブロック/秒ディスク I/O 激しい(swap と連動)
wa(I/O 待ち)45-50%高い — I/O がボトルネック化
b(I/O 待ちプロセス)3-4常に何かが I/O で詰まっている
us/sy1-2% / 12-14%CPU は暇だが動けない

ボトルネックはメモリとディスクI/O

判定のキーは次の連鎖:

  • free が極端に小さい + si/so が 0 でない → メモリ不足確定
  • その結果 bi/bo が増え wa が上がる → ディスクI/O にしわ寄せ

これは典型的な スラッシング(スワップの嵐でシステムが動けなくなる状態)で、根本原因はメモリ不足、症状は I/O 過多として現れる。

vmstat 読みの型

2 例を対比すると、判定手順は次のように型化できる。

  1. 1 行目は無視(起動からの平均)
  2. cpu ブロックを見るus が高ければ CPU 系、wa が高ければ I/O 系
  3. swap ブロックを見るsi/so が 0 でなければメモリ不足を疑う
  4. memory の free を併せて確認
  5. io ブロック は swap と連動するか独立(純粋な I/O 負荷)かを見極める
  6. procs の r/b で詰まりの方向を確認(r 多い=CPU 詰まり、b 多い=I/O 詰まり)

代表パターンの早見表:

パターン特徴ボトルネック
us↑ id↓ r>0 si/so=0CPU 張り付きCPU
si/so↑ free↓ bi/bo↑ wa↑ b>0スワップ嵐メモリ(+ディスクI/O)
bi/bo↑ wa↑ si/so=0純 I/O 負荷ディスクI/O
us/sy 低い id 高 r=0健全なし

vmstat 単体で原因まで特定するというより、「どこを次に深掘りするか」(top/iostat/sar のどれを叩くか)の交通整理に使う、というのが実運用の感覚に近い。

自己チェック

書きながら自問できるようにしておきたい項目:

  • vmstat 5 3 の「1 行目」は何を表すか
  • rb の違いを 1 行で説明できるか
  • siso の単位と意味は
  • bibo の単位と意味は
  • wa が高いときは何が起きているか
  • incs はそれぞれ何の回数か
  • swpdso の違いは(前者=現在のスワップ使用サイズ、後者=スワップアウト速度)
  • free が小さくても問題ない場合があるのはなぜか(buff/cache に回っていれば実害なし)

変更履歴

  • 2026-05-05: 初版公開