文档

ossfs 1.91及以上版本新功能介绍及性能压测

更新时间:

通过ossfs,您可以像操作本地文件一样直接访问和管理OSS中的Object,从而实现数据的无缝共享和操作。ossfs版本随着CSI组件版本的迭代进行升级。在1.30.1及以上版本的CSI组件中,您可以开启特性门控将ossfs切换至1.91及以上新版本来提升文件操作性能。本文介绍ossfs 1.91及以上版本的新功能以及压测性能。

如果您对文件操作性能有较高要求,建议您将ossfs版本切换至1.91及以上版本。关于ossfs 1.91及以上版本的启用场景,请参见ossfs 1.91及以上版本启用最佳实践。如何切换ossfs版本,请参见将ossfs切换至1.91及以上版本

ossfs 1.91及以上版本新增功能

与ossfs 1.88.x版本相比,ossfs 1.91及以上版本主要功能变更如下。以下功能配置项仅说明重要信息,完整配置项及更多版本变更信息,请参见ossfs changelog

基础POSIX操作优化和缺陷修复

  • 支持OSS存储卷挂载OSS Bucket中不存在的子路径。

  • 创建对象时取消0 byte文件上传,并修复分片上传时偶发的EntityTooSmall错误,优化追加写表现。

  • 基于开源ossfs版本与实际压测结果,修改部分配置项的默认值。

    配置项

    说明

    1.88.x默认值

    1.91及以上版本默认值

    stat_cache_expire

    元信息过期时间(秒)

    不失效 (-1)

    900

    multipart_threshold

    使用分片上传的文件阈值(MB)

    5 x 1024

    25

    max_dirty_data

    脏数据强制刷盘的阈值(MB)

    不强制(-1)

    5120

    为了优化大文件处理性能,以下部分配置项兼容此前1.88.x版本,与开源ossfs版本有差异。

    配置项

    说明

    开源1.91及以上版本默认值

    1.91及以上版本默认值

    multipart_size

    以分片模式上传数据时分片的大小,单位为MB。

    10

    30

    parallel_count

    以分片模式上传大文件时分片的并发数。

    5

    20

    在使用1.91及以上版本ossfs时,如果您需要回滚或调整配置,可以通过PV中的可选参数otherOpts修改。

新增readdir优化功能

新增readdir优化功能,优化readdir操作的性能以提高文件系统遍历的效率。

挂载OSS存储卷时,为支持用户鉴权和chmod等POSIX操作,系统会发送大量headObject请求以获取路径下的所有对象的扩展信息,例如权限、修改时间、UID和GID等。当某些路径下的文件较多时,可能会影响ossfs的整体性能。

开启readdir优化功能后,系统将忽略这些扩展信息,以提升ossfs的readdir操作性能。但有如下注意事项:

  • chmod、chown操作不生效。

  • 通过symlink操作(软链接)创建的对象可能会显示异常,ossfs本身不支持硬链接。

readdir优化功能相关的配置项如下表所示:

配置项

说明

开启方式

1.91及以上版本默认值

readdir_optimize

是否开启readdir优化功能。

直接使用-o readdir_optimize开启,无需value。

disable

symlink_in_meta

开启时,用于记录软链接的扩展信息,以确保创建的软链接对象正常显示。

直接使用-o symlink_in_meta开启,无需value。

disable

新增直读功能

新增直读功能,优化大文件顺序读(只读)的性能。

挂载OSS存储卷时,为支持完整的写及随机读场景,从OSS服务端读文件时,需要先将数据存储至磁盘,再从磁盘中读取数据返回,即ossfs的最大读性能将受到磁盘IO限制。

直读功能将使用内存预取数据,跳过数据刷盘即直接写入数据而不立刻同步到磁盘,直接从内存读取返回,提升顺序读性能。但需要注意以下事项:

  • 建议适用于顺序读(只读)场景,打开某个文件后:

    • 随机读操作:将触发ossfs重新预取新数据,大量的随机读操作可能影响读性能。

    • 写操作:为保证性能与数据一致性,将自动回退到默认的刷盘逻辑。

  • 开启直读功能时,use_cache配置项会失效。

  • 使用内存存储预取数据,可能会导致内存使用增加。可参考下表中direct_read_prefetch_limit配置项限制内存使用量。当到达内存上限时,将自动停止预取,最大读性能将受网络IO限制。

直读功能相关的配置项如下表所示:

配置项

说明

1.91及以上版本默认值

direct_read

是否开启直读功能。直接使用-o direct_read开启,无需value。

disable

direct_read_prefetch_limit

ossfs进程可使用的直读预取内存池大小,即最大阈值。单位为MB。

1024(最小128)

使用直读功能时,如果您不希望通过预取提升顺序读性能,可以增加-o direct_read_prefetch_chunks=0配置,即从OSS服务端读文件后直接读取数据返回,最大读性能受网络IO限制。

ossfs 1.91及以上版本启用最佳实践

  • 当OSS服务端在某层级下文件量较多时(与节点可用资源相关,一般为千级别及以上),若业务对文件扩展信息无需求,建议您将ossfs切换至1.91及以上版本并增加-o readdir_optimize配置。若您的Bucket开启了版本控制,建议同时增加-o listobjectsv2配置项。

  • 读写场景,建议您优先考虑OSS存储读写分离最佳实践进行读写分离。否则,建议您将ossfs切换至1.91及以上版本,修复分片上传偶发的EntityTooSmall错误问题。为保证数据一致性,建议同时增加-o max_stat_cache_size=0配置。

  • 只读场景

    • 对无需使用缓存的大文件顺序读场景,建议增加-o direct_read来开启直读功能。

    • 对文件需要反复读取的场景,建议您使用本地缓存来加速二次读取性能,同时可以增加以下任一配置项来使用缓存。

      • 增加-o kernel_cache配置项,使用page cache缓存。

      • 增加-o use_cache=/path/to/cache配置项,使用磁盘缓存。

1.88.x和1.91及以上版本ossfs性能对比

重要

采用不同的工具进行测试,测试结果会存在差异。本文中的压测数据仅为采用开源测试工具sysbench或自定义脚本获得的测试结果。

读写吞吐对比

未开启readdir优化功能及直读功能时,在ecs.g7.xlarge(系统盘为PL0)的节点上,使用sysbench压测工具创建128个8MiB的文件进行顺序读(sequential Read)、顺序写(sequential Write)、随机读(Random Read)和随机写(Random Write)测试对比如下。

image

由以上读写吞吐对比图示看出,当未开启readdir优化功能及直读功能时

  • 1.88.x版本的ossfs在create file和sequential Read上有优势。

  • 1.91及以上版本的ossfs在sequential Write、Random Read和Random Write上有优势。

开启readdir优化功能后ls和find操作性能对比

开启readdir优化功能前后,对1000个文件执行lsfind指令的耗时对比如下。

image

由以上性能对比图示看出,1.91及以上版本 with-o readdir_optimize,即1.91及以上版本ossfs开启readdir优化功能后:

  • ls操作性能较1.88.x版本耗时减少74.8%,性能提升至4.0倍;较1.91及以上版本未开启readdir优化功能耗时减少74.3%,性能提升至3.9倍

  • find操作性能较1.88.x版本耗时减少58.8%,性能提升至2.4倍;较1.91及以上版本未开启readdir优化功能耗时减少58.8%,性能提升至2.4倍

开启直读功能后大文件顺序读取性能对比

开启直读功能前后,并发顺序读取10个10 GB文件的耗时和磁盘、内存占用峰值对比如下。

说明

内存占用为整个ossfs进程使用的内存,包括直读功能预取使用的内存和其他内存。

image

由以上性能对比图示看出,1.91及以上版本 with-o direct_read,即1.91及以上版本的ossfs开启直读功能后:

  • 大文件读取耗时较1.88.x版本减少85.3%,较1.91及以上版本未开启直读功能时减少79%

  • 磁盘占用峰值为0,效果最好。

  • 内存占用峰值略有增加,用少量内存换取0磁盘的效果。

如何进行ossfs性能压测

ossfs性能压测可以在容器环境或直接在ECS环境中进行,以上性能数据普遍使用开源压测工具sysbench或自定义脚本获取,您也可以在测试环境中切换至1.91及以上版本ossfs进行测试对比。下文以在容器环境中部署测试环境为例介绍如何进行ossfs性能压测。

操作步骤

  1. 创建OSS存储卷与存储声明PVC,建议您在新创建的Bucket或子路径下测试。具体操作,请参见使用OSS静态存储卷

  2. 使用以下sysbench.yaml内容,创建sysbench应用,并挂载上一步已创建的PVC。

    展开查看sysbench.yaml示例代码

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sysbench
      labels:
        app: sysbench
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sysbench
      template:
        metadata:
          labels:
            app: sysbench
        spec:
          containers:
          - name: sysbench
            image: registry.cn-beijing.aliyuncs.com/tool-sys/tf-train-demo:sysbench-sleep
            ports:
            - containerPort: 80
            volumeMounts:
              - name: pvc-oss
                mountPath: "/data"
            livenessProbe:
              exec:
                command:
                - sh
                - -c
                - cd /data
              initialDelaySeconds: 30
              periodSeconds: 30
          volumes:
            - name: pvc-oss
              persistentVolumeClaim:
                claimName: pvc-oss
  3. 执行以下命令,部署sysbench应用。

    kubectl apply -f sysbench.yaml
  4. 登录到sysbench容器内,即可使用sysbench工具进行压测。例如,测试读写吞吐可在挂载路径下参考以下指令执行。

    说明
    • 测试参数请根据测试节点规格或业务情况进行调整。

    • 如需连续测试,请重新准备测试文件,以避免缓存的影响。

    实现功能

    执行指令

    准备测试文件

    sysbench --num-threads=2 --max-requests=0 --max-time=120 --file-num=128 --file-block-size=16384 --test=fileio --file-total-size=1G --file-test-mode=rndrw prepare

    测试顺序写IO

    sysbench --num-threads=2 --max-requests=0 --max-time=120 --file-num=128 --file-block-size=16384 --test=fileio --file-total-size=1G --file-test-mode=seqwr --file-fsync-freq=0 run

    测试顺序读IO

    sysbench --num-threads=2 --max-requests=0 --max-time=120 --file-num=128 --file-block-size=16384 --test=fileio --file-total-size=1G --file-test-mode=seqrd --file-fsync-freq=0 run

    测试随机读写IO

    sysbench --num-threads=2 --max-requests=0 --max-time=120 --file-num=128 --file-block-size=16384 --test=fileio --file-total-size=1G --file-test-mode=rndrw --file-fsync-freq=0 run

    清除测试文件

    sysbench --test=fileio --file-total-size=1G cleanup 

后续步骤

  • 您可以使用sysbench自带的MySQL测试工具,在不同的ossfs版本下对其性能进行压测。

  • 您也可以在该环境中通过ls+find或并发顺序读操作对readdir优化功能及直读功能进行简单验证。