💾
概念 #システムパフォーマンス #Brendan Gregg #Linux #SRE #読書ノート #ディスク #iostat 📚 詳解 システム・パフォーマンス

詳解 システム・パフォーマンス - 第9章:ディスク分析

iostat詳細・ディスクレイテンシ・I/Oスケジューラ・biolatencyの実践ガイド。HDD/SSD の特性とUSE法によるディスク診断。

ディスクのUSE法

指標意味コマンド閾値の目安
Utilization(使用率)ディスクがビジーな時間の割合iostat %util> 80% で注意
Saturation(飽和度)I/Oキューの長さiostat avgqu-sz> 1 で要確認
Errors(エラー)I/Oエラー数dmesg, smartctl0 であるべき

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/s1秒あたりのリード/ライトリクエスト数スループット(IOPS)の指標
rMB/s, wMB/s1秒あたりの読み書きデータ量帯域幅の指標
avgrq-sz平均リクエストサイズ(512バイト単位)小さい = ランダムI/O、大きい = シーケンシャル
avgqu-szI/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 の特性比較

特性HDDSSD
シーケンシャル読み込み100〜200 MB/s500MB/s〜7GB/s(NVMe)
ランダム読み込み(IOPS)100〜200 IOPS数十万〜数百万 IOPS
レイテンシ5〜15ms(シーク時間)0.01〜0.1ms
await の目安< 20ms< 1ms
%util = 100%飽和している飽和していない可能性あり(並列処理できる)

重要:SSD の %util は参考程度。awaitavgqu-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等)を確認

出典: 詳解 システム・パフォーマンス 第2版 Brendan Gregg著