2026年9月1日
2026年9月1日
vmstatでメモリ・I/O統計を監視する方法|各列の読み方とボトルネックの見分け方
vmstat は、メモリ・スワップ・ディスクI/O・CPUの状態を1行にまとめて、数秒ごとに表示するコマンドです。「サーバーが重い」と感じたときに vmstat 1 を数十秒眺めるだけで、原因がメモリ不足なのか、ディスク待ちなのか、CPU不足なのかの見当がつきます。この記事では、各列の意味、典型的なボトルネックのパターン、WordPress サーバーでの読み方と記録の残し方を説明します。
基本の使い方
vmstat は多くのディストリビューションで procps(procps-ng)パッケージに含まれており、追加のインストールなしで使えます。
# 1秒間隔で10回表示
vmstat 1 10
# 単位をMBにし、幅を広げて桁ずれを防ぎ、時刻も付ける
vmstat -w -S M -t 5
最初に押さえておきたい注意点が1つあります。1行目は起動してからの平均値で、今の状態ではありません。判断には2行目以降を使います。また、1回きりの値ではなく、数十秒続けて見て傾向をつかむことが大切です。
-S M は表示単位を変えるオプションです。指定しないとKiB単位になり、メモリの大きいサーバーでは桁が多くて読みにくくなります。-w(ワイド表示)を付けると列がずれにくくなります。
各列の意味
| 区分 | 列 | 意味 |
|---|---|---|
| procs | r | 実行中または実行待ちのプロセス数 |
| procs | b | I/O待ちなどで中断できない待機中のプロセス数 |
| memory | swpd | 使用中のスワップ量 |
| memory | free | まったく使われていないメモリ |
| memory | buff / cache | バッファとページキャッシュ |
| swap | si / so | 秒あたりのスワップイン / スワップアウト量 |
| io | bi / bo | 秒あたりにブロックデバイスから読んだ / 書いたブロック数 |
| system | in / cs | 秒あたりの割り込み数 / コンテキストスイッチ数 |
| cpu | us / sy / id / wa / st | ユーザー / カーネル / アイドル / I/O待ち / steal の割合 |
procps のバージョンによっては、cpu の区分に gu(ゲスト)などの列が追加されていることがあります(2026年10月現在)。列の並びは手元の man vmstat で確認してください。
メモリの読み方:free の少なさは問題ではない
初めて vmstat を見た人がよく驚くのが、free の小ささです。Linux は空いているメモリをファイルのキャッシュ(cache)に使い、必要になればすぐに解放します。free が少なくても cache が大きければ、メモリには余裕があります。
メモリが本当に足りないかは、次の2点で判断します。
- si / so が0でない値を出し続けている:メモリが足りず、ディスク上のスワップとの間でページを出し入れしている状態です。これが続くと、ディスクの速度に引きずられて全体が極端に遅くなります
- free も cache も小さい:キャッシュに回す余裕もない状態です
swpd に値があっても、si / so が0なら、過去に追い出されたページが残っているだけで、今は困っていないことが多いです。
「あとどれだけ使えるか」を知りたいときは、free -h の available 列が目安になります。vmstat の -a オプションを付けると、buff / cache の代わりに inact(非アクティブ)と active(アクティブ)が表示され、すぐに回収できるメモリの量を推し量れます。
I/O の読み方:b と wa と bo
ディスクが詰まっているときは、次の列が同時に動きます。
bが1以上で続く:ディスクの読み書きを待って止まっているプロセスがあるwaが高い:CPU に仕事を渡せず、I/O を待っている時間が長いbi/boが大きい:読み書きの量そのものが多い
bi / bo が大きいのに wa が低ければ、ディスクは量をさばけています。逆に bi / bo が小さいのに wa が高い場合は、小さなランダムI/Oが多いか、ディスク自体(あるいはVPSの共有ストレージ)が遅い可能性があります。
なお、si / so が多いときは、スワップが原因で bo / bi と wa も上がります。I/O の問題に見えて、根本はメモリ不足ということがよくあるので、メモリの列を先に確認してください。
デバイスごとの詳細を見たい場合は vmstat -d も使えますが、待ち時間まで見るなら sysstat の iostat -x のほうが向いています。
CPU の読み方:r と us / sy と st
rが CPU コア数を長く上回る:CPU が足りず、処理が順番待ちになっている。コア数はnprocで確認できるusが高い:アプリケーション(PHP、MySQL など)の処理が重いsyが高い、csが非常に多い:プロセスの切り替えやシステムコールが多い。プロセス数が多すぎる設定を疑うstが高い:VPS やクラウドで、物理ホストの CPU を他の仮想マシンに取られている。サーバー内の設定では改善しにくい
パターン別の見分け方
数十秒眺めたら、次のように当てはめます。
- メモリ不足:si / so が継続、free と cache が小さい、wa も上がる
- ディスク待ち:si / so は0、b が1以上、wa が高い、bo か bi が大きい
- CPU 不足:r がコア数を上回る、id がほぼ0、wa は低い
- 外部要因:どの列も落ち着いているのにサイトが遅い。外部API、DNS、データベースのロック待ちなど、サーバー資源以外を疑う
WordPress サーバーでよくあるケース
WordPress サーバーでメモリ不足を起こしやすいのは、PHP-FPM のプロセス数の上限(pm.max_children)が搭載メモリに対して大きすぎる場合です。アクセスが集中するとプロセスが上限まで増え、合計メモリが物理メモリを超えてスワップが始まります。
おおまかな目安は、1プロセスあたりのメモリ使用量(RSS)から計算します。
# php-fpm プロセスの平均RSS(MB)を表示する例。プロセス名は環境によって php-fpm8.3 などになる
ps -eo rss,comm | awk '/php-fpm/ { sum += $1; n++ } END { if (n) printf "%d procs, avg %.1f MB\n", n, sum / n / 1024 }'
「PHP に割ける空きメモリ ÷ 平均RSS」が pm.max_children の上限の目安です。MySQL / MariaDB の innodb_buffer_pool_size や OS が使う分を先に差し引いて考えます。設定を変える前にはバックアップを取り、変更後は負荷の高い時間帯に vmstat で si / so が0のままかを確認してください。
メモリ不足が限界を超えると、カーネルの OOM Killer がプロセスを強制終了します。MySQL が突然止まった、というときは journalctl -k | grep -i oom や dmesg で記録を確認します。
記録を残す・簡単な検知を作る
vmstat は今の状態を見る道具で、履歴は残しません。障害の調査中に一時的に記録したいときは、タイムスタンプ付きでファイルへ書き出します。
# 5秒ごとに1時間分(720回)記録する
vmstat -t -w 5 720 > /var/tmp/vmstat-$(date +%Y%m%d-%H%M).log &
スワップの動きだけを簡易的に検知するなら、次のように直近の値を判定できます。列番号は表示形式によって変わるため、-a などを付けた場合は合わせて調整してください。
# 5秒間隔で3回取り、1行目(起動後平均)を除いた2行でsi/so(7・8列目)を確認
vmstat -w 5 3 | tail -n 2 | awk '$7 + $8 > 0 { print "swap activity: si=" $7 " so=" $8 }'
常時の記録や過去の振り返りは、sysstat の sar に任せるのが手軽です。vmstat は「今起きていることを素早く見る」、sar は「過去に何が起きたかを振り返る」と使い分けると、調査がスムーズに進みます。
まとめ
- vmstat の1行目は起動後の平均。2行目以降を数十秒続けて見て判断する
freeが少なくてもcacheが大きければ問題ない。si / so が続くかどうかでメモリ不足を判断する- I/O 待ちは
b・wa・bi/bo、CPU 不足はrとコア数、VPS ではstも確認する - I/O の問題に見えてメモリ不足が根本のことが多いので、メモリの列を先に見る
- WordPress では PHP-FPM の
pm.max_childrenを平均RSSから見積もり、変更後に vmstat で検証する