夜間バッチの途中でサーバ全体が重くなった。CPUよりもI/O waitが高い。律は `vmstat 1` を見て言った。
「swapしてます」
メモリを使い切ったプロセスが、ディスクを巻き込んで全体を遅くしていた。瀬名は対象バッチの並列数を落とし、律は一時的に処理を分割した。
翌日、メモリ使用量の見積もりと並列数の上限を設定した。
「速くしようとして、全部遅くする」
瀬名が苦笑すると、律は言った。
「焦って近づきすぎると、処理落ちしますね」
「それ、何の話ですか」
「サーバの話です」
三度目の返しに、瀬名はもう笑うしかなかった。
人物紹介
瀬名悠真
- 男性、30代
- サーバ運用・インフラ担当
- 手は動くが、初動で少し焦りやすい
久坂律
- 女性、30代
- 監視、自動化、ログ解析、運用設計に強い
- 冷静で、原因調査の順序を大事にする
用語メモ
vmstat 1 は、Linux/UNIX環境において「システムのCPU、メモリ、IOなどの負荷状況を『1秒おき』にリアルタイム更新しながら監視するコマンド」です。
サーバーの動作が重い時や、システムに負荷をかけてパフォーマンスを計測したい時に、真っ先に使われる超定番コマンドです!
🔍 コマンドの分解
-
vmstat(Virtual Memory Statistics)メモリやCPU、ディスクIO、プロセスなどのシステム全体の統計情報を出力するコマンドです。
-
1(更新間隔)出力結果を「1秒ごと」に繰り返し表示する指定です(
vmstat 2にすれば2秒ごとになります)。※
Ctrl + Cを押すまで永続的に出力され続けます。
📊 出力結果の見方と各項目の解説
コマンドを実行すると、以下のような表形式でデータが1秒ごとに流れてきます。
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1024500 120400 850300 0 0 4 12 150 300 5 2 93 0 0
0 0 0 1024200 120400 850300 0 0 0 0 100 200 1 1 98 0 0
⚠️ 注意(1行目の罠)
1行目に表示される数値だけは「OSが起動してからの平均値」です。リアルタイムのシステム状態を示しているのは2行目以降になります。
各ヘッダーの主要な項目の意味は以下の通りです。
1. procs(プロセス状態)
-
r(runnable): CPUの割り当てを待っている(実行可能な)プロセス数。CPUコア数を超えていると「CPU待ちが発生して重い」状態です。 -
b(blocked): ディスクIOなどで処理が止まっている(割り込み不可能な睡眠状態の)プロセス数。ここが増えると「ディスクが遅くて重い」状態です。
2. memory(メモリ状況 / 単位: KB)
-
swpd: 使用中のスワップメモリ量(0が望ましい)。 -
free: 完全な空きメモリ量。 -
buff: OSのバッファキャッシュ領域。 -
cache: ページキャッシュ領域(Linuxは空きメモリを極力キャッシュに使うため、実質的な空きメモリはfree + buff + cacheで判断します)。
3. swap(スワップ状態 / 単位: KB/s)
-
si(swap in): スワップ領域(ディスク)からメモリに読み込まれた量。 -
so(swap out): メモリからスワップ領域(ディスク)へ追い出された量。-
💡 ポイント:
siやsoに継続的に数値が出ている場合、深刻なメモリ不足(スワッピング)が発生していて動作が超低速化しています。
-
4. io(ディスクIO / 単位: ブロック/s)
-
bi(blocks in): ディスクから読み込んだ量。 -
bo(blocks out): ディスクへ書き込んだ量。
5. cpu(CPU使用率の割合 / 単位: %)
-
us(user): ユーザープログラム(WebサーバーやDB、自作プログラム等)が消費したCPU割合。 -
sy(system): カーネル(OS自体)が消費したCPU割合。 -
id(idle): 待機中(何もしていない)CPUの空き割合。 -
wa(iowait): ディスクなどのIO処理待ちでCPUがブラブラ待たされている時間の割合。ここが高いとディスクがボトルネックです。
💡 トラブルシューティングでの判断テクニック
サーバーが「なんか重い…」という時、vmstat 1 のどこを見れば原因が特定できるかのチェックリストです。
| 症状 | 注目する項目 | 判断基準 |
| CPUネック | procs r, cpu us, cpu id |
r がCPUコア数を超えている、id が0に近く us が高い。 |
| メモリ不足 | swap si, swap so |
si と so の数値が 0 でなく、常にバタバタ動いている。 |
| ディスクIOネック | procs b, cpu wa, io bo |
b が発生している、wa が10%〜数十%と高い数値を出している。 |
🛠️ オプションの応用(見やすくする)
-
メガバイト単位で表示する(
-S Mまたは-m)デフォルトはキロバイト(KB)表記なので見づらい場合、単位をM(メガバイト)に変更できます。
Bashvmstat -S M 1 -
回数を指定して自動終了する
「1秒ごとに5回だけ出力して終了」したい場合、後ろに回数を付けます。
Bashvmstat 1 5

