文档中心>实践教程>文件存储>文件存储性能测试

文件存储性能测试

最近更新时间:2025-06-12 11:33:11

我的收藏
本文主要介绍如何通过合理的方式对 CFS 云文件系统进行性能测试。

性能关键指标

指标
定义
业内常用测试方案
时延
从发出一个 IO 请求到接收到该请求的响应所花费的时间,单位ms。
设置1MiB大小的文件,通过单流(单线程)的方式,每次传输4KiB的小数据块,获取读写延时。
IOPS
每秒读写文件块(IO 操作)的数量,单位个/s。
设置100MiB大小的文件,通过并发(多机多线程)的方式,每次传输4KiB的小数据块,获取 IOPS。
吞吐
每秒读写数据量的大小,单位GiB/s或MiB/s。
设置100MiB大小的文件,通过并发(多机多线程)的方式,每次传输1MiB或4MiB的大数据块,获取吞吐。

转换公式

核心公式:吞吐 = IOPS * 读写块大小
IOPS 计算方式可参考:IOPS ≈ 队列深度 / 时延;IOPS = 读写总次数 / 任务整体延迟。后者仅适用于顺序无并发场景。
任务整体延迟受并发模型、设备队列、带宽瓶颈共同影响,当并发请求超过性能上限,请求排队将导致任务整体延迟上升。
说明:
吞吐、 IOPS 、整体时延相互关联,不同应用场景下的观测重点不同。例如:
随机小IO场景(读写块大小为4KiB、8KiB)应重点关注 IOPS 和低时延;
顺序大IO场景(读写块大小为128KiB、1MiB及以上)应重点关注吞吐和网络带宽;
对响应速度敏感的场景应重点关注时延。
低时延是实现高 IOPS 和高吞吐的关键前提,高时延会限制实际能够达到的 IOPS 和吞吐,操作等待响应的时间越长,单位时间内能完成的操作或传输的数据量就越少。
您可以通过调整读写块大小以及并发数,实现目标吞吐,并避免触及 IOPS 上限,降低整体任务延迟。例如通用标准型 CFS 4KiB写时延约为7ms:
当并发数为1,写入次数为250,则整体时延为7ms*250=1.75s,IOPS为 250/1.75s≈143个/s,吞吐为143个/s*4KiB=571KiB/s;
当并发数为128,写入次数为250,则整体时延为7ms*(250/128)≈13.7ms,IOPS为 250/13.7ms≈18286个/s,吞吐为18285个/s*4KiB≈71MiB/s。

注意事项

压测时,因服务端缓存加速的特性,命中缓存时,读性能会超过标准值,此现象符合预期。
压测时,尤其是时延测试,需要保证 CVM(客户端)和 CFS 处于同可用区。受网络延迟影响,跨可用区性能结果会和标准值有较大差异,需尽可能避免。
CFS 云文件存储所提供的 性能规格,除时延参数外,均需要一定规模和核心数机器进行并发压测才能达到最大值。以吞吐为例,最大不会超过 CVM 内网带宽,如果内网带宽太小,吞吐会被流量限制。例如,购买20T的 Turbo 标准型 CFS,初始带宽为2GiB/s,配套使用 CVM 实例规格 为 SA3.LARGE8,内网带宽(出+入)为2Gbps,则单机访问吞吐最大为0.25GiB/s,如果想要测到最高吞吐,则至少需要8台同规格 CVM 并发测试。
FIO 工具压测时模拟正常文件的读写,不会对文件系统造成损坏,但测试时请不要使用生产环境进行压测,避免对您的业务造成不必要的影响。

操作步骤

1. 远程登录云服务器 CVM 实例,具体操作可参考 Linux 云服务器配置及登录
2. 安装压测软件
CentOS/TencentOS:
sudo yum install fio
Ubuntu/Debian:
sudo apt-get install fio
Windows:请下载msi格式的安装包并安装,FIO安装包下载地址请参见fio官网
3. 运行性能测试命令

Linux 系统下的性能测试命令

本节以通用性能型 CFS 为例,在单台 Linux CVM 中执行以下命令测试性能。
说明:
实际测试时,需要将 -directory 中的 /path/to/cfs 替换成实际测试的文件系统路径。
读写测试中,测试软件FIO均会根据测试命令的不同,构造对应的测试数据,建议使用一个空目录进行测试。
读时延测试
测试命令
fio -directory=/path/to/cfs -iodepth=1 -time_based=1 -thread -direct=1 -ioengine=libaio -rw=randread -bs=4K -size=1M -numjobs=1 -runtime=60 -group_reporting -name=cfs_test
结果样例

写时延测试
测试命令
fio -directory=/path/to/cfs -iodepth=1 -time_based=1 -thread -direct=1 -ioengine=libaio -rw=randwrite -bs=4K -size=1M -numjobs=1 -runtime=60 -group_reporting -name=cfs_test
结果样例

读 IOPS 测试
测试命令
fio -directory=/path/to/cfs -iodepth=1 -time_based=1 -thread -direct=1 -ioengine=libaio -rw=randread -bs=4K -size=100M -numjobs=128 -runtime=60 -group_reporting -name=cfs_test
结果样例

写 IOPS 测试
测试命令
fio -directory=/path/to/cfs -iodepth=1 -time_based=1 -thread -direct=1 -ioengine=libaio -rw=randwrite -bs=4K -size=100M -numjobs=128 -runtime=60 -group_reporting -name=cfs_test
结果样例

读吞吐测试
测试命令
fio -directory=/path/to/cfs -iodepth=1 -time_based=1 -thread -direct=1 -ioengine=libaio -rw=randread -bs=1M -size=100M -numjobs=128 -runtime=60 -group_reporting -name=cfs_test
结果样例

写吞吐测试
测试命令
fio -directory=/path/to/cfs -iodepth=1 -time_based=1 -thread -direct=1 -ioengine=libaio -rw=randwrite -bs=1M -size=100M -numjobs=128 -runtime=60 -group_reporting -name=cfs_test
结果样例


FIO 参数说明

参数
参数说明
direct
表示是否使用 direct I/O。默认值:1。
值为1:表示使用 direct I/O,忽略客户端 I/O 缓存,数据直写或直读。
值为0:表示不使用 direct I/O。
注意:
此参数无法穿透服务端缓存。
iodepth
表示测试时的 IO 队列深度。例如-iodepth=1表示 FIO 控制请求中的 I/O 最大个数为1。
说明:
您可以通过逐步增加队列深度,通过观察 IOPS 是否随并发数有所上升,判断性能是否达到瓶颈;通过观察平均时延是否陡增,观察并发能力极限。
rw
表示测试时的读写策略。您可以设置为:
randwrite:随机写。
randread:随机读。
read:顺序读。
write:顺序写。
randrw:混合随机读写。
说明:
压测一般基于随机读写。如果需要顺序读写的性能值,可根据需要调整参数。
ioengine
表示测试时 FIO 选择哪种 I/O 引擎,通常选择 libaio,保证数据 IO 的异步下发。
注意:
压测时如不选择 libaio,其性能瓶颈主要在于 ioengine 上,非存储侧瓶颈。
bs
表示 I/O 单元的块大小(block size)。
size
表示测试文件大小。
注意:
FIO 会将指定的文件大小全部读/写完成,然后才停止测试,除非受到其他选项(例如运行时)的限制。如果未指定该参数,FIO 将使用给定文件或设备的完整大小。也可以将大小作为1到100之间的百分比给出,例如指定 size=20%,FIO 将使用给定文件或设备完整大小的20%空间。
numjobs
表示测试的并发线程数。
runtime
表示测试时间,即 FIO 运行时长。
group_reporting
表示测试结果显示模式。如果指定该参数,测试结果会汇总每个进程的统计信息,而不是以不同任务来统计信息。
directory
表示待测试的文件系统挂载路径。
说明:
选择此参数,FIO 将默认从此路径创建出 numjobs 数量的文件进行压测。存储压测时一定要选择此参数,如果直接指定 filename 是对单个文件进行压测。
name
表示测试任务名称,可以根据实际需要设定。
thread
使用多线程的方式进行压测,而非多进程。
time_based
值为1: 当指定的文件大小读写完之后,自动重复 IO,直到 runtime 参数指定的时间。
值为0:当指定的文件大小写完之后,立即停止。
说明:
通常测试时指定为1,能保证测试程序在指定的时间范围内持续运行。
说明:
更多的关于 FIO 压测的参数,可以参考 FIO 文档
如果需要多机测试,可通过 pshell 同时执行指令,或者参考 FIO 文档 配置集群版的压测参数。