Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux 磁碟讀寫效能測試實戰:dd、fio、hdparm 與真實負載模擬

編輯:關於 Linux

磁碟 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 高併發、資料庫並發、存儲控制器飽和度

工具選型決策樹

  • dd:快速順序讀寫基準、設備煙霧測試、無依賴環境。**不支援隨機 I/O、佇列深度控制、延遲分佈統計。**
  • hdparm:僅順序讀、緩存測試、設備能力上限快速檢視。**不寫入、不隨機。**
  • fio:行業標準、全能。支援任意負載模型、多線程/進程、詳細統計報告、JSON 輸出、腳本化 CI/CD 集成。**生產環境評測唯一推薦。**
  • iperf3 / rados bench / sysbench fileio:網絡/分布式/數據庫特定負載模擬。

基礎篇:dd 快速基準(理解原理與局限)

特殊設備文件

  • /dev/zero:產生無限零字節流(純 CPU/記憶體產生,**無 I/O**,僅測試寫入路徑)。
  • /dev/null:數據黑洞,讀取即丟棄(**無 I/O**,僅測試讀取路徑)。
  • /dev/urandom:產生隨機數(CPU 密集,**會成為瓶頸**,不適合純存儲測試)。

測試模板(必加 oflag=direct 繞過頁面快取,oflag=sync 繞過控制器快取)

1. 純順序寫入(測試寫入帶寬上限)


# 測試裸設備/分區 (破壞數據! 僅限空盤/測試盤)
# 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

2. 純順序讀取(測試讀取帶寬上限)


# 讀取裸設備 (跳過快取)
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

3. 讀寫混合(簡易模擬)


# 從裸設備讀寫到文件 (同時產生讀寫 I/O)
time dd if=/dev/sdb of=/mnt/test/rw_test bs=4k

dd 關鍵參數速查

參數作用推薦值
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)長時間測試必加

進階篇:fio 專業負載建模(生產環境標準)

安裝


# 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

關鍵指標關注點

  • IOPS:`read: IOPS=...` / `write: IOPS=...`
  • 帶寬:`read: BW=...` / `write: BW=...` (MiB/s)
  • 延遲分佈:`clat percentiles (usec): | 1.00th=[ 100], 50.00th=[ 150], 99.00th=[ 500], 99.90th=[ 1200], 99.99th=[ 3000]` → **關注 p99/p99.9/p99.99**。
  • CPU 佔用:`cpu: usr=..., sys=...` 過高說明 I/O 路徑或中斷處理成本大。
  • 完成延遲:`lat (usec): min=..., max=..., avg=..., stdev=...`

常見負載模板一鍵運行(命令行模式,無需文件)


# 隨機讀 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 與 /proc 監控


# 實時監控設備利用率、吞吐、等待、佇列
iostat -xmt 1 /dev/sdb
# 輸出關鍵欄位:
# %util: 設備飽和度 (接近 100% 為瓶頸)
# await: 平均 I/O 等待時間 (ms)
# svctm: 平均服務時間 (ms)
# aqu-sz: 平均佇列深度
# r/s, w/s: 每秒讀寫次數
# rMB/s, wMB/s: 每秒讀寫 MB

NVMe 專項測試注意事項

  • 使用 `ioengine=io_uring` (內核 5.1+,fio 3.20+) 釋放 CPU 中斷開銷,發揮 NVMe 真實效能。
  • 佇列深度 `iodepth` 設 64~256(單隊列),多命名空間/多進程並發。
  • 關注 `nvme smart-log /dev/nvme0` 溫度、介質單元、控制器忙碌時間。
  • 測試前 `nvme format -s 1 /dev/nvme0n1` 安全擦除並重置 FTL(生產嚴禁)。

避坑指南與最佳實踐

  1. 測試環境隔離:專用測試盤/分區,**嚴禁生產數據盤直接測試**。
  2. 預熱與穩態:SSD 需預寫滿觸發 GC 穩態(`fio` `ramp_time`、或先順序寫滿),HDD 需預熱機械臂。
  3. 文件系統 vs 裸設備:文件系統測試含元數據/日誌/快取開銷;裸設備測試純塊設備能力。按應用部署層選擇。
  4. 快取控制:測試前 `echo 3 > /proc/sys/vm/drop_caches`,`fio` 指定 `direct=1 buffered=0`。
  5. 多次運行取中位數:單次波動大,至少 3 次取中位數。
  6. 記錄完整上下文:內核版本、文件系統/掛載參數、控制器快寫策略、CPU 型號/頻率、測試時間、環境溫度。

磁碟測試示意圖

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

Copyright © Windows教程網 All Rights Reserved