文章目录
- 手撕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