文章目錄
- 手撕FIO工具指南:從壓測翻車到避坑實戰
- 一、背景:一次FIO壓測引發的驚魂夜
- 二、FIO vs 其他IO工具:為何讓人又愛又怕?
- 三、安裝指南:避開依賴地獄
- 四、參數詳解
- 五、避坑指南:血淚經驗總結
- 六、安全壓測命令模板(生產環境驗證)
手撕FIO工具指南:從壓測翻車到避坑實戰
一、背景:一次FIO壓測引發的驚魂夜
最近安排做一組服務器IO性能壓測,網上找了一篇關于推薦FIO進行測試,果斷就執行了
fio -filename=/dev/sda -direct=1 -iodepth=32 -rw=randrw -rwmixread=70 -bs=4k -numjobs=8 -runtime=300 -group_reporting -name=test_randrw
做完之后,啥事都沒有,過了兩天重啟之后就讓我無語了,重啟不了了。。。
教訓總結:
- 不能直接測試系統盤
-filename=/dev/sda
- 但是fio命令狗哦,你一個搞測試的,整壞人家系統盤干啥。。。
二、FIO vs 其他IO工具:為何讓人又愛又怕?
- 主流工具對比
工具 | 優勢 | 缺陷 |
---|---|---|
dd | 簡單易用 | 僅測順序讀寫,無并發 |
iostat | 實時監控 | 無法主動發起壓力測試 |
fio | 支持多線程、混合負載、延遲統計 | 參數復雜,高危操作多 |
- FIO核心優勢
- 19種I/O引擎(如
libaio
異步引擎) - 模擬真實業務負載(隨機/順序讀寫比例可調)
- 輸出專業級報告(延遲百分比、IOPS分布)
三、安裝指南:避開依賴地獄
- 包管理器安裝(推薦)
CentOS
yum install epel-release -y # 需EPEL源
yum install fio libaio-devel -y Ubuntu
apt-get install fio -y
四、參數詳解
fio 核心參數詳解表
參數 | 作用 | 典型值示例 | 注意事項 |
---|---|---|---|
filename | 指定測試目標(文件/設備路徑) | /dev/sdb 、/mnt/testfile | - 測試裸設備時需確保未掛載且無數據 - 文件路徑需提前創建足夠空間] |
rw | 定義讀寫模式 | read 、randrw 、trim | - randrw 需搭配rwmixread/rwmixwrite 定義讀寫比例] |
bs | 單次I/O塊大小 | 4k 、1M 、16k-64k | - 過大的塊可能導致帶寬虛高(如順序測試)] |
iodepth | I/O隊列深度(異步請求數) | 1 、32 、64 | - 過高可能導致設備過載(SSD建議≤64) - 同步引擎(如sync)下無效] |
numjobs | 并發線程/進程數 | 4 、16 | - 多線程可能因CPU爭用導致結果波動] |
direct | 是否繞過系統緩存(1=啟用) | 0 、1 | - 啟用后測試結果更真實,但可能增加磁盤壓力] |
ioengine | I/O引擎類型 | libaio 、sync 、psync | - libaio 需安裝libaio-devel 依賴- psync 為多線程同步引擎] |
runtime | 測試運行時長(秒) | 60 、600 | - 過短可能導致結果不穩定(建議≥60秒)] |
size | 測試數據總量 | 10G 、50% | - 使用百分比時需確認目標設備剩余空間] |
group_reporting | 匯總所有線程結果(1=啟用) | 1 | - 關閉時輸出每個線程的獨立數據] |
rwmixread | 混合讀寫中的讀操作比例 | 70 (即70%讀) | - 僅對rw=randrw 或rw=rw 有效] |
bssplit | 混合塊大小測試(按比例分配不同bs) | 4k/50:64k/50 | - 比例總和需為100%,否則自動均分] |
random_distribution | 隨機I/O分布模式 | random 、zipf:1.2 | - zipf 模擬熱點訪問,需根據實際負載選擇] |
refill_buffers | 每次I/O后重新填充緩沖區內容 | 1 | - 啟用后測試更貼近真實數據寫入(避免重復寫同一數據)] |
time_based | 強制按runtime 運行(即使數據量未達size ) | 1 | - 需同時設置runtime ] |
ramp_time | 測試前預熱時間(秒) | 10 、30 | - 避免冷啟動階段數據影響結果] |
iodepth_batch | 批量提交I/O請求的閾值(僅libaio 有效) | 16 、32 | - 過高可能導致突發負載] |
rate | 限制I/O速率(單位:KB/s) | 100M 、512k | - 用于模擬限速場景(如網絡存儲)] |
cpus_allowed | 綁定測試進程到指定CPU核心 | 0-3 、1,3,5 | - 減少CPU爭用對結果的影響] |
五、避坑指南:血淚經驗總結
-
路徑陷阱
- 禁止直接測試
/dev/sda
等系統盤,用df -h
確認測試對象 - 文件測試模式需預先
fallocate -l 10G /testfile
- 禁止直接測試
-
資源保護
- 限制CPU占用:
-numjobs=$(nproc)
避免過載 - 內存保護:添加
-ramp_time=30
逐步加壓
- 限制CPU占用:
-
監控三件套
iostat -xmt 1 # 磁盤利用率 pidstat -d 1 # 進程級IO監控 sar -B 1 # 分頁活動
六、安全壓測命令模板(生產環境驗證)
- 隨機讀安全測試(SSD驗證)
fio -filename=/mnt/ssd/testfile -direct=1 -rw=randread -bs=4k \-iodepth=64 -numjobs=4 -runtime=120 -size=50G -name=ssd_randread
- 順序寫帶寬測試(HDD驗證)
fio -filename=/data/testfile -direct=1 -rw=write -bs=1M \-iodepth=8 -runtime=300 -size=200G -name=hdd_seqwrite
- 混合負載測試(數據庫場景)
fio -filename=/var/lib/mysql/testfile -direct=1 -rw=randrw -rwmixread=70 \-bs=8k -iodepth=32 -numjobs=8 -runtime=600 -group_reporting