必须用裸盘测块存储真实性能,避开系统盘和已挂载盘;确认设备无分区无文件系统(fdisk -lu + blkid 验证);安装 fio 时需同步装 libaio-devel 或 libaio-dev;必加 direct=1 和合理 iodepth(如 32);测试后需重新格式化才能使用。

直接测裸盘才能反映真实块存储性能,但必须避开系统盘和已有数据盘——否则 fio 一跑,文件系统就可能损坏,数据大概率丢。
确认测试目标设备是否“干净”
不能拿 /dev/vda(系统盘)或已挂载的 /dev/vdb 开刀。先查清楚哪些设备没分区、没文件系统:
- 运行
sudo fdisk -lu看设备列表,记下候选盘(比如/dev/vdc) - 再跑
sudo blkid,如果输出里完全没出现该设备名,说明它没分区也没文件系统,可测 - 如果
blkid返回了/dev/vdc1: UUID="..." TYPE="ext4"这类信息,立刻放弃——必须换新空盘
安装 fio 时别漏掉 libaio 支持
fio 默认用同步 I/O 引擎,性能压不上去;要测出真实上限,得用 libaio。但很多系统装完 fio 后直接跑 --ioengine=libaio 会报错:
- CentOS/RHEL:装
fio同时必须加装libaio-devel,命令是sudo yum install -y fio libaio-devel - Ubuntu/Debian:对应装
libaio-dev,命令是sudo apt-get install -y fio libaio-dev - 验证是否生效:运行
fio --ioengine=libaio --help,不报错即成功
绕过缓存的 direct=1 和 iodepth 设置很关键
不加 direct=1,fio 实际测的是内存缓存性能,不是磁盘真实能力;而 iodepth 太小(如默认 1)会严重低估并发能力:
-
direct=1必须显式指定,否则结果无效 - 云盘或 NVMe 盘建议
iodepth=32或64;SATA SSD 可从16起步 - 别只用
numjobs=1,多线程才压得出真实 IOPS,常见组合是numjobs=4或8 - 示例命令(随机读 IOPS 测试):
fio -name=randread -ioengine=libaio -iodepth=32 -rw=randread -bs=4k -direct=1 -size=1G -numjobs=4 -runtime=60 -group_reporting -filename=/dev/vdc
测试完必须重新初始化才能再用
fio 对裸盘是直接写扇区的,哪怕只跑 5 秒,也会破坏分区表结构。测试后不能直接挂载使用:
- 若要保留该盘:必须先
umount(如果误挂载过),再用mkfs.ext4 /dev/vdc重建文件系统 - 若不再需要:卸载后直接在控制台释放云盘,别留着占资源
- 最容易被忽略的一点:测试中途别 Ctrl+C 中断,尤其在
randwrite模式下,中断可能导致设备处于不可预测状态,重试前建议重启实例











