StrmVol存储卷:如何解锁K8s对象存储海量小文件访问性能新高度?

本文涉及的产品
对象存储 OSS,标准 - 本地冗余存储 20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000 次 1年
简介: 如何提升海量文件的数据读取速率,对于AI训练集管理、量化回测、时序日志分析等场景尤为重要。阿里云容器服务(ACK))支持StrmVol类型存储卷,基于底层虚拟块设备及内核态文件系统,显著降低海量小文件访问延迟。

【阅读原文】戳:StrmVol存储卷:如何解锁K8s对象存储海量小文件访问性能新高度?

对象存储OSS凭借其支持海量非结构化数据存储、按需付费的弹性成本以及基于标准HTTP协议的跨平台便捷访问特性,成为大数据场景的重要存储方案。在Kubernetes(K8s)容器化业务中,提升OSS数据的访问性能能有效节省计算资源,提高业务效率。如何提升海量文件的数据读取速率,对于AI训练集管理、量化回测、时序日志分析等场景尤为重要。

 

阿里云容器服务(ACK)支持StrmVol类型存储卷,基于底层虚拟块设备及内核态文件系统,如ext4、EROFS(Extended Read-Only File System,扩展只读文件系统),显著降低海量小文件访问延迟。本文将简单介绍StrmVol存储方案的实现原理及适用场景,并以图片训练集读取场景为例,展示StrmVol存储卷的使用方式。

 

 

 

海量小文件数据的访问性能瓶颈

 

 

在K8s环境中,业务容器访问OSS的标准方式是通过存储卷机制。这一过程依赖于容器存储接口(CSI)驱动,目前主流的实现方案是通过FUSE(Filesystem in Userspace)客户端挂载OSS数据。

 

FUSE允许用户在用户态空间实现文件系统逻辑,通过内核与用户态的交互将对象存储的元数据和数据映射为本地文件系统接口(POSIX)。CSI驱动通过FUSE客户端将OSS路径挂载为容器内的本地目录,业务应用可直接通过标准文件操作(如open()read())访问数据。

 

针对顺序读写大文件场景,FUSE客户端可通过预读、缓存等技术显著提升性能(例如视频流媒体、大数据文件处理)。但在小文件场景依然存在性能瓶颈,这是因为:

 

  • 频繁的内核态切换:每次文件操作(如open()close())需在用户态FUSE进程与内核态之间多次上下文切换,导致额外开销。

 

  • 元数据管理压力:对象存储的元数据(如文件列表、属性)需通过HTTP/REST API查询,海量小文件的元数据请求会显著增加网络延迟和带宽占用。

 

 

 

StrmVol存储卷:虚拟块设备方案


 

 

为解决FUSE在海量小文件场景中的性能瓶颈,StrmVol存储卷提出了一种基于虚拟块设备(Virtual Block Device)加内核态文件系统(如EROFS)的方案,通过消除FUSE中间层的性能损耗,使数据访问路径直接下沉至存储驱动层,提升数据的访问速度,特别适用于AI训练集加载、时序日志分析等需要快速遍历百万级小文件的业务场景。

 

 

核心机制与优化细节

 

  • 快速索引构建:仅元信息同步,加速初始化流程

初始化阶段仅拉取OSS Bucket挂载点下文件元信息(如文件名、路径、大小)并构建索引,不包含对象扩展信息(如自定义元数据、标签),显著缩短索引构建时间,提升部署效率。

 

  • 内存预取优化:并发读取提升数据访问效率

虚拟块设备通过预设内存空间作为临时存储介质,根据已构建的索引信息提前并发预取后续可能访问的数据块。这一机制减少I/O等待时间,尤其在海量小文件场景中可降低读取延迟。

 

  • 内核态文件系统加速:避免用户态切换,提升容器化业务读取性能

容器化业务通过内核态文件系统 直接从内存中读取数据,避免用户态与内核态的频繁切换带来的上下文开销。其中,默认使用的EROFS文件系统通过压缩与高效访问机制,进一步提升存储空间利用率和数据读取性能。

 

 

适用场景

 

  • 数据已存储在OSS Bucket中,且在业务运行期间数据无更新需求。

 

  • 业务对文件系统的扩展信息不敏感。
  • 只读场景,尤其是海量小文件或随机读场景。


 

 

 

图像数据集加载性能测试

 

 

 

本文示例通过Argo Workflow模拟分布式图像数据集加载场景。

 

数据集基于ImageNet部分数据,假设存储于oss://imagenet/data/路径下,包含4个子目录(如oss://imagenet/data/n01491361/),每个目录存放10480张图像,约1.2 G大小。

 

 

安装strmvol-csi-driver

 

使用strmvol存储卷需要部署单独的CSI驱动(strmvol-csi-driver组件),可直接在ACK应用市场中部署。部署后,该CSI驱动与ACK组件管理中维护的csi-provisioner与csi-plugin组件相互独立,不会产生冲突。

 

image.png

 

 

创建StrmVol存储卷

 

StrmVol存储卷的PVC与PV定义与目前ACK OSS存储卷配置类似,本次测试中使用的存储卷YAML如下。

 

 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-strmvol
spec:
  capacity:
  # 挂载的OSS挂载点下最高可存储16 TiB数据。
    storage: 20Gi
  # 仅支持ReadOnlyMany访问模式。
  accessModes:
    - ReadOnlyMany
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: strmvol.csi.alibabacloud.com
    volumeHandle: pv-strmvol
    nodeStageSecretRef:
      name: strmvol-secret
      namespace: default
    volumeAttributes:
      bucket: imagenet
      path: /data
      url: oss-cn-hangzhou-internal.aliyuncs.com
      directMode: "false"
      resourceLimit: "4c8g"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-strmvol
  namespace: default
spec:
  accessModes:
    - ReadOnlyMany
  resources:
    requests:
      storage: 20Gi
  volumeName: pv-strmvol

 

其中,比较重要的PV配置参数为directModeresourceLimit

 

  • directMode: 是否开启direct模式。开启时,关闭预取与数据本地缓存,适合小文件随机读场景,如训练集的随机批量读取。本次示例使用简单的顺序读取,因此选择关闭direct模式。

 

  • resourceLimit: 挂载虚拟块设备后能使用节点的最大资源限制。"4c8g"表示该虚拟块设备最多能占用节点的4 vCPU、8 GiB内存资源。

 

 

基于Argo Workflows创建数据集处理工作流任务

 

工作流分为三阶段:

 

1)list-shards阶段:通过Python脚本列出挂载路径下的4个目录生成路径集合;

 

2)parallel-processing阶段:并发启动4个子任务,每个任务通过parallel -j4指令对对应目录下的所有图像执行4线程并行读取操作(模拟加载);

 

3)calculate-averages阶段:汇总各任务耗时,计算并输出平均处理时间。

 

Argo Workflows组件可在ACK集群组件管理中快速安装。安装后,可使用Argo CLI或kubectl快速提交工作流[1]

 

 

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: distributed-imagenet-training-
spec:
  entrypoint: main
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: "node-type"
                operator: In
                values:
                  - "argo"
  volumes:
  - name: pvc-volume
    persistentVolumeClaim:
      claimName: pvc-strmvol
  templates:
  - name: main
    steps:
    - - name: list-shards
        template: list-imagenet-shards
    - - name: parallel-processing
        template: process-shard
        arguments:
          parameters:
            - name: paths
              value: "{{item}}"
        withParam: "{{steps.list-shards.outputs.result}}"
    - - name: calculate-statistics
        template: calculate-averages
  - name: list-imagenet-shards
    script:
      image: mirrors-ssl.aliyuncs.com/python:latest
      command: [python]
      source: |
        import subprocess
        import json
        output = subprocess.check_output("ls /mnt/data", shell=True, text=True)
        files = [f for f in output.split('\n') if f]
        print(json.dumps(files, indent=2))
      volumeMounts:
        - name: pvc-volume
          mountPath: /mnt/data
  - name: process-shard
    inputs:
      parameters:
      - name: paths
    container:
      image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:latest
      command: [/bin/bash, -c]
      args:
      - |
        yum install -y parallel
        SHARD_JSON="/mnt/data/{{inputs.parameters.paths}}"
        SHARD_NUM="{{inputs.parameters.paths}}"
        START_TIME=$(date +%s)
        echo "Processing shard $SHARD_JSON"
        find "$SHARD_JSON" -maxdepth 1 -name "*.JPEG" -print0 | parallel -0 -j4 'cp {} /dev/null'
        END_TIME=$(date +%s)
        ELAPSED=$((END_TIME - START_TIME))
        mkdir -p /tmp/output
        echo $ELAPSED > /tmp/output/time_shard_${SHARD_NUM}.txt
      resources:
        requests:
          memory: "4Gi"
          cpu: "1000m"
        limits:
          memory: "4Gi"
          cpu: "2000m"
      volumeMounts:
        - name: pvc-volume
          mountPath: /mnt/data
    outputs:
      artifacts:
        - name: time_shard
          path: /tmp/output/time_shard_{{inputs.parameters.paths}}.txt
          oss:
            key: results/results-{{workflow.creationTimestamp}}/time_shard_{{inputs.parameters.paths}}.txt
          archive:
            none: {}
  - name: calculate-averages
    inputs:
      artifacts:
        - name: results
          path: /tmp/output
          oss:
            key: "results/results-{{workflow.creationTimestamp}}"
    container:
      image: registry-vpc.cn-beijing.aliyuncs.com/acs/busybox:1.33.1
      command: [sh, -c]
      args:
      - |
        echo "开始合并结果..."
        TOTAL_TIME=0
        SHARD_COUNT=0
        echo "各分片处理时间统计:"
        for time_file in /tmp/output/time_shard_*.txt; do
          TIME=$(cat $time_file)
          SHARD_ID=${time_file##*_}
          SHARD_ID=${SHARD_ID%.txt}
          echo "分片 ${SHARD_ID}: ${TIME} 秒"
          TOTAL_TIME=$((TOTAL_TIME + TIME))
          SHARD_COUNT=$((SHARD_COUNT + 1))
        done
        if [ $SHARD_COUNT -gt 0 ]; then
          AVERAGE=$((TOTAL_TIME / SHARD_COUNT))
          echo "--------------------------------"
          echo "总分片数量: $SHARD_COUNT"
          echo "总处理时间: $TOTAL_TIME 秒"
          echo "平均处理时间: $AVERAGE 秒/分片"
          echo "Average: $AVERAGE seconds" > /tmp/output/time_stats.txt
        else
          echo "错误:未找到分片时间数据"
          exit 1
        fi
    outputs:
      artifacts:
        - name: test-file
          path: /tmp/output/time_stats.txt
          oss:
            key: results/results-{{workflow.creationTimestamp}}/time_stats.txt
          archive:
            none: {}

 

工作流的运行结果如图所示,列举所有图像并读取其数据的平均耗时为21秒。

 

image.png

 

开始合并结果...
各分片处理时间统计:
分片 1: 21 秒
分片 2: 21 秒
分片 3: 22 秒
分片 4: 21 秒
--------------------------------
总分片数量: 4
总处理时间: 85 秒
平均处理时间: 21 秒/分片

 

 

 

 

开源方案

 

 

阿里云也将基于containerd/overlaybd项目[2]提供了该技术的开源实现,结合OCI image volume可以为容器挂载一个只读数据卷。详细介绍可参考KubeCon Europe 2025相关议题分享[3]

 

 

 

StrmVol存储卷总结

 

 

  • 核心优化:

 

  • 内存预取加速数据访问,减少I/O等待;
  • 内核态直接读取避免用户态切换开销;
  • 轻量索引快速初始化,仅同步必要元数据。

 

  • 适用场景:

 

  • 海量小文件只读场景;
  • OSS端数据存储无需频繁更新。

 

StrmVol的详细使用方式与更多压测数据,可阅读官方文档使用strmvol存储卷优化OSS小文件读取性能[4]


 

相关链接:

 

[1] 快速提交工作流

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/create-a-workflow#section-bz1-rq8-7rz

 

[2] containerd/overlaybd项目

https://github.com/containerd/overlaybd

 

[3] KubeCon Europe 2025相关议题分享

https://www.youtube.com/watch?v=XqL5lh32lr8&t=962s

 

[4] 使用strmvol存储卷优化OSS小文件读取性能

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/use-strmvol-storage-volumes



我们是阿里巴巴云计算和大数据技术幕后的核心技术输出者。

欢迎关注 “阿里云基础设施”同名微信微博知乎

获取关于我们的更多信息~

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
存储 人工智能 Cloud Native
阿里云渠道商:OSS与传统存储系统的差异在哪里?
本文对比传统存储与云原生对象存储OSS的架构差异,涵盖性能、成本、扩展性等方面。OSS凭借高持久性、弹性扩容及与云服务深度集成,成为大数据与AI时代的优选方案。
|
3月前
|
存储 缓存 网络协议
如何使用CDN加速访问OSS存储的图片资源?
通过阿里云CDN加速OSS上的图片和视频资源,可显著提升访问速度、降低带宽成本。CDN将静态资源缓存至离用户最近的节点,减少加载时间,并提供图像处理、缓存优化等功能,提升用户体验。同时,CDN还支持访问数据分析,助力运营决策。本文详解如何通过CDN控制台配置OSS加速,包括添加域名、设置CNAME、配置缓存策略等步骤,帮助您快速实现资源加速。
|
3月前
|
存储 运维 安全
阿里云国际站OSS与自建存储的区别
阿里云国际站对象存储OSS提供海量、安全、低成本的云存储解决方案。相比自建存储,OSS具备易用性强、稳定性高、安全性好、成本更低等优势,支持无限扩展、自动冗余、多层防护及丰富增值服务,助力企业高效管理数据。
|
6月前
|
存储 人工智能 Kubernetes
AI 场景深度优化!K8s 集群 OSSFS 2.0 存储卷全面升级,高效访问 OSS 数据
阿里云对象存储OSS是一款海量、安全、低成本、高可靠的云存储服务,是用户在云上存储的高性价比选择…
|
6月前
|
存储 人工智能 测试技术
AI 场景深度优化!K8s 集群 OSSFS 2.0 存储卷全面升级,高效访问 OSS 数据
OSSFS 2.0通过轻量化协议设计、协程化技术及FUSE3低级API重构,实现大文件顺序读写与小文件高并发加载的显著提升,在实际测试中表现出高达数十倍的吞吐量增长。适用于机器学习训练、推理等对高带宽低延迟要求严苛的场景,同时支持静态和动态挂载方式,方便用户在ACK集群中部署使用。
713 34
|
5月前
|
存储 关系型数据库 MySQL
成本直降30%!RDS MySQL存储自动分层实战:OSS冷热分离架构设计指南
在日均订单量超500万的场景下,MySQL数据年增200%,但访问集中在近7天(85%)。通过冷热数据分离,将历史数据迁移至OSS,实现存储成本下降48%,年省72万元。结合RDS、OSS与Redis构建分层架构,自动化管理数据生命周期,优化查询性能与资源利用率,支撑PB级数据扩展。
352 3
|
3月前
|
存储 域名解析 前端开发
震惊!不买服务器,还可以用阿里云国际站 OSS 轻松搭建静态网站
在数字化时代,利用阿里云国际站OSS可低成本搭建静态网站。本文详解OSS优势及步骤:创建Bucket、上传文件、配置首页与404页面、绑定域名等,助你快速上线个人或小型业务网站,操作简单,成本低廉,适合初学者与中小企业。
|
机器学习/深度学习 人工智能 专有云
人工智能平台PAI使用问题之怎么将DLC的数据写入到另一个阿里云主账号的OSS中
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
9月前
|
SQL 分布式计算 Serverless
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
241 0