サーバーのレスポンスが悪化し、調査すると
- I/O wait が高い
- CPU使用率は低い
- メモリも余裕がある
このような状態で多くの場合、 ディスクI/Oの逼迫が発生しています。
本記事では、 ディスクI/Oが逼迫する典型的な原因を 「ログ」「バックアップ」「DB」に分けて解説し、 運用現場でそのまま使える対処方法を整理します。
目次
結論:ディスクI/O逼迫は「処理量 × タイミング × 構成」で決まる
ディスクI/Oは、
- 大量に書き込む処理
- 一気に読み込む処理
- 同時実行される処理
が重なることで簡単に限界に達します。
重要なのは、 「何が」「いつ」「どれくらい」I/Oを出しているか を把握することです。
まず確認:本当にディスクI/Oが逼迫しているか
確認コマンド
iostat -x 1
見るべき指標
- %util
- await
判断基準
- %util が 80~100% に張り付く → 明確な逼迫
- await が高い → I/O応答遅延
原因①:ログ出力が多すぎる
よくあるケース
- アプリケーションのデバッグログ
- アクセスログの大量出力
- エラーループによるログ増加
確認方法
iotop
ログ関連プロセスが常に上位に表示される場合、 ログ出力が原因の可能性が高いです。
対処方法
- ログレベルを下げる(INFO → WARN)
- 不要なログ出力を停止
- ログを別ディスクに分離
解決した判断基準
- ログ出力量が減少
- iostat の %util が低下
原因②:ログローテートが集中実行されている
問題点
logrotate は 圧縮・リネーム・削除を一気に行うため、 短時間で大量I/Oを発生させます。
確認方法
crontab -l
ls /etc/cron.*
対処方法
- 実行時間をピーク外に変更
- 圧縮を遅延実行(delaycompress)
- 同時ローテート数を減らす
解決した判断基準
- 特定時刻のみのI/Oスパイクが消える
原因③:バックアップ処理による大量I/O
よくある例
- rsync によるフルバックアップ
- tar + gzip の一括圧縮
- スナップショット取得
確認方法
iotop
ps aux | grep backup
対処方法
- 差分バックアップに変更
- nice / ionice で優先度を下げる
- バックアップ時間を分散
解決した判断基準
- バックアップ中でもサービス影響が出ない
原因④:データベース(DB)のI/O負荷
典型的な原因
- フルスキャンが頻発
- インデックス不足
- チェックポイント・フラッシュ集中
確認方法
iotop
top
DBプロセス(mysqld など)がI/O上位を占めます。
対処方法
- インデックス設計の見直し
- バッファサイズ調整
- 不要なクエリの停止
解決した判断基準
- DB処理時の await が低下
- レスポンス改善
原因⑤:ディスク性能そのものが不足
兆候
- 常時 %util が高い
- 対処しても改善しない
対処方法
- SSD / NVMe への変更
- ディスク分割(ログ・DB分離)
- RAID / ストレージ構成見直し
「解決した」と判断できる状態
- iostat の %util が安定して低い
- await が数msレベル
- I/O wait が常時低下
- 業務時間帯の遅延が消える
実務向けチェックリスト
- iostat で逼迫確認
- iotop で犯人特定
- ログ・バックアップ・DBを疑う
- 時間帯と処理内容を確認
- 構成見直しで根本対応
まとめ
ディスクI/O逼迫は、 原因を特定できれば対処は難しくありません。
重要なのは、 感覚ではなく数値で判断することです。
本記事の手順で確認すれば、 「なぜ遅いのか」「どう直すか」が明確になります。
あわせて読みたい


サーバー負荷は低いのにレスポンスが悪い時の見方
サーバー監視画面を見ると、 CPU使用率も低く、メモリも余裕がある。 それなのに、 画面表示が遅い APIの応答がワンテンポ遅れる SSHや管理画面の反応が悪い このような…
あわせて読みたい


I/O waitが高い時にやるべき切り分け手順
サーバーが遅い、レスポンスが悪いと感じて調査すると、 CPU使用率は低い メモリも余裕がある しかし I/O wait(wa)が高い という状態に遭遇することがあります。 本記…
