Linuxのiostatコマンドとは?ディスクI/O・%util・awaitの見方を解説

コマンドリファレンス

Linuxの iostat コマンドは、ディスク(ブロックデバイス)の I/O 統計と CPU 使用率を表示するツールです。
sysstat パッケージに含まれており、サーバーの応答が遅い、ディスクが重いといった場面で原因を特定するために使われます。

単なるコマンド一覧ではなく、「数値をどう読むか」「I/O 遅延をどう判断するか」を中心に解説します。

iostatとは?sysstatパッケージとの関係

iostat は Linux の sysstat パッケージに含まれるコマンドです。sysstatiostat のほか mpstatpidstatsar などのパフォーマンス計測ツールを提供するパッケージで、多くのサーバーディストリビューションではデフォルトでインストールされています。

コマンドが見つからない場合は、以下の手順でインストールできます。

インストール方法

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統計の見方

iostatavg-cpu: の行にCPU使用率を表示します。各項目の意味は以下のとおりです。

項目意味見方のポイント
%userユーザー空間のCPU使用率アプリケーション処理の負荷を示す。高い場合はアプリのCPU使用量を確認する
%nicenice値を変更したプロセスのCPU使用率通常は低い。バックグラウンドバッチ処理などで上昇する
%systemカーネル空間のCPU使用率高い場合はシステムコールやI/O処理が多いことを示す
%iowaitI/O完了待ちでCPUがアイドルだった割合高い(目安:10%超)場合はディスクI/Oがボトルネックの可能性がある
%steal仮想環境でハイパーバイザーに奪われたCPU時間VPS・クラウドで高い場合はホスト側の過負荷を示す
%idleCPUがアイドル状態だった割合低い場合はCPU全体が高負荷。%iowait との区別に注意

ディスクI/O統計の見方(基本)

引数なしの iostat または iostat -d で表示される基本統計の項目です。

項目意味見方のポイント
tps1秒あたりのI/Oリクエスト数(transactions per second)高いほど多くのI/Oが発生している。HDDは数百、SSDは数千〜数万まで処理可能
kB_read/srkB/s1秒あたりの読み取りデータ量(KiB/s)読み取りが多いか書き込みが多いかを判断する目安になる
kB_wrtn/swkB/s1秒あたりの書き込みデータ量(KiB/s)ログ書き込みやDB更新が多い場合は高くなりやすい
kB_read計測期間の合計読み取りデータ量累積値。繰り返し表示時は参考程度
kB_wrtn計測期間の合計書き込みデータ量同上

iostat -x の拡張統計の読み方

-x オプションで表示される拡張統計には、ボトルネック判断に必要な項目が含まれます。

項目意味見方のポイント
r/s1秒あたりの読み取りリクエスト数tpsを読み/書き別に分解したもの
w/s1秒あたりの書き込みリクエスト数同上
rkB/s1秒あたりの読み取りデータ量(KiB/s)
wkB/s1秒あたりの書き込みデータ量(KiB/s)
rrqm/sマージされた読み取りリクエスト数/秒OSがI/Oをまとめて効率化している数
wrqm/sマージされた書き込みリクエスト数/秒同上
r_await読み取りI/Oの平均待ち時間(ミリ秒)HDD:10〜20ms以内が目安。SSD:1ms未満が目安
w_await書き込みI/Oの平均待ち時間(ミリ秒)同上
awaitI/O全体の平均待ち時間(ミリ秒)遅延判断の最重要指標。r_awaitとw_awaitの加重平均
aqu-szavgqu-sz平均I/Oキューの長さ1を大きく超えると I/O が詰まっている可能性がある
svctmデバイスのサービス時間(ミリ秒)※非推奨現在は信頼性が低いとされ、await で代替する
%utilI/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 より awaitr/sw/s を重視します。
  • NVMe の場合:複数のキューを持つためさらに高い並列性があり、%util だけでは判断しにくいです。

await が高い場合の考え方

await はI/Oリクエストを発行してから完了するまでの平均待ち時間(ミリ秒)です。アプリケーションの体感速度に直結するため、最も重要な指標のひとつです。

デバイス種別正常の目安要注意
HDD(機械式)5〜15ms程度20ms超
SATA SSD0.1〜1ms程度5ms超
NVMe SSD0.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 はデバイス単位の統計なので、原因プロセスの特定は iotoppidstat と組み合わせます。

サーバー負荷調査での実用例

タイムスタンプ付きでログを記録

iostat -t -x 2 30 > /tmp/iostat.log

2秒間隔で30回、タイムスタンプ付きでファイルに記録します。重い時間帯の調査に使えます。

特定のデバイスだけを監視

iostat -x -p sda 1

sda とそのパーティション(sda1sda2 等)の統計を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が高い原因プロセスの特定に使う
htoptopの視認性改善版同上(インタラクティブな操作が可能)
iotopプロセス別のI/O使用量(リアルタイム)iostatでデバイスが重いとわかったあと、原因プロセスを特定するために使う

主なオプション一覧

オプション説明使用例
-cCPU 統計のみ表示iostat -c 1
-dデバイス統計のみ表示iostat -d 1
-x拡張デバイス統計await%utilr/sw/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 の場合は awaitr/sw/s のスループット、aqu-sz(キュー長)を重点的に確認します。

関連コマンド

  • vmstat:メモリ/プロセス/CPU/IO を横断的に要約。最初の一手に使う。
  • iotop:プロセス別の I/O 使用量をリアルタイム表示。iostat でデバイスが特定できたあとに原因プロセスを探す。
  • pidstat -d 1:プロセス別の I/O 統計を表示。iotop より軽量でスクリプト向き。
  • mpstat:CPU コア別の使用率を時系列で表示。%iowait をコア別に確認できる。
  • sar:各種統計を収集・保存し、後から分析。過去の傾向を見るのに使う。
  • lsblk:デバイスとパーティションの構成を確認。iostat の対象デバイスの全体像を把握する。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント