文件存储性能测试

这篇说说如何对腾讯云CFS文件系统进行性能测试,涵盖时延、IOPS、吞吐三项关键指标的定义与测试方法,并给出转换公式、注意事项及FIO压测命令示例。核心结论是:性能测试需根据场景选择指标,并注意并发数、块大小与网络带宽的配合。 【关键指标】:时延、IOPS、吞吐三项指标相互关联,随机小IO场景关注IOPS,顺序大IO场景关注吞吐。 【注意事项】:压测需同可用区、避免使用生产环境,且需多机多线程并发才能达到CFS性能上。

相关产品
文件存储 产品页,含版本规格、价格与购买入口。

这里说明如何通过合理的方式对 CFS 云文件系统进行性能测试。

一、性能关键指标

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

二、转换公式

·核心公式:吞吐 = IOPS * 读写块大小

·IOPS 计算方式可参考:IOPS ≈ 队列深度 / 时延;IOPS = 读写总次数 / 任务整体时延。后者仅适用于顺序无并发场景。

·任务整体时延受并发模型、设备队列、带宽瓶颈共同影响,当并发请求超过性能上限,请求排队将导致任务整体时延上升。

注意:说明:

三、注意事项

·压测时,因服务端缓存加速的特性,命中缓存时,读性能会超过标准值,此现象符合预期。

·压测时,尤其是时延测试,需要保证 CVM(客户端)和 CFS 处于同可用区。受网络时延影响,跨可用区性能结果会和标准值有较大差异,需尽可能避免。

·CFS 云文件存储所提供的 性能规格,除时延参数外,均需要一定规模和核心数机器进行并发压测才能达到最大值。以吞吐为例,最大不会超过 CVM 内网带宽,如果 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 中执行以下命令测试性能。

注意:说明:

·读时延测试

·测试命令:

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=128 -time_based=1 -thread -direct=1 -ioengine=libaio -rw=randread -bs=4K -size=100M -numjobs=16 -runtime=60 -group_reporting -name=cfs_test

·结果样例:

·写 IOPS 测试

·测试命令:

fio -directory=/path/to/cfs -iodepth=128 -time_based=1 -thread -direct=1 -ioengine=libaio -rw=randwrite -bs=4K -size=100M -numjobs=16 -runtime=60 -group_reporting -name=cfs_test

·结果样例:

·读吞吐测试

·测试命令:

fio -directory=/path/to/cfs -iodepth=128 -time_based=1 -thread -direct=1 -ioengine=libaio -rw=randread -bs=1M -size=100M -numjobs=16 -runtime=60 -group_reporting -name=cfs_test

·结果样例:

·写吞吐测试

·测试命令:

fio -directory=/path/to/cfs -iodepth=128 -time_based=1 -thread -direct=1 -ioengine=libaio -rw=randwrite -bs=1M -size=100M -numjobs=16 -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 控制每个 FIO 作业线程/进程能够同时向操作系统提交的异步 I/O 请求数量。说明:你可以通过逐步增加 iodepth 的值来观察性能变化:如果 IOPS 或带宽随之上升,说明提高单进程并发度能有效提升设备利用率;当 IOPS 增长曲线趋于平缓时,意味着设备对于单进程的并发处理能力已达到瓶颈。同时,你需要观察平均时延(lat)或完成时延(clat),如果时延出现陡增,则表明当前队列深度已超过设备的最佳并发处理能力,请求在队列中等待时间过长。
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 表示作业数量,它指定一个 FIO 任务同时启动的并发进程或线程数。说明:在实际性能压测中,建议采用控制变量法,将 iodepth 与 numjobs 两个参数结合使用,以系统性地评估存储系统的性能特性。首先,固定一个较小的 numjobs (例如1/2的 CPU 核心数),以此隔离出单个任务线程的性能表现。然后,逐步增加 iodepth 的数值,并观察性能指标(IOPS、带宽)和时延的变化。在确定了单任务的最佳 iodepth 后,将此值固定。随后,逐步增加 numjobs 的数值,模拟多任务并发负载,探测存储系统在处理多重工作负载时的整体性能极限、可扩展性以及稳定性。压测 Turbo 系列时,若 numjobs=1(单线程/单任务),无法发挥分布式特性,建议增大 numjobs,通过多客户端/多线程模拟并发,才能充分利底层多吞吐的分布式能力,压出极限性能。
runtime 表示测试时间,即 FIO 运行时长。
group_reporting 表示测试结果显示模式。如果指定该参数,测试结果会汇总每个进程的统计信息,而不是以不同任务来统计信息。
directory 表示待测试的文件系统挂载路径。说明:选择此参数,FIO 将默认从此路径创建出 numjobs 数量的文件进行压测。存储压测时一定要选择此参数,如果直接指定 filename 是对单个文件进行压测。
name 表示测试任务名称,可以根据实际需要设定。
thread 使用多线程的方式进行压测,而非多进程。
time_based 值为1: 当指定的文件大小读写完之后,自动重复 IO,直到 runtime 参数指定的时间。值为0:当指定的文件大小写完之后,立即停止。说明:通常测试时指定为1,能保证测试程序在指定的时间范围内持续运行。

注意:说明:

赞 (0)
上一篇 5天前
下一篇 5天前