磁碟 I/O 效能直接決定數據庫、虛擬化、大數據、高併發存儲服務的上限。單純跑分無意義,**關鍵在於模擬真實負載模式(順序/隨機、讀/寫/混合、佇列深度、塊大小、同步/異步)**。本文從基礎 dd 入門,進階至行業標準 fio 專業建模,輔以 hdparm、iostat 系統級分析,構建完整磁碟效能評估體系。
| 指標 | 單位 | 含義 | 關鍵應用場景 |
|---|---|---|---|
| 吞吐量 | MB/s, GB/s | 單位時間傳輸數據量 | 順序讀寫、備份、流媒體、數據倉庫掃描 |
| IOPS | 次/秒 | 每秒 I/O 操作數 | **隨機讀寫、數據庫 OLTP、虛擬機啟動、元數據操作** |
| 延遲 | ms, µs | 單次 I/O 完成時間 (avg/p99/p99.9) | **所有延遲敏感應用、高頻交易、實時系統** |
| 佇列深度 | QD | 並發未完成 I/O 數 | NVMe 高併發、資料庫並發、存儲控制器飽和度 |
/dev/zero:產生無限零字節流(純 CPU/記憶體產生,**無 I/O**,僅測試寫入路徑)。/dev/null:數據黑洞,讀取即丟棄(**無 I/O**,僅測試讀取路徑)。/dev/urandom:產生隨機數(CPU 密集,**會成為瓶頸**,不適合純存儲測試)。oflag=direct 繞過頁面快取,oflag=sync 繞過控制器快取)
# 測試裸設備/分區 (破壞數據! 僅限空盤/測試盤)
# 100k * 4k = 400MB
time dd if=/dev/zero of=/dev/sdb bs=4k count=100000 oflag=direct,sync
# 測試文件系統層 (非破壞)
time dd if=/dev/zero of=/mnt/test/testfile bs=1M count=400 oflag=direct
# 結尾加 conv=fdatasync 確保數據落盤再計時
time dd if=/dev/zero of=/mnt/test/testfile bs=1M count=400 conv=fdatasync
# 讀取裸設備 (跳過快取)
time dd if=/dev/sdb of=/dev/null bs=4k iflag=direct,count=100000
# 讀取文件系統 (先清理快取)
echo 3 > /proc/sys/vm/drop_caches
time dd if=/mnt/test/testfile of=/dev/null bs=1M iflag=direct
# 從裸設備讀寫到文件 (同時產生讀寫 I/O)
time dd if=/dev/sdb of=/mnt/test/rw_test bs=4k
| 參數 | 作用 | 推薦值 |
|---|---|---|
bs | 塊大小 | 4k (隨機基準), 1M/4M (順序帶寬) |
count | 塊數量 (總大小 = bs * count) | ≥ 1G 總數據量減快取影響 |
oflag=direct | 繞過 OS 頁面快取 (O_DIRECT) | **寫入測試必加** |
iflag=direct | 繞過 OS 頁面快存 (O_DIRECT) | **讀取測試必加** |
oflag=sync | 繞過控制器寫快取 (O_SYNC) | 寫入測試建議加 (慢但真實) |
conv=fdatasync | 結束前 fsync 確保落盤 | 文件測試替代 oflag=sync |
status=progress | 顯示進度 (GNU dd) | 長時間測試必加 |
# RHEL/CentOS/Fedora
yum install -y fio
# Debian/Ubuntu
apt-get install -y fio
# 典型任務文件: job.fio
[global]
ioengine=libaio # 異步 I/O 引擎 (Linux 原生高效能)
direct=1 # O_DIRECT 繞過快取
buffered=0 # 禁用用戶態緩衝
norandommap=1 # 完全隨機分佈
randrepeat=0 # 每次運行不同隨機種子
time_based=1 # 基於時間運行
runtime=60 # 運行 60 秒
ramp_time=5 # 預熱 5 秒
group_reporting=1 # 合併報告
numjobs=4 # 4 個並發進程/線程
iodepth=32 # 佇列深度 32 (NVMe 建議 64-128)
# 順序讀 1M 塊
[seq-read-1m]
readwrite=read
bs=1m
size=10g
directory=/mnt/test
# 順序寫 1M
[seq-write-1m]
readwrite=write
bs=1m
size=10g
directory=/mnt/test
# 隨機讀 4k (數據庫 OLTP 核心指標)
[rand-read-4k]
readwrite=randread
bs=4k
size=10g
directory=/mnt/test
# 隨機寫 4k
[rand-write-4k]
readwrite=randwrite
bs=4k
size=10g
directory=/mnt/test
# 隨機讀寫混合 7:3 (典型數據庫負載)
[rand-rw-70-30-4k]
readwrite=randrw
rwmixread=70
bs=4k
size=10g
directory=/mnt/test
fio job.fio --output-format=json,normal --output=fio_result.json
# 隨機讀 4k, 4 進程, QD32, 10G 文件, 運行 60s
fio -name=randread -ioengine=libaio -direct=1 -rw=randread -bs=4k -size=10G -numjobs=4 -iodepth=32 -runtime=60 -time_based -group_reporting -directory=/mnt/test
# 隨機寫 4k
fio -name=randwrite -ioengine=libaio -direct=1 -rw=randwrite -bs=4k -size=10G -numjobs=4 -iodepth=32 -runtime=60 -time_based -group_reporting -directory=/mnt/test
# 順序讀 1M
fio -name=seqread -ioengine=libaio -direct=1 -rw=read -bs=1M -size=10G -numjobs=4 -iodepth=32 -runtime=60 -time_based -group_reporting -directory=/mnt/test
# 混合讀寫 70% 讀
fio -name=randrw73 -ioengine=libaio -direct=1 -rw=randrw -rwmixread=70 -bs=4k -size=10G -numjobs=4 -iodepth=32 -runtime=60 -time_based -group_reporting -directory=/mnt/test
# 實時監控設備利用率、吞吐、等待、佇列
iostat -xmt 1 /dev/sdb
# 輸出關鍵欄位:
# %util: 設備飽和度 (接近 100% 為瓶頸)
# await: 平均 I/O 等待時間 (ms)
# svctm: 平均服務時間 (ms)
# aqu-sz: 平均佇列深度
# r/s, w/s: 每秒讀寫次數
# rMB/s, wMB/s: 每秒讀寫 MB

磁碟效能測試不是跑分遊戲,而是**為容量規劃、架構選型、故障基線、SLA 承諾提供科學依據**。確立 fio 為標準建模工具,構建「負載模型 → 基線建立 → 變更驗證 → 異常對比」閉環,將存儲效能從黑盒變為可度量、可預測、可優化的工程指標。