vmstat/iostat/sar - 性能解析ツール 3 兄弟

vmstat/iostat/sar - 性能解析ツール 3 兄弟

この記事で分かること

  • vmstat / iostat / sar それぞれの役割と読み方
  • CPU・メモリ・I/O ボトルネックの切り分け手順
  • 3 つのツールの実務での使い分け判断基準

結論:3 ツールの役割分担

ツール 得意なこと
vmstat CPU/メモリ/スワップ/I/O を一画面で俯瞰。まず全体把握
iostat デバイス単位の I/O 詳細(await・IOPS・util%)を確認
sar 過去の履歴データを時系列で参照。事後調査に不可欠

前提環境

  • OS:Ubuntu / RHEL 系 Linux
  • iostat / sarsysstat パッケージが必要
  • sudo apt install sysstat でインストール

vmstat とは何か?

CPU・メモリ・スワップ・I/O・プロセス状態を 1 行にまとめて表示する。ボトルネックが「CPU か I/O かメモリか」を最初に絞り込む一手目として使う。

基本的な使い方

vmstat [interval [count]]
$ 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  0      0 1543200  52480 921600    0    0    14    38  312  580 12  3 84  1  0
 0  0      0 1540800  52480 922100    0    0     0    12  280  510  5  1 93  1  0
 0  0      0 1539900  52480 922500    0    0     0    16  295  530  4  1 94  1  0

各フィールドの読み方

procs(プロセス数)

  • r:実行待ちプロセス数。論理 CPU 数を継続的に超えると CPU ボトルネック
  • b:I/O 待ちでブロックされているプロセス数

memory(KB 単位)

  • swpd:使用中スワップ量。0 以外になったら注意
  • free:未使用メモリ
  • buff / cache:バッファ・ページキャッシュ(OS が管理する再利用可能な領域)

swap(スワップ活動)

  • si:スワップイン(ディスク → メモリ)。継続的に非 0 → メモリ不足
  • so:スワップアウト(メモリ → ディスク)。継続的に非 0 → メモリ不足

io(ブロック I/O、ブロック/秒)

  • bi:ブロックデバイスからの読み込み
  • bo:ブロックデバイスへの書き込み

cpu(CPU 使用率 %)

  • us:ユーザー空間の処理
  • sy:カーネル空間の処理
  • id:アイドル
  • wa:I/O 待機。10% を超え続けると I/O ボトルネックの疑い
  • st:仮想化環境で他 VM に奪われた時間(steal)

最初の行は累積値

vmstat 起動時の第 1 行はシステム起動後の累積平均値(参考程度)。実際の診断は 2 行目以降で判断する。定番は vmstat 1(1 秒間隔で継続)または vmstat 5 12(5 秒間隔 × 12 回で 1 分間の定点観測)。

iostat とは何か?

CPU 概要とデバイス単位の I/O 統計を表示する。vmstat で I/O ボトルネックの疑いが生じた後、「どのデバイスが問題か」を特定する二手目として使う。

インストール(初回のみ)

$ sudo apt install sysstat   # Ubuntu/Debian
$ sudo dnf install sysstat   # RHEL/Fedora

基本的な使い方

$ iostat -x 1 5
Device            r/s     w/s   rkB/s   wkB/s  await  r_await  w_await  util%
sda              1.20    5.30   48.00  212.00   2.50     1.80     2.70   3.20
nvme0n1         25.00   80.00  800.00 3200.00   0.48     0.40     0.52   8.50

重要フィールドの読み方

フィールド 説明 目安
await リクエストの平均応答時間(ms) HDD: 20ms 超で注意 / SSD: 1ms 超で注意
r_await 読み込み平均応答時間(ms)
w_await 書き込み平均応答時間(ms)
util% デバイスのビジー率 80% 超で飽和懸念、100% で飽和確定
r/s, w/s 毎秒の読み書き回数(IOPS) デバイス仕様の IOPS 上限と比較

util% が 100% に近づくとデバイスが飽和(I/O キューが詰まり応答遅延が増大)。await の急増と合わせて確認する。なお util% はパーティション単位ではなくデバイス単位の指標。

特定デバイスのみ絞り込む

$ iostat -x -d sda nvme0n1 1

sar とは何か?

CPU・メモリ・I/O・ネットワークのメトリクスを継続収集し、履歴として参照できる。「昨夜の深夜に何が起きたか」「先週と比べて負荷が増えているか」を調べるときに使う。

有効化手順

$ sudo apt install sysstat
$ sudo systemctl enable sysstat --now

有効化後、sadc デーモンが /var/log/sa/saDD(DD は日付)にデータを蓄積する。

主要オプション

$ sar -u 1 5          # CPU 使用率(1秒間隔×5回)
$ sar -r 1 5          # メモリ使用量
$ sar -b 1 5          # I/O 統計
$ sar -n DEV 1 5      # ネットワーク統計(デバイス別)
$ sar -n EDEV 1 5     # ネットワークエラー統計
$ sar -q 1 5          # ロードアベレージ・プロセス数

過去データを参照する

# 今日の CPU 統計(すべての時刻)
$ sar -u

# 1 日分の全統計(-A で全メトリクス)
$ sar -A -f /var/log/sa/sa01
00:00:01    all      2.34      0.00      5.67      0.12      0.00     91.87
01:00:01    all      1.23      0.00      3.45      0.08      0.00     95.24
02:00:01    all      0.98      0.00      2.11      0.05      0.00     96.86

収集間隔の変更

デフォルトは 10 分間隔(/etc/cron.d/sysstat または /etc/sysstat/sysstat で設定)。本番環境での障害調査精度を上げるには 1〜2 分間隔を推奨。間隔を短くするほどディスク使用量は増える点に注意。

3 つのツールをどう使い分けるか?

調査目的に応じてツールを選ぶことで、診断時間を大幅に短縮できる。

調査したいこと 使うツール 確認するフィールド
まず全体像を把握したい vmstat 1 r, wa, si/so
CPU ボトルネックを確認 vmstat / sar -u r, us+sy, id
I/O が遅いデバイスを特定 iostat -x 1 await, util%
スワップ活動を確認 vmstat si, so, swpd
昨夜の障害を事後調査 sar -u / -r / -b 時刻別の推移
ネットワーク帯域を確認 sar -n DEV rxkB/s, txkB/s

ボトルネック特定の実践パターン

現場でよく使う 4 つの診断シーケンスを示す。

1. CPU ボトルネック疑いの場合

# Step 1: 全体を確認
$ vmstat 1 10
# r(実行待ちプロセス数)が CPU 数を超え続けるか確認

# Step 2: sar で詳細と推移を確認
$ sar -u 1 10
# us + sy が継続して 90% 超 → CPU ボトルネック確定

2. メモリ・スワップ問題疑いの場合

# Step 1: スワップ活動の確認
$ vmstat 1 10
# si/so が継続的に非 0 → スワップ中(メモリ不足)

# Step 2: メモリ詳細
$ sar -r 1 5
# %memused が高い + kbswpused が増加中 → 要対処

3. I/O ボトルネック疑いの場合

# Step 1: vmstat で wa を確認
$ vmstat 1 5
# wa が 10% 超 → I/O ボトルネック疑い

# Step 2: iostat で問題デバイスを特定
$ iostat -x 1 10
# await が高いか util% が 80% 超のデバイスに注目
# HDD なら await 20ms 超、SSD なら await 1ms 超が警戒ライン

4. ネットワーク問題疑いの場合

$ sar -n DEV 1 5
# rxkB/s / txkB/s で帯域使用量を確認
# rxerr/s / txerr/s が非 0 ならハード・ドライバ問題の可能性

次に読む