性能评估指南
在进行性能测试之前,最好写下该使用场景的大致描述,包括:
- 对接的应用是什么?比如 Apache Spark、PyTorch 或者是自己写的程序等
- 应用运行的资源配置,包括 CPU、内存、网络,以及节点规模
- 预计的数据规模,包括文件数量和容量
- 文件的大小和访问模式(大文件或者小文件,顺序读写或者随机读写)
- 对性能的要求,比如每秒要写入或者读取的数据量、访问的 QPS 或者操作的延迟等
以上这些内容越清晰、越详细,就越容易制定合适的测试计划,以及需要关注的性能指标,来判断应用对存储系统各方面的需求,包括 JuiceFS 元数据配置、网络带宽要求、配置参数等。当然,在一开始就清晰地写出上面所有的内容并不容易,有些内容可以在测试过程中逐渐明确,但是在一次完整的测试结束时,以上使用场景描述以及相对应的测试方法、测试数据、测试结果都应该是完整的。
如果上面的内容还不明确,不要紧,JuiceFS 内置的测试工具可以一行命令得到单机基准性能的核心指标。同时本文还会介绍两个 JuiceFS 内置的性能分析工具,在做更复杂的测试时,这两个工具能帮你简单清晰的分析出 JuiceFS 性能表现背后的原因。
性能测试快速上手
以下示例介绍 JuiceFS 内置的 bench 工具的基本用法。
环境配置
- 测试主机:Amazon EC2 c5.xlarge 一台
- 操作系统:Ubuntu 20.04.1 LTS (Kernel
5.4.0-1029-aws
) - 元数据引擎:Redis 6.2.3, 存储(dir)配置在系统盘
- 对象存储:Amazon S3
- JuiceFS version:0.17-dev (2021-09-23 2ec2badf)
注意事项
JuiceFS v1.0+ 默认启用了回收站,基准测试会在文件系统中创建和删除临时文件,这些文件最终会被转存到回收站 .trash
占用存储空间,为了避免这种情况,可以在基准测试之前关闭回收站 juicefs config META-URL --trash-days 0
,详情参考回收站。
juicefs bench
juicefs bench
命令可以帮助你快速完成单机性能测试,通过测试结果判断环境配置和性能表现是否正常。假设你已经把 JuiceFS 挂载到了测试机器的 /mnt/jfs
位置(如果在 JuiceFS 初始化、挂载方面需要帮助,请参考创建文件系统),执行以下命令即可(推荐 -p
参数设置为测试机器的 CPU 核数):
juicefs bench /mnt/jfs -p 4
测试结果以表格形式呈现,其中 ITEM
代表测试的项目,VALUE
代表每秒的处理能力(吞吐量、文件数、操作数等),COST
代表每个文件或操作所需的时间。
各项性能指标会显示为绿色、黄色或红色区分性能表现。若您的结果中有红色指标,请先检查相关配置,需要帮助可以在 GitHub Discussions 详细描述你的问题。
juicefs bench
基准性能测试的具体流程如下(它的实现逻辑非常简单,有兴趣了解细节的可以直接看源码):
- N 并发各写 1 个 1 GiB 的大文件,IO 大小为 1 MiB
- N 并发各读 1 个之前写的 1 GiB 的大文件,IO 大小为 1 MiB
- N 并发各写 100 个 128 KiB 的小文件,IO 大小为 128 KiB
- N 并发各读 100 个之前写的 128 KiB 的小文件,IO 大小为 128 KiB
- N 并发各 stat 100 个之前写的 128 KiB 的小文件
- 清理测试用的临时目录
并发数 N 的值即由 bench
命令中的 -p
参数指定。
在这用 AWS 提供的几种常用存储类型做个性能比较:
- EFS 1TiB 容量时,读 150MiB/s,写 50MiB/s,价格是 $0.08/GB-month
- EBS st1 是吞吐优化型 HDD,最大吞吐 500MiB/s,最大 IOPS(1MiB I/O)500,最大容量 16TiB,价格是 $0.045/GB-month
- EBS gp2 是通用型 SSD,最大吞吐 250MiB/s,最大 IOPS(16KiB I/O)16000,最大容量 16TiB,价格是 $0.10/GB-month
不难看出,在上面的测试中,JuiceFS 的顺序读写能力明显优于 AWS EFS,吞吐能力也超过了常用的 EBS。但是写小文件的速度不算快,因为每写一个文件都需要将数据持久化到 S3 中,调用对象存储 API 通常有 10~30ms 的固定开销。
Amazon EFS 的性能与容量线性相关(参考官方文档),这样就不适合用在小数据量高吞吐的场景中。
价格参考 AWS 美东区(US East, Ohio Region),不同 Region 的价格有细微差异。
以上数据来自 AWS 官方文档,性能指标为最大值,EBS 的实际性能与卷容量和挂载 EC2 实例类型相关,总的来说是越大容量,搭配约高配置的 EC2,得到的 EBS 性能越好,但不超过上面提到的最大值。
juicefs objbench
juicefs objbench
命令可以运行一些关于对象存储的测试,用以评估其作为 JuiceFS 的后端存储时的运行情况。以测试 Amazon S3 为例:
juicefs objbench \
--storage s3 \
--access-key myAccessKey \
--secret-key mySecretKey \
https://mybucket.s3.us-east-2.amazonaws.com
测试结果如下图所示:
其中,结果显示为 not support
代表所测试的对象存储不支持该项功能。
测试流程
首先会对对象存储的接口进行功能测试,以下为测试用例:
- 创建 bucket
- 上传对象
- 下载对象
- 下载不存在的对象
- 获取对象部分内容
- 获取对象元信息