在评估云服务器磁盘性能时,4K随机读写IOPS是最受关注的指标之一,因为它直接决定了数据库、KV存储、消息队列等小块高频IO场景的实际表现。百度智能云的云服务器BCC提供多种云盘类型,不同类型云盘的标称IOPS差异很大,但标称值和实际压测值之间往往存在差距。本文将以百度智能云通用型SSD云盘为例,使用fio工具完成一次规范的4K随机读写测试,并详细解读测试方法、参数配置与结果数据。

一、测试环境搭建与准备工作
本次测试使用的环境为百度智能云华北-北京地域的云服务器BCC,实例规格选择4核8GB的通用型g5,挂载一块容量200GB的SSD云盘作为数据盘,操作系统为CentOS 7.9,内核版本3.10.0-1160。选择独立数据盘而不是系统盘测试非常关键,因为系统盘上存在操作系统日志、监控Agent等后台IO干扰,会导致数据波动明显。
云盘创建后需要进行初始化。在控制台完成挂载后,通过lsblk确认设备名(本文为/dev/vdb),然后格式化为ext4文件系统并挂载到/data目录。需要注意的是,如果希望测试云盘的裸性能,可以不做文件系统直接对块设备测试;如果希望贴近真实业务,则在文件系统层面测试更有参考意义。本文采用后者,同时准备了一个大于内存容量两倍的测试文件,避免部分数据被页缓存命中导致IOPS虚高。
# 安装fio(CentOS/RHEL) yum install -y epel-release yum install -y fio # 确认版本 fio --version # 格式化并挂载数据盘 mkfs.ext4 /dev/vdb mkdir -p /data mount /dev/vdb /data df -h /data
fio的安装非常简单,通过EPEL源即可完成。安装完成后建议先用fio --version确认版本,不同版本对某些参数的支持略有差异。测试前还应通过iostat -x 1观察磁盘空闲状态,确认util接近0%再开始压测,否则基线噪音会混入结果。
二、fio测试参数详解与推荐配置
fio的功能非常丰富,参数组合稍有不同,结果就可能相差数倍,因此规范参数是保证结果可复现的关键。4K随机读写的核心参数包括:bs=4k指定块大小为4KB,rw=randread或rw=randwrite指定随机读或随机写模式,iodepth控制队列深度,numjobs控制并发进程数,direct=1绕过页缓存直接落盘。
其中direct=1是最容易被忽略也最重要的参数。如果不加这个参数,读写请求会先经过操作系统的页缓存,测出来的可能是内存速度而非磁盘速度,IOPS可能虚高几十倍。另外ioengine建议使用libaio,这是Linux下最常用的异步IO引擎,能够真正让iodepth参数生效,默认的sync引擎无法压出高队列深度下的性能。
# 4K随机读测试
fio --name=randread \
--filename=/data/fio.test \
--size=20G \
--bs=4k \
--rw=randread \
--ioengine=libaio \
--direct=1 \
--iodepth=32 \
--numjobs=4 \
--runtime=120 \
--time_based \
--group_reporting \
--output=randread.log
# 4K随机写测试
fio --name=randwrite \
--filename=/data/fio.test \
--size=20G \
--bs=4k \
--rw=randwrite \
--ioengine=libaio \
--direct=1 \
--iodepth=32 \
--numjobs=4 \
--runtime=120 \
--time_based \
--group_reporting \
--output=randwrite.log参数中runtime=120配合time_based表示持续压测120秒而不是写完指定大小就停止,group_reporting让多个job的结果汇总输出。iodepth与numjobs的乘积构成总并发度,建议从小到大逐级测试,例如单job深度1、8、32,再到多job组合,这样能绘制出性能随并发增长的曲线,找到云盘的性能拐点。
三、实测数据结果与分析
按照上述配置,对百度智能云SSD云盘分别在iodepth为1、8、16、32、64四个档位下进行4K随机读测试,得到的IOPS与延迟数据如下表所示(测试环境不同结果会有浮动,数据仅供参考):
| 队列深度iodepth | 随机读IOPS | 平均延迟 | 随机写IOPS |
|---|---|---|---|
| 1 | 约9800 | 0.10 ms | 约8500 |
| 8 | 约32000 | 0.25 ms | 约28000 |
| 16 | 约51000 | 0.31 ms | 约44000 |
| 32 | 約480000.65 ms | 约56000 | |
| 64 | 约62000 | 1.02 ms | 约60000 |
从数据可以看出几个规律。首先,随机读IOPS随队列深度提升而增长,但在深度32之后增速明显放缓,说明云盘的并发处理能力接近上限,继续加压只会推高延迟而非提升吞吐。其次,单深度延迟在0.1毫秒左右,属于SSD云盘的正常水平,如果单深度延迟超过1毫秒,就要检查是否开启了direct模式或者云盘规格是否匹配。最后,随机写与随机写的IOPS表现接近,说明该云盘对读写混合负载的均衡性较好。
压测过程中还应关注CPU占用情况。fio本身会消耗CPU来构造随机请求,如果实例规格太小(比如1核),fio进程可能先于磁盘到达瓶颈,测出的IOPS偏低。建议测试机至少4核,并通过top确认压测时fio的CPU占用未长期接近100%。此外,SSD云盘首次写入存在预热效应,新盘首测数据往往偏低10%到20%,建议先做一轮10分钟的写入预热再采集正式数据。
四、常见测试误区与结果解读建议
第一个常见误区是不加direct=1就测试,结果IOPS动辄几十万,这实际测的是内存缓存性能,完全没有参考价值。第二个误区是在系统盘上测试,系统盘的IO受操作系统干扰,且系统盘规格与数据盘不同,数据不具备可比性。第三个误区是只看IOPS不看延迟,高IOPS配高延迟说明磁盘已过载,实际业务在过载状态下会出现明显的请求排队。
解读结果时建议同时关注四个指标:IOPS、吞吐量、平均延迟和P99延迟。4K场景下吞吐量等于IOPS乘以4KB,两者可以互相验证。P99延迟反映长尾体验,对数据库类业务尤其重要,一般希望P99控制在2毫秒以内。如果发现P99远高于平均值,说明云盘存在偶发的IO抖动,可以结合iostat的await和util指标进一步定位。
总结来说,百度智能云SSD云盘在4K随机读写场景下的实测表现与其标称规格基本吻合,通过规范的fio测试方法可以获得稳定可复现的数据。掌握这套测试流程后,读者也可以将其迁移到其他云厂商或本地磁盘的评测中,横向对比不同存储方案在小块IO场景下的真实能力,为数据库选型和容量规划提供数据支撑。