💾
詳解 システム・パフォーマンス - 第9章:ディスク分析
iostat詳細・ディスクレイテンシ・I/Oスケジューラ・biolatencyの実践ガイド。HDD/SSD の特性とUSE法によるディスク診断。
ディスクのUSE法
| 指標 | 意味 | コマンド | 閾値の目安 |
|---|---|---|---|
| Utilization(使用率) | ディスクがビジーな時間の割合 | iostat %util | > 80% で注意 |
| Saturation(飽和度) | I/Oキューの長さ | iostat avgqu-sz | > 1 で要確認 |
| Errors(エラー) | I/Oエラー数 | dmesg, smartctl | 0 であるべき |
iostat の完全ガイド
# 基本形(1秒ごとに継続表示)
iostat -xz 1
# オプションの意味:
# -x: 拡張統計(await, %util 等)
# -z: 統計が0のデバイスを省略
# -m: MB/s 単位で表示
# -p sda: 特定デバイスのみ
各列の読み方
Device rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 5.00 0.0 100.0 0.0 50.0 512.0 2.0 20.0 0.0 20.0 8.0 80.0
| 列名 | 説明 | 解釈のポイント |
|---|---|---|
r/s, w/s | 1秒あたりのリード/ライトリクエスト数 | スループット(IOPS)の指標 |
rMB/s, wMB/s | 1秒あたりの読み書きデータ量 | 帯域幅の指標 |
avgrq-sz | 平均リクエストサイズ(512バイト単位) | 小さい = ランダムI/O、大きい = シーケンシャル |
avgqu-sz | I/Oキューの平均長 | > 1 で飽和の兆し、> 4 で深刻 |
await | リクエストの平均待ち時間(ms) | HDD < 20ms、SSD < 1ms が目安 |
r_await / w_await | 読み込み/書き込みの待ち時間 | 読み書きを分けて分析できる |
%util | ディスク使用率 | > 80% で飽和の可能性、SSDは100%でも飽和しないことがある |
ディスクレイテンシの分布(biolatency)
await の平均値だけでは外れ値(遅いリクエスト)を見逃す。ヒストグラムで分布を確認する。
# BCC tool: biolatency
sudo biolatency
# Tracing block device I/O... Hit Ctrl-C to end.
# ^C
# usecs : count distribution
# 0 -> 1 : 0 | |
# 2 -> 3 : 0 | |
# 4 -> 7 : 32 |*** |
# 8 -> 15 : 189 |***************** |
# 16 -> 31 : 431 |*************** |
# 32 -> 63 : 115 |******* |
# 1024->2047 : 5 |* | ← 外れ値(遅い)
# 2048->4095 : 1 | | ← 非常に遅いリクエスト
# 特定デバイスのみ
sudo biolatency -d sda
# フラグ付きで詳細表示(-F: per-flag histogram)
sudo biolatency -F
どのプロセスがディスクI/Oをしているか
# iotop(対話型ディスクI/Oモニター)
sudo iotop
# 上位プロセスのI/O使用量をリアルタイム表示
sudo iotop -b -n 3 # バッチモードで3回分
# pidstat でI/O統計(プロセス別)
pidstat -d 1 5
# kB_rd/s: 読み込み KB/秒
# kB_wr/s: 書き込み KB/秒
# iodelay: I/O待ちでブロックされた時間(クロック ticks)
# bpftrace でディスクI/Oとプロセスを紐づける
sudo bpftrace -e '
tracepoint:block:block_rq_issue {
@[comm, pid] = count();
}
' -c "sleep 10"
ディスクI/Oのパターン分析
ランダム vs シーケンシャル
# avgrq-sz(平均リクエストサイズ)で判断
iostat -xz 1
# avgrq-sz < 64 セクタ(32KB) → ランダムI/O(DB等)
# avgrq-sz > 128 セクタ(64KB) → シーケンシャルI/O(大ファイル読み込み)
# HDD の場合:ランダムI/O は非常に遅い(シーク時間がかかる)
# SSD の場合:ランダム/シーケンシャルの差は小さい
書き込みパターン(Write-back vs Write-through)
# ダーティページ(未書き込みキャッシュ)の状況
cat /proc/meminfo | grep -i dirty
# Dirty: 102400 kB ← 100MB の書き込みが溜まっている
# Writeback: 4096 kB ← 現在書き込み中
# フラッシュを手動でトリガー(デバッグ用)
sync
echo 3 > /proc/sys/vm/drop_caches # キャッシュを解放(本番では注意)
S.M.A.R.T.(ディスクの健康状態)
# S.M.A.R.T. データの確認
sudo smartctl -a /dev/sda
# 重要な属性:
# 5 Reallocated_Sector_Ct → 増加 = ディスク劣化のサイン
# 187 Reported_Uncorrectable → エラーが多い = 交換検討
# 188 Command_Timeout → タイムアウトが多い
# 197 Current_Pending_Sector → 不安定なセクタ(増加は危険)
# 198 Offline_Uncorrectable → 0 であるべき
# ヘルスチェック
sudo smartctl -H /dev/sda
# SMART overall-health self-assessment test result: PASSED
HDD vs SSD の特性比較
| 特性 | HDD | SSD |
|---|---|---|
| シーケンシャル読み込み | 100〜200 MB/s | 500MB/s〜7GB/s(NVMe) |
| ランダム読み込み(IOPS) | 100〜200 IOPS | 数十万〜数百万 IOPS |
| レイテンシ | 5〜15ms(シーク時間) | 0.01〜0.1ms |
| await の目安 | < 20ms | < 1ms |
| %util = 100% | 飽和している | 飽和していない可能性あり(並列処理できる) |
重要:SSD の %util は参考程度。await と avgqu-sz でボトルネックを判断する。
ディスク問題のチェックリスト
□ iostat -xz 1 で %util・await・avgqu-sz を確認
□ %util > 80% または await が目安を超えていたら調査開始
□ sudo biolatency でレイテンシ分布を確認(外れ値がないか)
□ sudo iotop でI/Oを使っているプロセスを特定
□ pidstat -d でプロセス別I/Oを時系列確認
□ dmesg でディスクエラーがないか確認
□ smartctl -H で S.M.A.R.T. ヘルスを確認
□ avgrq-sz でランダム/シーケンシャルの傾向を確認
□ ファイルシステムのマウントオプション(noatime等)を確認 - 1. 📊詳解 システム・パフォーマンス - 概要・読み方ガイド
- 2. 🔍詳解 システム・パフォーマンス - 第16章:ケーススタディ
- 3. 🧭詳解 システム・パフォーマンス - 第2章:メソドロジ
- 4. 🐧詳解 システム・パフォーマンス - 第3章:オペレーティングシステム
- 5. 🔭詳解 システム・パフォーマンス - 第4章:可観測性ツール
- 6. ⚙️詳解 システム・パフォーマンス - 第5章:アプリケーション
- 7. 💻詳解 システム・パフォーマンス - 第6章:CPU分析
- 8. 🧠詳解 システム・パフォーマンス - 第7章:メモリ分析
- 9. 📁詳解 システム・パフォーマンス - 第8章:ファイルシステム分析
- 10. 💾詳解 システム・パフォーマンス - 第9章:ディスク分析
- 11. 🌐詳解 システム・パフォーマンス - 第10章:ネットワーク分析
- 12. ☁️詳解 システム・パフォーマンス - 第11章:クラウドコンピューティング
- 13. 📏詳解 システム・パフォーマンス - 第12章:ベンチマーキング
- 14. 🔥詳解 システム・パフォーマンス - 第13章:perf
- 15. 🔬詳解 システム・パフォーマンス - 第14章:Ftrace
- 16. ⚡詳解 システム・パフォーマンス - 第15章:BPF/eBPF
出典: 詳解 システム・パフォーマンス 第2版 Brendan Gregg著