2026年5月25日
2026年5月25日
I/Oボトルネックの特定方法(top・iostat・sar・pidstatの見方)
サーバーが遅いとき、CPU は空いているのに処理が進まない場合は、ディスクの読み書き(I/O)が詰まっていることがあります。この記事では、Linux の標準的なコマンドで「I/O が原因か」「どのディスクか」「どのプロセスか」を順に絞り込みます。コマンドの動作と出力の列は、2026年11月時点で Debian 13 の sysstat 12.7.5 と、iostat の公式マニュアルで確認しています。
| 調べたいこと | 使うコマンド |
|---|---|
| I/O 待ちが起きているか | top、vmstat |
| どのディスクが詰まっているか | iostat -x |
| いつから起きているか(過去の記録) | sar |
| どのプロセスが読み書きしているか | pidstat -d、iotop |
準備:sysstat を入れる
iostat・sar・pidstat は sysstat というパッケージに入っています。
# Ubuntu/Debian
sudo apt install sysstat
# RHEL 系(AlmaLinux・Rocky Linux など)
sudo dnf install sysstat
ステップ1:top と vmstat で I/O 待ちがあるかを見る
top の3行目(%Cpu(s))の wa は、CPU が I/O の完了を待って何もしていない時間の割合です。
%Cpu(s): 2.1 us, 1.0 sy, 0.0 ni, 60.3 id, 36.4 wa, 0.0 hi, 0.2 si, 0.0 st
この例のように wa が高く、us・sy(CPU の処理)が低い場合は、I/O 待ちが疑われます。top の画面でプロセスの S(状態)の列が D のプロセスは、I/O などの完了を待って止まっているプロセスです。なお、top は CPU とメモリの使用量をプロセスごとに表示しますが、プロセスごとの I/O 量は表示しません(ステップ4のコマンドを使います)。
一定の間隔で数字を並べて見るには vmstat が便利です。
vmstat 1 5 # 1秒ごとに5回
| 列 | 意味 | I/O が詰まっているときの傾向 |
|---|---|---|
b |
I/O などを待って止まっているプロセスの数 | 0 より大きい値が続く |
bi・bo |
ブロックデバイスからの読み込み・書き込みの量 | 大きい |
wa |
I/O 待ちの CPU 時間の割合 | 高い |
wa は CPU が暇なときにしか増えないので、CPU が忙しいサーバーでは I/O が詰まっていても低く出ることがあります。wa だけで判断せず、次の iostat でディスクの側を確かめます。
ステップ2:iostat -x でどのディスクが詰まっているかを見る
iostat -dxyz 1 5
| オプション | 意味 |
|---|---|
-d |
ディスクの統計だけを出す(CPU の統計を省く) |
-x |
詳しい列を出す |
-y |
最初の1回分(起動時からの平均)を出さない |
-z |
期間中に I/O の無かったデバイスを出さない |
1 5 |
1秒間隔で5回 |
-y を付けないと、最初の1回分は起動してからの平均になり、今の状況とは違う数字が出ます。
見る列は次のとおりです。
| 列 | 意味 |
|---|---|
r/s・w/s |
1秒あたりの読み込み・書き込みの要求数(IOPS) |
rkB/s・wkB/s |
1秒あたりの読み込み・書き込みの量(KB) |
r_await・w_await |
要求1件が終わるまでの平均時間(ミリ秒)。キューで待った時間を含む |
aqu-sz |
処理待ちの要求の平均数(キューの長さ) |
%util |
期間中にデバイスが要求を処理していた時間の割合 |
読み方
r_await・w_awaitが普段より大きく伸びているときは、ディスクが要求をさばききれず、待ちが発生しています。どのくらいが正常かはディスクの種類で大きく違うので、普段の値と比べます。aqu-szが大きいときは、要求がたまっています。%utilは HDD など1件ずつ処理するディスクでは、値が上限近くに張り付いていれば飽和の目安になります。ただし、iostat のマニュアルにあるとおり、RAID や最近の SSD のように複数の要求を同時に処理するデバイスでは、%utilは性能の限界を表しません。SSD や NVMe では%utilが上限近くでも余裕がある場合があるので、awaitとaqu-szで判断します。
古い資料には svctm・avgrq-sz・avgqu-sz などの列が出てきます。現在の sysstat では svctm は表示されず、avgrq-sz は areq-sz(単位は KB)、avgqu-sz は aqu-sz に置き換わっています。
デバイス名(sda・nvme0n1・dm-0 など)がどのファイルシステムに当たるかは、lsblk で確かめられます。
lsblk -o NAME,SIZE,TYPE,MOUNTPOINTS
ステップ3:sar で過去の状況を見る
iostat は今の状況しか見られません。「昨日の夜だけ遅かった」のような場合は、sar が定期的に記録したデータを見ます。
記録を有効にする
# Ubuntu/Debian:記録が無効になっていれば有効にする
grep ENABLED /etc/default/sysstat
sudo sed -i 's/^ENABLED="false"/ENABLED="true"/' /etc/default/sysstat
sudo systemctl enable --now sysstat
sudo systemctl restart sysstat
# RHEL 系
sudo systemctl enable --now sysstat
Debian 13 では、インストールした直後の ENABLED は "false" でした。有効にすると、systemd のタイマー(sysstat-collect.timer)で既定では10分ごとに記録され、Debian/Ubuntu では /var/log/sysstat/、RHEL 系では /var/log/sa/ に日付ごとのファイル(saDD、DD は日)ができます。記録は有効にしたあとの分からしか残らないので、問題が起きる前から有効にしておきます。
記録を見る
# 今日のディスクの記録(-p でデバイス名を sda などで表示)
sar -d -p
# 今日の CPU の記録(%iowait の列を見る)
sar -u
# 10日の記録の、22時から23時まで
sar -d -p -f /var/log/sysstat/sa10 -s 22:00:00 -e 23:00:00
sar -d の列は、tps(1秒あたりの要求数)、rkB/s・wkB/s、areq-sz、aqu-sz、await、%util です。iostat -x と同じ考え方で読み、await と aqu-sz が伸びている時間帯を探します。その時間帯に動いていた処理(バックアップ、cron のバッチ、ログの圧縮など)を突き合わせると、原因が見つかることがよくあります。
sar -d 1 5 のように間隔と回数を付けると、記録ではなく今の状況を測ります。
ステップ4:pidstat と iotop で I/O の多いプロセスを探す
pidstat -d
pidstat -d 1 5
| 列 | 意味 |
|---|---|
kB_rd/s |
プロセスが1秒あたりに読み込んだ量 |
kB_wr/s |
プロセスが1秒あたりに書き込んだ(書き込みを依頼した)量 |
kB_ccwr/s |
書き込みを依頼したが取り消された量 |
iodelay |
ブロック I/O の完了を待った時間(クロック刻み単位) |
ほかのユーザーのプロセスまで見るには sudo を付けて実行します。
iotop
iotop は、top のようにプロセスを I/O の量の順に並べて表示します(sudo apt install iotop などで入れます)。
sudo iotop -o # 実際に I/O をしているプロセスだけを表示
カーネルの設定によっては、起動時に CONFIG_TASK_DELAY_ACCT や kernel.task_delayacct についての警告が出て、IO>(I/O 待ちの割合)の列が表示されません。その場合でも、読み書きの量の列は使えます。
原因が見つかったあとの対処の例
| 見つかった原因 | 対処の例 |
|---|---|
| バックアップやバッチ処理が昼間に走っている | 実行時刻をずらす。ionice -c3 や nice で優先度を下げて実行する |
| データベースの読み込みが多い | 遅いクエリを調べる(WordPressのMySQLスロークエリの調べ方)、メモリ(InnoDB のバッファプール)を増やす |
| メモリ不足でスワップが発生している | vmstat の si・so を確かめる。メモリを増やすか、メモリを使う処理を減らす |
| ログの書き込みが多い | ログの出力量を見直す、ログを別のディスクに分ける |
| ディスクの性能が足りない | HDD から SSD に移す、VPS やクラウドのディスクのプランを見直す |
注意
- 1回の測定は一瞬の状況にすぎません。数分から数十分測る、または
sarの記録で時間の流れを見ます。 - VPS やクラウドでは、同じ物理ディスクを使うほかの利用者の影響や、プランごとの IOPS の上限で遅くなることもあります。
awaitが伸びているのに自分のサーバーの I/O 量が少ない場合は、提供元の情報も確かめます。
sar のほかの使い方(CPU・メモリ・ネットワーク)は Linuxのsarコマンドでシステムの状態を記録する方法 を参照してください。
まとめ
top・vmstatのwaとbで、I/O 待ちが起きているかを見ます。iostat -dxyz 1 5で、r_await・w_await・aqu-szが伸びているディスクを探します。SSD や NVMe では%utilだけで判断しません。- 過去の時間帯は
sar -d -pで見ます。記録はあらかじめ有効にしておきます。 pidstat -dやiotop -oで、読み書きの多いプロセスを特定して対処します。