🐧 Linux 総合学習プラットフォーム
プロセス監視/障害対応 ・ 中級

ディスクI/Oが遅いとき(iostat・iotop)

「CPUは暇なのにやけに重い」と感じたら、犯人はディスクの読み書き待ち、つまりI/Oかもしれません。top の wa やロードアベレージで疑いを持ち、iostat -x でデバイスごとの詰まり具合を、iotop でどのプロセスが読み書きしているかを特定します。ログの暴走やバックアップ処理など、よくある原因の型も併せて押さえます。

「top を見てもCPUは全然使われていない。なのに操作すると固まる」――この食い違いに出会ったら、疑うべきはCPUではなくディスクの読み書き、つまりI/Oだ。

CPUが忙しいときの重さと、I/O待ちの重さは体感がよく似ている。だが原因も対処もまるで違う。CPUを増強しても、ボトルネックがディスクなら何も変わらない。ここを見誤ると、的外れな対処に時間を溶かしてしまう。

🔗
たとえCPUの過負荷はレジの店員が足りず行列ができている状態。I/O待ちは店員は暇なのに商品を取りに行った倉庫係が戻ってこない状態だ。店員(CPU)を増やしても倉庫(ディスク)が遅ければ行列は解消しない。

🕵 まず疑うサイン——top の wa

最初の手がかりは、すでに使い慣れた top の中にある。画面上部の %Cpu(s) 行にある wa(I/O待ち)の値だ。

us や sy が低いのに wa が高い、あるいはロードアベレージだけが妙に高いのにCPU使用率は低い――こういう組み合わせを見たら、I/O待ちを強く疑う。

💡
ポイント「ロードアベレージは高いのにCPUは暇」「操作すると固まるのにtopのus/syは低い」――この食い違いこそがI/O待ちのサインだ。
CPU過負荷us/sy が高い計算そのものが重い→ top で犯人プロセスI/O待ちwa が高い・us/syは低いディスク待ちで詰まる→ iostat/iotopへ両者は体感が似ているが対処はまるで違う

疑いを持ったら、次はディスクそのものの詰まり具合を数値で確かめる段階に進む。

📊 iostat -x でデバイスの詰まりを見る

ディスクI/Oを詳しく見る定番が iostat だ。sysstat パッケージに含まれる。

iostat -x 1 のように実行すると、1秒間隔でデバイスごとの詳細な統計が流れ続ける。数ある列の中でも、まず見るべきは %util と await の2つだ。

iostat -x 1 ……1秒おきにデバイス単位の拡張統計を表示し続ける(Ctrl+Cで停止)。%util・await・r/s・w/s などの列が並ぶ。

%util は、そのデバイスが処理でどれくらいの時間ふさがっていたかを表す割合だ。100%に張り付いていれば、そのディスクは休みなく処理し続けている、つまり限界に近い状態だと分かる。

await は、1回のI/O要求が発行されてから完了するまでにかかった平均時間(ミリ秒)だ。この値が普段より大きく伸びていれば、要求がなかなか捌けず待たされている証拠になる。

ほかにも r/s(1秒あたりの読み取り回数)と w/s(1秒あたりの書き込み回数)、rkB/s・wkB/s(1秒あたりの転送量)といった列がある。await や %util が「詰まっているかどうか」を教えてくれるのに対し、これらは「どれだけの量をこなしているか」を表す。回数は少ないのに await が長いなら、1回あたりの処理が重い大きなI/Oが起きている可能性が高い。

Device r/s w/s await 48.2%util 97.5%utilデバイスが塞がっていた割合await1回の要求が完了するまでの時間%utilが高止まり・awaitが普段より長い=そのディスクが限界
つまずき%util はあくまで「稼働していた割合」であり、並列に処理できるSSDなどでは100%未満でも実は限界近いこともある。数値は絶対視せず、普段の値と比べて「明らかに違う」かどうかで判断する。

🔎 iotop でどのプロセスが読み書きしているか

iostat でディスク全体の詰まりが分かっても、それだけでは「誰が」原因かまでは分からない。次に使うのが iotop だ。

iotop は top によく似た画面で、プロセスごとの読み書き速度(DISK READ / DISK WRITE)をリアルタイムに表示する。上位に居座り続けるプロセスが、I/O負荷の犯人である可能性が高い。

iotop -o ……-o(only)を付けると、実際にI/Oを発生させているプロセスだけに絞って表示され、犯人を見つけやすい。
コツiotop は多くのディストリビューションで標準搭載されておらず、別途インストールが必要なことが多い。事前に入れておくと、いざというときすぐ使える。

🧩 原因の型を知っておく

I/Oが詰まる原因にはいくつかの定番パターンがある。型を知っておくと、iotop で見つけたプロセスの意味を素早く理解できる。

よくあるのが、肥大化したログファイルへの書き込みが止まらない「ログ暴走」だ。エラーが大量発生し続けるアプリが、その分だけログを書き続けてディスクを占有する。

バックアップ処理も定番の原因だ。深夜のバックアップジョブが大量のファイルを読み書きし、同時間帯の他の処理を巻き込んで遅くする。スケジュールが重なっていないかを確認する価値がある。

メモリ不足によるスワップの多発も、実はI/O問題として観測される。スワップの読み書きはディスクI/Oそのものなので、iostat 上は普通のI/O負荷として見える。この場合は free -h や vmstat も併せて確認し、真因がメモリ側にないかを見極める。

💡
ポイントI/Oが遅いという現象1つの裏に、ログ暴走・バックアップ・スワップという性質の異なる原因が隠れうる。iotop で見つけたプロセス名から、この3パターンのどれに当てはまるかをまず考えると対処が早い。

そして単純に、遅いディスクを使っている場合もある。とくに仮想化環境やクラウドの共有ストレージでは、他のテナントの負荷につられて自分のディスク性能が一時的に落ちることもあり、自分のサーバ内だけを見ていても分からないケースがある点は覚えておきたい。

💽 SSDとHDDの特性差

🔗
たとえHDDは目的のデータまで針(ヘッド)を物理的に動かして探しに行くレコードプレーヤー、SSDは番地を指定すればすぐ読み書きできる電子的な棚のようなものだ。ランダムな小さいアクセスが多いほど、この差は体感速度に大きく響く。

HDDは連続した大きなデータの読み書きは得意だが、あちこちに散らばった小さなファイルへのランダムアクセスは苦手だ。物理的にヘッドを動かす必要があるため、待ち時間(await)が伸びやすい。

SSDはランダムアクセスに強く、全体的に高速だが、無限の性能があるわけではない。書き込みが集中すれば、SSDでも%utilが張り付き、awaitが伸びることは起こりうる。

つまずき同じSSDでも接続方式によって性能差は大きい。従来のSATA接続より、NVMe接続のSSDのほうが桁違いに高速な傾向がある。同じ「SSDだから速いはず」という思い込みで判断せず、awaitの実測値を見て判断したほうが確実だ。

ディスクの特性を知っておくと、「このワークロードなら遅くて当然」なのか「普段より明らかにおかしい」のかを判断しやすくなる。iostat と iotop をセットで使い、詰まっている場所と原因プロセスの両方を押さえるのが、I/O障害の切り分けの基本形だ。

この項目に出てくる用語

%util(デバイス使用率)ゆーてぃる
iostatが示す、そのディスクが処理でふさがっていた時間の割合。
await(I/O待ち時間)あうぇいと
iostatが示す、I/O要求の発行から完了までにかかった平均時間(ミリ秒)。

関連コマンド

iotop

▶ 学習アプリでこの続きを学ぶ・演習する