系統回應緩慢、應用程式無反應、甚至死機。經觀察發現 top 中 wa(I/O wait)長期超過 30%,iostat 顯示 %util 接近 100%,確認為硬碟 I/O 瓶頸。
top - 16:15:05 up 6 days, 6:25, 2 users, load average: 1.45, 1.77, 2.14
Tasks: 147 total, 1 running, 146 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2% us, 0.2% sy, 0.0% ni, 86.9% id, 12.6% wa, 0.0% hi, 0.0% si
Mem: 4037872k total, 4003648k used, 34224k free, 5512k buffers
Swap: 7164948k total, 629192k used, 6535756k free, 3511184k cached
關鍵指標: wa = 12.6%(I/O 等待佔 CPU 時間比)。經驗值: wa > 30% 表示 I/O 壓力嚴重。
# 若無指令,先安裝:yum install -y sysstat
iostat -x 1 10
輸出關鍵欄位解讀:
| 欄位 | 含義 | 警戒閾值 |
|---|---|---|
| %util | 裝置頻寬使用率 | > 80% 持續即為瓶頸 |
| await | 平均 I/O 等待時間(ms) | > 20ms 需關注 |
| svctm | 平均服務時間(ms) | 接近 await 表示隊列擁塞 |
| avgqu-sz | 平均請求隊列長度 | > 10 明顯擁塞 |
| r/s, w/s | 每秒讀/寫請求數 | 結合 rkB/s, wkB/s 判斷負載型態 |
範例輸出:
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdb 0.00 1122 17.00 9.00 192.00 9216.00 96.00 4608.00 123.79 137.23 1033.43 13.17 100.10
sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
結論: sdb %util 100.10%、await 1033ms、avgqu-sz 137,明顯寫入瓶頸(wrqm/s 1122 大量合併寫入)。
vmstat 1
關注 b 欄(等待資源的進程數)。若 b 持續 > 0 且 wa 高,確認有進程因 I/O 阻塞。
建立 2GB 測試檔,觀察系統極限:
time dd if=/dev/zero bs=1M count=2048 of=direct_2G oflag=direct
oflag=direct 繞過頁面快取,直寫磁碟,測試真實裝置效能iostat -x 1 觀察 %util、await 變化# 1. pidstat 顯示每進程 I/O 統計(需 sysstat 9.0+)
pidstat -d 1
# 2. iotop 即時顯示進程讀寫頻寬(需安裝)
iotop -o
# 3. /proc 手動分析
while true; do
for pid in $(ps -eo pid); do
if [[ -f /proc/$pid/io ]]; then
rbytes=$(awk '/read_bytes/ {print $2}' /proc/$pid/io)
wbytes=$(awk '/write_bytes/ {print $2}' /proc/$pid/io)
[[ $rbytes -gt 1000000 || $wbytes -gt 1000000 ]] && echo "PID $pid: R=$rbytes W=$wbytes"
fi
done
sleep 2
done
noatime 掛載選項、deadline/noop I/O 排程器(SSD 建議 noop)vm.dirty_ratio、vm.dirty_background_ratio、vm.dirty_expire_centisecs 調整髒頁回寫積極度