先看现象。新买的 500G 高效云盘挂到 CentOS 7.9 上,fio 用 --rw=randwrite --bs=4k --iodepth=32 跑出来只有 200 IOPS,同规格的 ESSD 在别的机器上能跑到 8000,怀疑是盘本身的问题。
这类报错背后常见的原因有几处,逐个排除就行。fio 没加 --direct=1,测到的其实是页缓存。也可能是文件系统没预分配,写的时候还在做元数据分配。
另外,高效云盘的 IOPS 和容量挂钩,500G 就是这个量级。
少数情况下是iodepth 和 numjobs 太小,队列一直没打满。
动手时先用裸盘加 direct 排除缓存影响
fio --name=t --filename=/dev/vdb --rw=randwrite --bs=4k --iodepth=32 --direct=1 --runtime=30 --time_based
再用文件系统测一次做对比
fio --name=f --filename=/data/test.bin --size=8G --rw=randwrite --bs=4k --iodepth=64 --direct=1 --runtime=30
接着核对云盘规格和实际容量
lsblk && fdisk -l /dev/vdb
等前面都确认过,再把队列深度加到接近规格标称值
fio --name=q --filename=/data/test.bin --rw=randwrite --bs=4k --iodepth=128 --numjobs=4 --direct=1 --runtime=30 --time_based
怎么算真的好了,看的是同一批现象。裸盘测出的 IOPS 与云盘规格基本一致,加 --direct=1 后延迟分布正常,业务压测不再受磁盘限制。
提醒一点。测云盘一定要用 --direct=1 并写满预分配的文件,否则测的是内存;不同代际的盘 IOPS 差很多,选型前先看标称值。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
