vmstat / iostat(パフォーマンス統計)
『vmstat』はメモリ・スワップ・CPU・I/O の統計をリアルタイムに出力するコマンドで、『iostat』はディスクデバイスごとのI/Oスループットや待ち時間を表示するコマンドです。どちらも軽量で、スクリプトや監視ツールと組み合わせてパフォーマンスのボトルネックを素早く特定するのに役立ちます。高負荷なサーバーで「レスポンスが遅い」と感じたとき、まず vmstat でスワップ発生の有無とI/O待ちを確認し、次に iostat で原因ディスクを特定するという手順が定石です。
構文
# -----------------------------------------------
# vmstat の構文
# -----------------------------------------------
# vmstat [オプション] [間隔(秒)] [回数]
# → 間隔・回数を指定しない場合は現時点の統計を1行出力します
# → 間隔のみ指定した場合は Ctrl+C で停止するまで繰り返します
# 例: vmstat 1 5 (1秒ごとに5回出力)
# 主要オプション
# -a → buff/cache の代わりに active/inactive メモリを表示します
# -d → ディスク統計を表示します(iostat に近い情報)
# -s → メモリ統計のサマリーを表示します
# -S M → 数値の単位をメガバイト(MB)に変更します
# -w → 列幅を広げて数値が切れないようにします
# -t → タイムスタンプ列を追加します
# -----------------------------------------------
# iostat の構文
# -----------------------------------------------
# iostat [オプション] [間隔(秒)] [回数]
# → sysstat パッケージに含まれます(未導入の場合は apt/dnf でインストール)
# 例: iostat -xh 1 3 (拡張情報をわかりやすい単位で1秒ごとに3回出力)
# 主要オプション
# -x → 拡張統計(await / %util など)を表示します
# -h → 数値を人間が読みやすい単位(K/M/G)で表示します
# -d → ディスク統計のみ表示します(CPU統計を除外)
# -p {デバイス}
# → 指定したデバイスとそのパーティションのみ表示します
# 例: iostat -xh -p sda 1
構文一覧
| コマンド / 列 | 説明 |
|---|---|
vmstat 1 5 | 1秒ごとに5回、メモリ・スワップ・CPU・I/O の統計を出力します。先頭行は起動からの累計値なので参考程度に見てください。 |
vmstat -S M 1 | 単位を MB にして1秒ごとに出力します。メモリ量が大きいサーバーで数値が読みやすくなります。 |
vmstat -a | buff/cache の代わりに active / inactive メモリを表示します。メモリ回収可否の判断に使います。 |
vmstat -s | メモリ統計のサマリーを縦方向に表示します。スワップ総容量・使用量を一覧で確認できます。 |
vmstat: r | 実行待ちプロセス数(Run queue)。CPU コア数を超え続ける場合は CPU 不足のサインです。 |
vmstat: b | I/O 待ちでスリープ中のプロセス数(Blocked)。0 より大きい状態が続く場合はディスクがボトルネックです。 |
vmstat: swpd | スワップ使用量(KB)。0 より大きい場合は物理メモリが不足しています。 |
vmstat: free | 未使用の物理メモリ(KB)。Linux は空きメモリをキャッシュに充てるため、小さくても必ずしも問題ではありません。 |
vmstat: buff | バッファキャッシュ(KB)。ブロックデバイスのメタデータなどを保持します。 |
vmstat: cache | ページキャッシュ(KB)。ファイルの読み書きを高速化します。メモリ不足時にカーネルが解放します。 |
vmstat: si | スワップイン(KB/s)。ディスクからメモリへ読み戻している量です。値が大きいと深刻なメモリ不足です。 |
vmstat: so | スワップアウト(KB/s)。メモリからディスクへ退避している量です。継続して発生している場合はメモリ増設を検討してください。 |
vmstat: bi | ブロックデバイスからの読み込み(ブロック/s)。ディスク読み取りの負荷を表します。 |
vmstat: bo | ブロックデバイスへの書き込み(ブロック/s)。ディスク書き込みの負荷を表します。 |
vmstat: in | 割り込み回数/s(Interrupts)。NIC や HBA の割り込みが多い場合に増加します。 |
vmstat: cs | コンテキストスイッチ回数/s。高すぎる場合はプロセス数や I/O 待ちが多すぎる可能性があります。 |
vmstat: us | ユーザー空間での CPU 使用率(%)。アプリケーション処理が占める割合です。 |
vmstat: sy | カーネル空間での CPU 使用率(%)。高い場合はシステムコールや割り込み処理が多すぎる可能性があります。 |
vmstat: id | CPU アイドル率(%)。100 に近いほど CPU に余裕があります。 |
vmstat: wa | I/O 待ち時間の CPU 割合(%)。10〜20% を超え続ける場合はディスクがボトルネックです。 |
iostat -xh 1 3 | 拡張統計を人間が読みやすい単位で1秒ごとに3回出力します。デバイスごとの負荷を詳細に確認できます。 |
iostat: tps | デバイスへの転送回数/s(Transfers Per Second)。IOPS に相当します。 |
iostat: kB_read/s | 読み取りスループット(KB/s)。 |
iostat: kB_wrtn/s | 書き込みスループット(KB/s)。 |
iostat: await | I/O リクエストの平均待ち時間(ミリ秒)。SSD で数ミリ秒、HDD で10〜20ms 程度が正常の目安です。 |
iostat: %util | デバイスの使用率(%)。70% を超えると飽和の兆候です。100% に達するとI/Oが完全にボトルネックになっています。 |
使用例
vmstat の出力例
$ vmstat 1 5 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 1 512000 48320 12800 380000 120 240 3200 1800 1450 2800 35 15 40 10 0 3 2 518000 44100 12800 376000 180 320 4800 2200 1820 3400 42 18 28 12 0 4 3 524000 40200 12800 372000 240 400 6400 2600 2100 4000 48 20 18 14 0 3 2 528000 38400 12800 370000 200 360 5600 2400 1950 3700 44 19 24 13 0 2 1 530000 37600 12800 368000 160 280 4200 2000 1700 3200 38 16 34 12 0 # ↑ swpd が増加し続け(メモリ不足)、si/so が 0 より大きい(スワップ発生中) # ↑ b 列が 1〜3(I/O 待ちプロセスが存在)、wa が 10〜14%(ディスクI/O待ちが発生) # ↑ このような状況では iostat でどのディスクが原因か確認します
iostat の出力例
$ iostat -xh 1 3
Linux 5.14.0 (jujutsu-srv) 2026-03-25 _x86_64_ (4 CPU)
rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util Device
0.00 8.50 45.20 32.80 6.2M 4.1M 210.0k 2.40 24.5 18.2 33.8 5.2 40.3% sda
0.00 0.20 128.40 95.60 18.4M 12.8M 245.0k 7.80 38.2 22.4 58.6 5.8 82.6% sdb
0.00 0.10 2.30 1.80 256.0k 128.0k 72.0k 0.02 5.1 4.8 5.6 4.9 2.0% sdc
rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util Device
0.00 9.10 48.30 35.20 6.6M 4.4M 215.0k 2.60 25.1 19.0 34.5 5.3 41.8% sda
0.00 0.30 142.80 108.20 20.1M 14.5M 252.0k 9.20 46.3 27.1 69.8 5.9 93.2% sdb
0.00 0.10 2.10 1.60 240.0k 112.0k 69.0k 0.02 4.9 4.7 5.3 4.8 1.8% sdc
# ↑ sdb の %util が 82〜93%(ほぼ飽和状態)
# ↑ sdb の await が 38〜46ms(書き込み待ち w_await が特に高い)
# ↑ sdb がボトルネック。書き込み量(wMB/s)も大きく、HDD の限界に達している可能性があります
概要
『vmstat』と『iostat』は Linux のパフォーマンス診断でよく使われる基本ツールです。トラブル発生時の手順としては、まず top / htop でどのプロセスが CPU やメモリを消費しているかを確認し、次に vmstat で「スワップが発生しているか」「I/O 待ちで CPU が止まっているか」を確認します。vmstat の wa(I/O wait)列が高い場合や b 列(I/O 待ちプロセス)が増加している場合は、iostat -xh でデバイスごとの %util と await を確認してどのディスクが詰まっているかを特定します。%util が 70% を超えていれば要注意、100% に達している場合はそのデバイスが完全に飽和しており、I/O のボトルネックとなっています。swpd が増加し続け si/so(スワップイン・アウト)が継続して発生する場合は物理メモリ不足が原因です。この場合は不要なプロセスの停止やメモリの増設を検討してください。定期的な記録をとって傾向を把握したい場合は sar / sysstat を合わせて活用することをおすすめします。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。