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