评估腾讯云CVM云盘性能时,4K随机读写IOPS是最能反映数据库、消息中间件等小IO负载能力的指标。云盘厂商标注的最大IOPS通常基于特定队列深度、块大小和测试模型,如果照搬默认命令,得到的结果可能和规格表相差很远。本文在一台腾讯云标准型CVM实例上,使用fio对增强型SSD云盘进行完整的4K随机读写基准测试,重点关注不同iodepth与numjobs组合下的性能变化,并给出可直接复用的测试流程。

测试环境与预条件
本次测试使用的腾讯云CVM实例为标准型S5,配置为4核8GB,挂载一块100GB增强型SSD云盘。该容量云盘在官方规格表中标注的最大随机读IOPS为26000,最大随机写IOPS为12000。操作系统为TencentOS Server 3.1,内核版本5.4.119,fio版本为3.25。为了避免云盘上的文件系统缓存干扰结果,测试直接针对裸盘设备/dev/vdb进行,该盘未存放任何业务数据。
新创建的SSD云盘或长时间闲置的盘,首次随机写测试容易因为空闲块充足而得到虚高的数值。为了模拟真实业务长期运行后的状态,测试前需要用fio对云盘进行预条件处理,顺序写满整盘两轮。预条件命令如下:
fio --name=precondition --filename=/dev/vdb --ioengine=libaio --direct=1 --bs=1m --rw=write --iodepth=32 --numjobs=4 --runtime=600 --time_based --group_reporting
预条件结束后,云盘内部垃圾回收进入相对稳定状态,随机写测试的数据会更接近长期使用表现。
fio关键参数与测试方法
在fio中,有几个参数会直接决定4K随机读写测试结果是否可信。direct=1表示绕过操作系统页缓存,让读写直接落到云盘;如果不加这个参数,顺序或随机读写都可能被内存缓存放大,测出的IOPS没有参考价值。ioengine=libaio使用Linux异步IO接口,可以配合iodepth控制队列深度,是块设备基准测试的标准引擎。bs=4k指定单次IO数据块大小为4KB,与数据库页大小一致。rw=randread和rw=randwrite分别对应随机读和随机写。iodepth与numjobs的乘积决定总队列深度,它是影响IOPS饱和点的关键。
随机读测试命令如下:
fio --name=randread-4k \
--filename=/dev/vdb \
--ioengine=libaio \
--direct=1 \
--bs=4k \
--rw=randread \
--iodepth=32 \
--numjobs=4 \
--runtime=60 \
--time_based \
--group_reporting \
--randrepeat=0 \
--norandommap=1
随机写测试只需要把rw=randread改为rw=randwrite即可,其他参数保持一致。每次组合测试重复3轮,每轮运行60秒,取平均值作为最终结果。测试期间关闭实例上其他可能产生IO的程序,并用iostat观察云盘利用率,确保压测线程没有因CPU不足而成为瓶颈。
4K随机读IOPS实测数据
在保持数据块4K不变的前提下,分别调整iodepth和numjobs,得到不同总队列深度下的随机读性能。结果如下表所示:
| iodepth | numjobs | 总队列深度 | IOPS | 平均延迟 |
|---|---|---|---|---|
| 1 | 1 | 1 | 6800 | 0.15ms |
| 8 | 1 | 8 | 19200 | 0.42ms |
| 16 | 2 | 32 | 24800 | 1.29ms |
| 32 | 4 | 128 | 25600 | 5.00ms |
| 64 | 8 | 512 | 25800 | 19.84ms |
从数据可以明显看到,总队列深度从1提升到32时,随机读IOPS从6800快速增长到24800,已经接近该云盘标称的26000。继续把总队列深度加到128甚至512,IOPS只增长了不到1000,但平均延迟却从1.29ms飙升到接近20ms。这说明云盘后端处理能力在这个区间已经饱和,再增加并发只会堆积请求,延迟急剧恶化。
对于数据库这类对读延迟敏感的场景,不建议无脑把iodepth调到很大。实测中总队列深度32是一个比较均衡的点,IOPS达到标称值的95%以上,平均延迟还控制在1.3ms以内。如果业务对P99延迟要求更高,可以适当降低队列深度,牺牲一点吞吐换取更平稳的响应时间。
4K随机写IOPS实测数据
随机写测试同样采用预条件后的裸盘,改变总队列深度观察IOPS变化。结果如下:
| iodepth | numjobs | 总队列深度 | IOPS | 平均延迟 |
|---|---|---|---|---|
| 1 | 1 | 1 | 4200 | 0.24ms |
| 8 | 1 | 8 | 9200 | 0.87ms |
| 16 | 2 | 32 | 11400 | 2.81ms |
| 32 | 4 | 128 | 11800 | 10.85ms |
| 64 | 8 | 512 | 11900 | 43.01ms |
随机写IOPS在总队列深度16之后基本就接近了标称值12000,总队列深度32时达到11400,之后增长非常有限。与此同时,平均延迟从2.81ms快速上升到43ms,说明写路径比读路径更容易受到队列深度影响。随机写性能低于随机读是SSD的固有特性,因为写入涉及擦除、垃圾回收和云盘多副本同步,后端延迟会更高。
需要特别说明的是,如果测试前不做预条件处理,新盘随机写IOPS可能高出30%甚至更多。这是因为空盘有大量可以快速写入的块,不会触发垃圾回收。只有经过全盘顺序写预条件后,随机写结果才代表长期运行状态。对于有fsync或fdatasync要求的业务,例如MySQL事务提交,随机写IOPS还会大幅下降,需要单独加入--fsync=1或--fdatasync=1参数重新评估。
结论与选型建议
综合以上测试,这台腾讯云CVM标准型S5实例挂载的100GB增强型SSD云盘,4K随机读IOPS实测约为标称值的95%-99%,随机写IOPS约为标称值的95%左右。性能饱和点都出现在总队列深度32附近,继续增加并发对吞吐几乎没有帮助,反而会显著推高延迟。因此,实际业务配置时不要盲目设置超大队列深度,而应根据表结构、索引命中率和事务模型进行压测。
在做云盘选型或容量规划时,建议在标称IOPS基础上预留15%-20%的性能余量,避免业务高峰期触碰云盘上限。同时应把P99延迟纳入监控,而不是只看平均延迟。对于需要高随机读性能的数据库,优先选择增强型SSD云盘或更高规格的ESSD云盘,并定期用fio做基准测试,观察性能是否因云盘后端负载变化而下降。
最后需要强调,fio测试结果受实例规格、网络时延、云盘类型和测试方法影响较大,本文数据仅代表标准型S5与增强型SSD云盘的组合表现。更换其他CVM实例或云盘类型时,应按照相同流程重新压测,以得到符合自身业务特征的准确基线。
腾讯云CVMfio4K随机读写IOPS修改时间:2026-09-18 20:16:47