Linuxの iostat コマンドは、ディスク(ブロックデバイス)の I/O 統計と CPU 使用率を表示するツールです。sysstat パッケージに含まれており、サーバーの応答が遅い、ディスクが重いといった場面で原因を特定するために使われます。
単なるコマンド一覧ではなく、「数値をどう読むか」「I/O 遅延をどう判断するか」を中心に解説します。
iostatとは?sysstatパッケージとの関係
iostat は Linux の sysstat パッケージに含まれるコマンドです。sysstat は iostat のほか mpstat、pidstat、sar などのパフォーマンス計測ツールを提供するパッケージで、多くのサーバーディストリビューションではデフォルトでインストールされています。
コマンドが見つからない場合は、以下の手順でインストールできます。
インストール方法
Ubuntu / Debian系
sudo apt update
sudo apt install sysstat
CentOS / RHEL系
sudo yum install sysstat
# または
sudo dnf install sysstat
基本の使い方
iostat(1回だけ表示)
iostat
引数なしで実行すると、システム起動から現在までの平均値を1回だけ表示します。CPU統計とディスクI/O統計が出力されます。
avg-cpu: %user %nice %system %iowait %steal %idle
2.15 0.00 0.98 0.41 0.00 96.46
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 3.20 12.3 45.7 123456 456789
iostat 1(1秒間隔でリアルタイム表示)
iostat 1
1秒ごとに繰り返し表示します。2回目以降は「直前の計測間隔の平均」になるため、リアルタイムのI/O負荷を確認できます。Ctrl+C で終了します。
iostat -x 1(拡張統計をリアルタイム表示)
iostat -x 1
-x オプションで拡張統計を表示します。await(I/O待ち時間)や %util(デバイス使用率)など、ボトルネック判断に必要な項目が加わります。実務での診断にはこのオプションがほぼ必須です。
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz await svctm %util
sda 1.00 5.00 8.00 40.00 0.00 2.00 0.00 28.57 10.0 12.5 0.50 12.0 1.2 7.2
CPU統計の見方
iostat は avg-cpu: の行にCPU使用率を表示します。各項目の意味は以下のとおりです。
| 項目 | 意味 | 見方のポイント |
|---|---|---|
%user | ユーザー空間のCPU使用率 | アプリケーション処理の負荷を示す。高い場合はアプリのCPU使用量を確認する |
%nice | nice値を変更したプロセスのCPU使用率 | 通常は低い。バックグラウンドバッチ処理などで上昇する |
%system | カーネル空間のCPU使用率 | 高い場合はシステムコールやI/O処理が多いことを示す |
%iowait | I/O完了待ちでCPUがアイドルだった割合 | 高い(目安:10%超)場合はディスクI/Oがボトルネックの可能性がある |
%steal | 仮想環境でハイパーバイザーに奪われたCPU時間 | VPS・クラウドで高い場合はホスト側の過負荷を示す |
%idle | CPUがアイドル状態だった割合 | 低い場合はCPU全体が高負荷。%iowait との区別に注意 |
ディスクI/O統計の見方(基本)
引数なしの iostat または iostat -d で表示される基本統計の項目です。
| 項目 | 意味 | 見方のポイント |
|---|---|---|
tps | 1秒あたりのI/Oリクエスト数(transactions per second) | 高いほど多くのI/Oが発生している。HDDは数百、SSDは数千〜数万まで処理可能 |
kB_read/s(rkB/s) | 1秒あたりの読み取りデータ量(KiB/s) | 読み取りが多いか書き込みが多いかを判断する目安になる |
kB_wrtn/s(wkB/s) | 1秒あたりの書き込みデータ量(KiB/s) | ログ書き込みやDB更新が多い場合は高くなりやすい |
kB_read | 計測期間の合計読み取りデータ量 | 累積値。繰り返し表示時は参考程度 |
kB_wrtn | 計測期間の合計書き込みデータ量 | 同上 |
iostat -x の拡張統計の読み方
-x オプションで表示される拡張統計には、ボトルネック判断に必要な項目が含まれます。
| 項目 | 意味 | 見方のポイント |
|---|---|---|
r/s | 1秒あたりの読み取りリクエスト数 | tpsを読み/書き別に分解したもの |
w/s | 1秒あたりの書き込みリクエスト数 | 同上 |
rkB/s | 1秒あたりの読み取りデータ量(KiB/s) | |
wkB/s | 1秒あたりの書き込みデータ量(KiB/s) | |
rrqm/s | マージされた読み取りリクエスト数/秒 | OSがI/Oをまとめて効率化している数 |
wrqm/s | マージされた書き込みリクエスト数/秒 | 同上 |
r_await | 読み取りI/Oの平均待ち時間(ミリ秒) | HDD:10〜20ms以内が目安。SSD:1ms未満が目安 |
w_await | 書き込みI/Oの平均待ち時間(ミリ秒) | 同上 |
await | I/O全体の平均待ち時間(ミリ秒) | 遅延判断の最重要指標。r_awaitとw_awaitの加重平均 |
aqu-sz(avgqu-sz) | 平均I/Oキューの長さ | 1を大きく超えると I/O が詰まっている可能性がある |
svctm | デバイスのサービス時間(ミリ秒)※非推奨 | 現在は信頼性が低いとされ、await で代替する |
%util | I/O処理にデバイスが使用されていた割合(%) | 100%に近いとデバイスが飽和状態。SSDは高くても性能が出ることもある |
%iowait が高い場合の考え方
%iowait は「CPUはアイドルだが、I/O完了を待っている時間の割合」を示します。10%を超える場合はディスクI/Oがボトルネックになっている可能性があります。
ただし、%iowait だけで判断するのは危険です。以下のポイントで総合判断します。
%iowaitが高く、%utilも高い:デバイスが飽和している可能性が高い%iowaitが高いが%utilは低い:ネットワークI/O(NFS等)が原因の場合や、特定のI/O待ちが集中していることがあるawaitも同時に確認する:awaitが高ければデバイス側の遅延が実際に発生している
%iowait が高い原因として考えられること
- ディスクへの大量の読み書き(バックアップ、ログ書き込み、大量データ処理)
- swap が頻繁に発生している(メモリ不足でディスクにアクセスが集中)
- DBのフルスキャンやインデックス未使用のクエリ
- NFSやiSCSIなどネットワーク越しのI/O遅延
%util が高い場合の考え方
%util は「デバイスがI/O処理をしていた時間の割合」です。100%に近いほどデバイスが飽和しています。
- HDD の場合:
%utilが80〜100% に達すると性能劣化が顕著になります。HDDは物理的にヘッドが動くため、I/Oの集中に弱い構造です。 - SSD の場合:
%utilが100%近くても、内部で並列処理しているため実際には性能が出ていることがあります。SSDは%utilよりawaitやr/s・w/sを重視します。 - NVMe の場合:複数のキューを持つためさらに高い並列性があり、
%utilだけでは判断しにくいです。
await が高い場合の考え方
await はI/Oリクエストを発行してから完了するまでの平均待ち時間(ミリ秒)です。アプリケーションの体感速度に直結するため、最も重要な指標のひとつです。
| デバイス種別 | 正常の目安 | 要注意 |
|---|---|---|
| HDD(機械式) | 5〜15ms程度 | 20ms超 |
| SATA SSD | 0.1〜1ms程度 | 5ms超 |
| NVMe SSD | 0.1ms未満 | 1ms超 |
await が高い主な原因と対処の方向性:
- デバイスが飽和している(
%utilも高い):I/O量を減らすか、デバイス性能の向上(SSD化等)を検討する - キューが滞留している(
aqu-szが高い):I/Oの並列度を下げるか、複数デバイスへの分散を検討する - ランダムI/Oが多い:DBのインデックスチューニング、キャッシュ活用などでI/Oパターンを改善する
ディスクI/Oがボトルネックか確認する流れ
サーバーが重いときのI/O診断フローです。
ステップ1:全体の負荷状況を確認
iostat -x 1 5
5秒間、1秒ごとに拡張統計を表示します。初回は起動からの平均なので2回目以降を見ます。
ステップ2:CPU統計で%iowaitを確認
avg-cpu 行の %iowait が 10% を超えている場合、I/Oが原因でCPUが待たされている可能性があります。
ステップ3:デバイスの%utilとawaitを確認
特定のデバイスで %util が高く(80%超)、かつ await が目安を超えていれば、そのデバイスがボトルネックです。
ステップ4:I/Oの原因プロセスを特定
# I/Oを多く使っているプロセスを確認
iotop -o
# または pidstat でプロセス別I/Oを確認
pidstat -d 1
iostat はデバイス単位の統計なので、原因プロセスの特定は iotop や pidstat と組み合わせます。
サーバー負荷調査での実用例
タイムスタンプ付きでログを記録
iostat -t -x 2 30 > /tmp/iostat.log
2秒間隔で30回、タイムスタンプ付きでファイルに記録します。重い時間帯の調査に使えます。
特定のデバイスだけを監視
iostat -x -p sda 1
sda とそのパーティション(sda1、sda2 等)の統計を1秒ごとに表示します。
起動からの累積ではなく直近だけを確認
iostat -y -x 1 10
-y で初回(起動からの平均)を除外します。現在の状況だけを純粋に観測できます。
単位をMiB/sで見やすく
iostat -m -x 1
ファイルサーバー・DBサーバーで見るべき項目
ファイルサーバー(NFS、Samba等)
rkB/s/wkB/s:スループット(転送量)を確認する。ネットワーク帯域とデバイス帯域のどちらが限界かを切り分けるr/s/w/s:ファイルアクセスが多数の小さいI/Oに分かれていないか確認するawait:クライアントから見た応答遅延の原因がストレージ側にあるか判断する
DBサーバー(MySQL、PostgreSQL等)
r/s:読み取りI/Oが多い場合はキャッシュ(バッファプール)が足りていない可能性があるw/s/wkB/s:WALやbinlogの書き込みが高い場合はストレージのwriteスループットが問題になることがあるawait:スロークエリとI/O待ちの相関を確認する。r_awaitが高い場合はフルスキャンの疑いがある%util:SSDでも高くなることがあるが、awaitが低ければ性能は出ている
vmstat・top・htop・iotopとの違い
| コマンド | 主な用途 | iostatとの使い分け |
|---|---|---|
iostat | ディスクI/O統計・CPU統計(デバイス単位) | ストレージのボトルネック詳細分析に使う |
vmstat | メモリ・CPU・ディスクI/O・スワップを横断的に要約 | 全体感をつかむ最初の一手。詳細はiostατへ |
top | プロセス別CPU・メモリ使用状況(リアルタイム) | CPUが高い原因プロセスの特定に使う |
htop | topの視認性改善版 | 同上(インタラクティブな操作が可能) |
iotop | プロセス別のI/O使用量(リアルタイム) | iostatでデバイスが重いとわかったあと、原因プロセスを特定するために使う |
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
-c | CPU 統計のみ表示 | iostat -c 1 |
-d | デバイス統計のみ表示 | iostat -d 1 |
-x | 拡張デバイス統計(await・%util・r/s・w/s 等) | iostat -x 1 |
-p [DEVICE] | 指定デバイスとパーティションを表示 | iostat -p sda 1 |
-k | 単位を KiB/s に固定 | iostat -k -x 1 |
-m | 単位を MiB/s に固定 | iostat -m 1 |
-t | 各行にタイムスタンプを付与 | iostat -t -x 2 |
-y | 初回レポート(起動からの平均)を抑止 | iostat -y 1 10 |
-z | 活動が 0 のデバイス行を省略 | iostat -z -x 1 |
-V | バージョン表示 | iostat -V |
よくある疑問
iostat が見つからない場合はどうするか
command not found: iostat というエラーが出る場合は sysstat パッケージがインストールされていません。上記「インストール方法」を参照してください。
# インストールの確認
which iostat
iostat -V
1回目の表示はどう読めばよいか
引数なし・または間隔を指定した場合の 1回目の出力は「システム起動から現在までの平均値」 です。現在の瞬間的な負荷ではないため、リアルタイムの状況を見たい場合は2回目以降の値を参照します。起動からの平均値を除外したい場合は -y オプションを使います。
%util が100%に近いと危険か
デバイスの種類によります。
- HDD:
%utilが高いと性能劣化につながります。awaitも同時に確認してください。 - SSD・NVMe:内部並列処理があるため、
%utilが高くてもawaitが低ければ問題ない場合があります。awaitを主体に判断してください。
%iowait が高い原因は何か
主な原因は以下のとおりです。
- 大量のファイル読み書き(バックアップ、ログ処理)
- swap の多用(メモリ不足でディスクにアクセスが集中)
- DBのインデックス未使用によるフルスキャン
- NFSやリモートストレージへの遅延
- デバイス自体の故障や劣化
SSDとHDDで見方は変わるか
変わります。HDD は %util が性能の上限に直結しますが、SSD は内部で並列処理するため %util だけでは判断できません。SSD の場合は await と r/s・w/s のスループット、aqu-sz(キュー長)を重点的に確認します。
関連コマンド
vmstat:メモリ/プロセス/CPU/IO を横断的に要約。最初の一手に使う。iotop:プロセス別の I/O 使用量をリアルタイム表示。iostat でデバイスが特定できたあとに原因プロセスを探す。pidstat -d 1:プロセス別の I/O 統計を表示。iotop より軽量でスクリプト向き。mpstat:CPU コア別の使用率を時系列で表示。%iowait をコア別に確認できる。sar:各種統計を収集・保存し、後から分析。過去の傾向を見るのに使う。lsblk:デバイスとパーティションの構成を確認。iostat の対象デバイスの全体像を把握する。

コメント