JuiceFS 是一款面向云原生环境设计的高性能 POSIX 文件系统,任何存入 JuiceFS 的数据都会按照一定规则拆分成数据块存入对象存储(如 Amazon S3),相对应的元数据则持久化在独立的数据库中。这种结构决定了 JuiceFS 的存储空间可以根据数据量弹性伸缩,可靠地存储大规模的数据,同时支持在多主机之间共享挂载,实现跨云跨地区的数据共享和迁移。

JuiceFS 在运行过程中, 可能会因为硬件软件差异, 系统配置不同, 文件大小等原因导致实际的性能表现会有所不同。之前分享过[如何利用 JuiceFS 的性能工具做分析和调优]本文我们将更进一步介绍如何对 JuiceFS 进行准确的性能评估,希望能帮到大家。

前言

在进行性能测试之前,最好写下该使用场景的大致描述,包括:

  1. 对接的应用是什么?比如 Apache Spark、PyTorch 或者是自己写的程序等
  2. 应用运行的资源配置,包括 CPU、内存、网络,以及节点规模
  3. 预计的数据规模,包括文件数量和容量
  4. 文件的大小和访问模式(大文件或者小文件,顺序读写或者随机读写)
  5. 对性能的要求,比如每秒要写入或者读取的数据量、访问的 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 Bench

JuiceFS bench 命令可以帮助你快速完成单机性能测试,通过测试结果判断环境配置和性能表现是否正常。假设你已经把 JuiceFS 挂载到了测试机器的 /mnt/jfs 位置(如果在 JuiceFS 初始化、挂载方面需要帮助,请参考快速上手指南,执行以下命令即可(推荐 -p 参数设置为测试机器的 CPU 核数):

$ juicefs bench /mnt/jfs -p 4

测试结果会将各项性能指标显示为绿色,黄色或红色。若您的结果中有红色指标,请先检查相关配置,需要帮助可以在 GitHub Discussions 详细描述你的问题。

JuiceFS bench 基准性能测试的具体流程如下(它的实现逻辑非常简单,有兴趣了解细节的可以直接看源码

  1. N 并发各写 1 个 1 GiB 的大文件,IO 大小为 1 MiB
  2. N 并发各读 1 个之前写的 1 GiB 的大文件,IO 大小为 1 MiB
  3. N 并发各写 100 个 128 KiB 的小文件,IO 大小为 128 KiB
  4. N 并发各读 100 个之前写的 128 KiB 的小文件,IO 大小为 128 KiB
  5. N 并发各 stat 100 个之前写的 128 KiB 的小文件
  6. 清理测试用的临时目录

并发数 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 的固定开销。

注 1:Amazon EFS 的性能与容量线性相关参考(AWS 官方文档),这样就不适合用在小数据量高吞吐的场景中。

注 2:价格参考 AWS 美东区(US East, Ohio Region),不同 Region 的价格有细微差异。

注 3:以上数据来自 AWS 官方文档,性能指标为最大值,EBS 的实际性能与卷容量和挂载 EC2 实例类型相关,总的来说是越大容量,搭配约高配置的 EC2,得到的 EBS 性能越好,但不超过上面提到的最大值。

性能观测和分析工具

接下来介绍两个性能观测和分析工具,是 JuiceFS 测试、使用、调优过程中必备的利器。

JuiceFS Stats

JuiceFS stats 是一个实时统计 JuiceFS 性能指标的工具,类似 Linux 系统的 dstat 命令,可以实时显示 JuiceFS 客户端的指标变化(详细说明和使用方法见性能监控文档)。执行 juicefs bench 时,在另一个会话中执行以下命令:

$ juicefs stats /mnt/jfs --verbosity 1

结果如下,可以将其与上述基准测试流程对照来看,更易理解:

其中各项指标具体含义如下:

  • usage

    • cpu: JuiceFS 进程消耗的 CPU
    • mem: JuiceFS 进程占用的物理内存
    • buf: JuiceFS 进程内部的读写 buffer 大小,受挂载项 --buffer-size 限制
    • cache: 内部指标,可不关注
  • fuse
    • ops/lat: FUSE 接口每秒处理的请求个数及其平均时延(单位为毫秒,下同)
    • read/write: FUSE 接口每秒处理读写请求的带宽值
  • meta
    • ops/lat: 元数据引擎每秒处理的请求个数及其平均时延(请注意部分能在缓存中直接处理的请求未列入统计,以更好地体现客户端与元数据引擎交互的耗时)
    • txn/lat: 元数据引擎每秒处理的写事务个数及其平均时延(只读请求如 getattr 只会计入 ops 而不会计入 txn)
    • retry: 元数据引擎每秒重试写事务的次数
  • blockcache
    • read/write: 客户端本地数据缓存的每秒读写流量
  • object
    • get/get_c/lat: 对象存储每秒处理读请求的带宽值,请求个数及其平均时延
    • put/put_c/lat: 对象存储每秒处理写请求的带宽值,请求个数及其平均时延
    • del_c/lat: 对象存储每秒处理删除请求的个数和平均时延

JuiceFS Profile

JuiceFS profile 一方面用来实时输出 JuiceFS 客户端的所有访问日志,包含每个请求的信息。同时,它也可以用来回放、统计 JuiceFS 访问日志,方便用户直观了解 JuiceFS 的运行情况(详细的说明和使用方法见性能诊断文档)。执行 juicefs bench 时,在另一个会话中执行以下命令:

$ cat /mnt/jfs/.accesslog > access.log

其中 .accesslog 是一个虚拟文件,它平时不会产生任何数据,只有在读取(如执行 cat)时才会有 JuiceFS 的访问日志输出。结束后使用 Ctrl-C 结束 cat 命令,并运行:

$ juicefs profile access.log --interval 0

其中 --interval 参数设置访问日志的采样间隔,设为 0 时用于快速重放一个指定的日志文件,生成统计信息,如下图所示:

从之前基准测试流程描述可知,本次测试过程一共创建了 (1 + 100) * 4 = 404 个文件,每个文件都经历了「创建 → 写入 → 关闭 → 打开 → 读取 → 关闭 → 删除」的过程,因此一共有:

  • 404 次 create,open 和 unlink 请求
  • 808 次 flush 请求:每当文件关闭时会自动调用一次 flush
  • 33168 次 write/read 请求:每个大文件写入了 1024 个 1 MiB IO,而在 FUSE 层请求的默认最大值为 128 KiB,也就是说每个应用 IO 会被拆分成 8 个 FUSE 请求,因此一共有 (1024 * 8 + 100) * 4 = 33168 个请求。读 IO 与之类似,计数也相同。

以上这些值均能与 profile 的结果完全对应上。另外,结果中还显示 write 的平均时延非常小(45 微秒),而主要耗时点在 flush。这是因为 JuiceFS 的 write 默认先写入内存缓冲区,在文件关闭时再调用 flush 上传数据到对象存储,与预期吻合。

其他测试工具配置示例

Fio 单机性能测试

Fio 是业界常用的一个性能测试工具,完成 JuiceFS bench 后可以用它来做更复杂的性能测试。

环境配置

与 JuiceFS Bench 测试环境一致。

测试任务

执行下面四个 Fio 任务,分别进行顺序写、顺序读、随机写、随机读测试:

# Sequential
$ fio --name=jfs-test --directory=/mnt/jfs --ioengine=libaio --rw=write --bs=1m --size=1g --numjobs=4 --direct=1 --group_reporting
$ fio --name=jfs-test --directory=/mnt/jfs --ioengine=libaio --rw=read --bs=1m --size=1g --numjobs=4 --direct=1 --group_reporting # Random
$ fio --name=jfs-test --directory=/mnt/jfs --ioengine=libaio --rw=randwrite --bs=1m --size=1g --numjobs=4 --direct=1 --group_reporting
$ fio --name=jfs-test --directory=/mnt/jfs --ioengine=libaio --rw=randread --bs=1m --size=1g --numjobs=4 --direct=1 --group_reporting

参数说明:

  • --name:用户指定的测试名称,会影响测试文件名
  • --directory:测试目录
  • --ioengine:测试时下发 IO 的方式;通常用 libaio 即可
  • --rw:常用的有 read,write,randread,randwrite,分别代表顺序读写和随机读写
  • --bs:每次 IO 的大小
  • --size:每个线程的 IO 总大小;通常就等于测试文件的大小
  • --numjobs:测试并发线程数;默认每个线程单独跑一个测试文件
  • --direct:在打开文件时添加 O_DIRECT 标记位,不使用系统缓冲,可以使测试结果更稳定准确

结果如下:

# Sequential
WRITE: bw=703MiB/s (737MB/s), 703MiB/s-703MiB/s (737MB/s-737MB/s), io=4096MiB (4295MB), run=5825-5825msec
READ: bw=817MiB/s (856MB/s), 817MiB/s-817MiB/s (856MB/s-856MB/s), io=4096MiB (4295MB), run=5015-5015msec # Random
WRITE: bw=285MiB/s (298MB/s), 285MiB/s-285MiB/s (298MB/s-298MB/s), io=4096MiB (4295MB), run=14395-14395msec
READ: bw=93.6MiB/s (98.1MB/s), 93.6MiB/s-93.6MiB/s (98.1MB/s-98.1MB/s), io=4096MiB (4295MB), run=43773-43773msec

Vdbench 多机性能测试

Vdbench 也是业界常见的文件系统评测工具,且很好地支持了多机并发测试。

测试环境

与 JuiceFS Bench 测试环境类似,只是多开了两台同配置主机,一共三台。

准备工作

需要在每个节点相同路径下安装 vdbench:

  1. 官网下载 50406 版本
  2. 安装 Java:apt-get install openjdk-8-jre
  3. 测试 vdbench 安装成功:./vdbench -t

然后,假设三个节点名称分别为 node0,node1 和 node2,则需在 node0 上创建配置文件,如下(测试大量小文件读写):

$ cat jfs-test
hd=default,vdbench=/root/vdbench50406,user=root
hd=h0,system=node0
hd=h1,system=node1
hd=h2,system=node2 fsd=fsd1,anchor=/mnt/jfs/vdbench,depth=1,width=100,files=3000,size=128k,shared=yes fwd=default,fsd=fsd1,operation=read,xfersize=128k,fileio=random,fileselect=random,threads=4
fwd=fwd1,host=h0
fwd=fwd2,host=h1
fwd=fwd3,host=h2 rd=rd1,fwd=fwd*,fwdrate=max,format=yes,elapsed=300,interval=1

参数说明:

  • vdbench=/root/vdbench50406:指定了 vdbench 工具的安装路径
  • anchor=/mnt/jfs/vdbench:指定了每个节点上运行测试任务的路径
  • depth=1,width=100,files=3000,size=128k:定义了测试任务文件树结构,即测试目录下再创建 100 个目录,每个目录内包含 3000 个 128 KiB 大小的文件,一共 30 万个文件
  • operation=read,xfersize=128k,fileio=random,fileselect=random:定义了实际的测试任务,即随机选择文件下发 128 KiB 大小的读请求

结果如下:

FILE_CREATES        Files created:                              300,000        498/sec
READ_OPENS Files opened for read activity: 188,317 627/sec

系统整体创建 128 KiB 文件速度为每秒 498 个,读取文件速度为每秒 627 个。

总结

本文从环境配置、工具介绍、实例测试等角度全方位的分享了对 JuiceFS 进行性能评估的整体流程,准确的性能评估可以帮助优化 JuiceFS 更好的适配你的应用场景。最后,欢迎大家积极记录并分享自己的测试过程和结果到 JuiceFS 论坛或用户群。

推荐阅读:知乎 x JuiceFS:利用 JuiceFS 给 Flink 容器启动加速

如有帮助的话欢迎关注我们项目 Juicedata/JuiceFS 哟! (0ᴗ0✿)

JuiceFS 性能评估指南的更多相关文章

  1. 【转载】Spark性能优化指南——高级篇

    前言 数据倾斜调优 调优概述 数据倾斜发生时的现象 数据倾斜发生的原理 如何定位导致数据倾斜的代码 查看导致数据倾斜的key的数据分布情况 数据倾斜的解决方案 解决方案一:使用Hive ETL预处理数 ...

  2. 【转】【技术博客】Spark性能优化指南——高级篇

    http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745207&idx=1&sn=3d70d59cede236e ...

  3. Spark性能优化指南——高级篇(转载)

    前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化指南>的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问 ...

  4. Spark性能优化指南-高级篇

    转自https://tech.meituan.com/spark-tuning-pro.html,感谢原作者的贡献 前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作 ...

  5. Spark性能优化指南——高级篇

    本文转载自:https://tech.meituan.com/spark-tuning-pro.html 美团技术点评团队) Spark性能优化指南——高级篇 李雪蕤 ·2016-05-12 14:4 ...

  6. 《Web性能权威指南》

    <Web性能权威指南> 基本信息 原书名:High performance browser networking 原出版社: O'Reilly Media 作者: (加)Ilya Grig ...

  7. Web性能权威指南 PDF扫描版​

    Web性能权威指南是谷歌公司高性能团队核心成员的权威之作,堪称实战经验与规范解读完美结合的产物.<Web性能权威指南>目标是涵盖Web开发者技术体系中应该掌握的所有网络及性能优化知识.全书 ...

  8. 外包项目测试工作量评估指南&外包项目测试验收流程

    ## ### 外包项目测试工作量评估指南 1.目的        编写本指导书的目的旨在为我公司进行测试外包服务工作进行指导,帮助项目经理和相关人员编写测试方案.评估工作量.制定测试计划和测试策略等, ...

  9. 移动H5前端性能优化指南

    移动H5前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网 ...

随机推荐

  1. web性能检测工具lighthouse

    About Automated auditing, performance metrics, and best practices for the web. Lighthouse 可以自动检查Web页 ...

  2. NOIP模拟86(多校19)

    T1 特殊字符串 解题思路 \(f_{i,j}\) 表示前 \(i\) 个字符中结尾为 \(j\) 的最大贡献. 转移枚举当前位置于之前位置结尾的组合加上贡献即可. 对于边界问题,容易发现选择 1 一 ...

  3. Windows内核基础知识-5-调用门(32-Bit Call Gate)

    Windows内核基础知识-5-调用门(32-Bit Call Gate) 调用门有一个关键的作用,就是用来提权.调用门其实就是一个段. 调用门: 这是段描述符的结构体,里面的s字段用来标记是代码段还 ...

  4. Linux使用ssh测试端口

    在windows上可以使用telnet客户端测试,在linux如果不方便安装telnet客户端的时候可以通关ssh来测试端口 具体命令如下 ssh -v -p 8080 root@59.207.252 ...

  5. Jmeter 正则表达式提取Response Headers,Response Body里的值

    实践过程中遇到需要提取Response Headers,Response Body里的值 一.获取Response Body的值,这里采用json提取器形式 1.Response Body返回值,如下 ...

  6. springboot如何通过apollo动态去注册dubbo服务

    参考相关文章: apollo官方文档:  https://dubbo.apache.org/zh/docs/v2.7/user/configuration/configuration-load-pro ...

  7. 组件通过props属性传值

    组件之间的传值 组件是一个单独功能模块的封装,有属于自己的data和methods,一个组件的 data 选项必须是一个函数 为什么必须是函数:因为只有当data是函数时,不同实例调用同一个组件时才会 ...

  8. js--数组的 Array.of() 和 Array.from() 方法的使用总结

    前言 JavaScript 中数组的本质是一个对象,它存在的 length 属性值随数组元素的长度变化,但是开发中经常会遇到拥有 length 属性和若干索引属性的对象,被称为类数组对象,类数组对象和 ...

  9. 问题 K: 找点

    题目描述 上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点.但是这几天LYH太忙了,你们帮帮他吗? 输入 多组测试数据. 每组数据先输入一个N,表示有N个闭区间(N ...

  10. .NET6运行时动态更新限流阈值

    昨天博客园撑不住流量又崩溃了,很巧正在编写这篇文章,于是产生一个假想:如果博客园用上我这个限流组件会怎么样呢? 用户会收到几个429错误,并且多刷新几次就看到了内容,不会出现完全不可用. 还可以降低查 ...