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
| ブロック | 列 | 意味 |
|---|---|---|
| procs | r | 実行待ち プロセス数(多ければ CPU 不足の兆候) |
| b | I/O 待ちなど 割り込み不可スリープ のプロセス数 | |
| memory | swpd | 使用中 のスワップ領域サイズ (KB) |
| free | 空き物理メモリ (KB) | |
| buff | バッファキャッシュ (KB) | |
| cache | ページキャッシュ (KB) | |
| swap | si | スワップイン(ディスク→メモリ) (KB/s) |
| so | スワップアウト(メモリ→ディスク) (KB/s) | |
| io | bi | デバイスからの 読み取り ブロック数/秒 |
| bo | デバイスへの 書き込み ブロック数/秒 | |
| system | in | 1秒あたりの 割り込み回数(クロック含む) |
| cs | 1秒あたりの コンテキストスイッチ回数 | |
| cpu | us | ユーザ プロセス CPU 割合 (%) |
| sy | システム(カーネル) CPU 割合 (%) | |
| id | アイドル 時間 (%) | |
| wa | I/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/so | 0 | スワップ発生なし → メモリは健全 |
| bi/bo | ほぼ 0 | ディスク I/O ほぼなし |
| wa | 0 | I/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/so | 8000-14000 KB/s | スワップ激しく発生 → メモリ不足確定 |
| bi/bo | 9000-14000 ブロック/秒 | ディスク I/O 激しい(swap と連動) |
| wa(I/O 待ち) | 45-50% | 高い — I/O がボトルネック化 |
| b(I/O 待ちプロセス) | 3-4 | 常に何かが I/O で詰まっている |
| us/sy | 1-2% / 12-14% | CPU は暇だが動けない |
→ ボトルネックはメモリとディスクI/O。
判定のキーは次の連鎖:
freeが極端に小さい +si/soが 0 でない → メモリ不足確定- その結果
bi/boが増えwaが上がる → ディスクI/O にしわ寄せ
これは典型的な スラッシング(スワップの嵐でシステムが動けなくなる状態)で、根本原因はメモリ不足、症状は I/O 過多として現れる。
vmstat 読みの型
2 例を対比すると、判定手順は次のように型化できる。
- 1 行目は無視(起動からの平均)
- cpu ブロックを見る →
usが高ければ CPU 系、waが高ければ I/O 系 - swap ブロックを見る →
si/soが 0 でなければメモリ不足を疑う - memory の free を併せて確認
- io ブロック は swap と連動するか独立(純粋な I/O 負荷)かを見極める
- procs の r/b で詰まりの方向を確認(r 多い=CPU 詰まり、b 多い=I/O 詰まり)
代表パターンの早見表:
| パターン | 特徴 | ボトルネック |
|---|---|---|
| us↑ id↓ r>0 si/so=0 | CPU 張り付き | 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 行目」は何を表すかrとbの違いを 1 行で説明できるかsiとsoの単位と意味はbiとboの単位と意味はwaが高いときは何が起きているかinとcsはそれぞれ何の回数かswpdとsoの違いは(前者=現在のスワップ使用サイズ、後者=スワップアウト速度)freeが小さくても問題ない場合があるのはなぜか(buff/cache に回っていれば実害なし)
変更履歴
- 2026-05-05: 初版公開