FIO是Linux下真实模拟磁盘极限压力的唯一可靠工具,需绕过缓存、区分设备类型、禁用挂载文件系统;安装需libaio支持,版本不低于3.16;SSD/NVMe用libaio+高iodepth,HDD用sync+iodepth=1;结果关注IOPS、99.9th延迟和吞吐量。

要在Linux系统中真实模拟数据库、日志写入或高并发文件服务等场景下的磁盘极限压力,必须绕过缓存、控制并发深度、区分设备类型,并避免误测文件系统导致数据损坏——dd和hdparm这类工具完全无法满足这些要求。
安装FIO并验证基础环境
先确认系统已启用libaio支持:运行 ls /usr/lib64/libaio.so*,若无输出需执行 yum install libaio-devel -y(CentOS/RHEL)或 apt-get install libaio-dev -y(Ubuntu/Debian)。
直接用包管理器安装稳定版FIO:CentOS执行 yum install fio -y,Ubuntu执行 apt-get install fio -y。安装后运行 fio -v 确认版本不低于3.16——低于该版本可能缺失NVMe队列统计字段。
测试前必须识别目标设备是否为裸盘:运行 lsblk -f,确保待测设备(如 /dev/nvme0n1)未挂载任何文件系统,【一旦指定已挂载的/dev/mapper/centos-root等路径,FIO会直接覆写元数据,导致系统无法启动】。
针对不同设备类型的压测参数组合
SSD与NVMe设备必须启用异步I/O引擎并设置足够深的队列,而机械硬盘则要限制并发避免寻道风暴。以下三组参数经生产环境反复验证:
方法一:NVMe SSD极限吞吐测试(PCIe 4.0 x4设备适用)fio -filename=/dev/nvme0n1 -direct=1 -iodepth=128 -ioengine=libaio -rw=randread -bs=64k -numjobs=8 -runtime=120 -group_reporting -name=nvme_read
这组命令用8个线程、每个线程维持128个并发请求,模拟数据库缓存穿透时的高压随机读——若实测IOPS低于80万,需检查PCIe链路是否降速到x2模式。
方法二:SATA SSD混合读写压测(模拟MySQL主库负载)fio -filename=/dev/sdb -direct=1 -iodepth=32 -ioengine=libaio -rw=randrw -rwmixread=70 -bs=4k -numjobs=4 -runtime=300 -group_reporting -name=mysql_mix
70%读+30%写比例严格对应OLTP典型负载,4K块大小触发SSD最差擦写放大场景,300秒运行时长确保TRIM机制充分生效。注意:首次运行前需用 fio -filename=/dev/sdb -direct=1 -rw=write -bs=1M -size=5G -name=precondition 预热盘体,否则前60秒延迟波动会污染结果。
方法三:企业级机械硬盘顺序写瓶颈定位fio -filename=/dev/sdc -direct=1 -iodepth=1 -ioengine=sync -rw=write -bs=1M -numjobs=1 -size=50G -group_reporting -name=hdd_seq
机械盘必须禁用异步引擎(sync而非libaio),且iodepth=1防止多线程把顺序写打散成随机IO——若此时带宽仍低于120MB/s,基本可判定是背板带宽或RAID卡缓存策略问题,而非磁盘本身故障。
执行压测并提取关键指标
将上述任一命令保存为 test.fio 配置文件,执行 fio test.fio 启动测试。实时监控需另开终端运行:iostat -xmt 1 /dev/nvme0n1(注意替换设备名),重点观察 %util 是否持续100%、await 是否突增超过10ms。
测试结束后,FIO默认输出含三类核心数据:
① IOPS值:在 clat (usec): min=..., max=... 上方查找 IOPS=XXXXX 字段,这是设备每秒完成的4K IO次数;
② 延迟分布:关注 clat percentiles 区域,99.9th百分位延迟超过5ms即表明SSD存在颗粒磨损;
③ 吞吐量:在 bw (KB/s) 行读取实际带宽,若数值远低于理论PCIe带宽(如PCIe 4.0 x4应达7.8GB/s),说明I/O栈某层存在瓶颈。
导出结构化结果供比对:追加参数 --output-format=json --output=result.json,生成的JSON文件可直接用Python脚本提取 jobs[0]["read"]["iops"] 字段做自动化阈值告警。



















