通过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。
ossfs相关功能仅支持在ECS节点上使用。
基础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优化功能。 | 直接使用 | disable |
| 开启时,用于记录软链接的扩展信息,以确保创建的软链接对象正常显示。 | 直接使用 | disable |
新增直读功能
新增直读功能,优化大文件顺序读(只读)的性能。
挂载OSS存储卷时,为支持完整的写及随机读场景,从OSS服务端读文件时,需要先将数据存储至磁盘,再从磁盘中读取数据返回,即ossfs的最大读性能将受到磁盘IO限制。
直读功能将使用内存预取数据,跳过数据刷盘即直接写入数据而不立刻同步到磁盘,直接从内存读取返回,提升顺序读性能。但需要注意以下事项:
建议适用于顺序读(只读)场景,打开某个文件后:
随机读操作:将触发ossfs重新预取新数据,大量的随机读操作可能影响读性能。
写操作:为保证性能与数据一致性,将自动回退到默认的刷盘逻辑。
开启直读功能时,
use_cache
配置项会失效。使用内存存储预取数据,可能会导致内存使用增加。可参考下表中direct_read_prefetch_limit配置项限制内存使用量。当到达内存上限时,将自动停止预取,最大读性能将受网络IO限制。
直读功能相关的配置项如下表所示:
配置项 | 说明 | 1.91及以上版本默认值 |
| 是否开启直读功能。直接使用-o direct_read开启,无需value。 | disable |
| 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)测试对比如下。
由以上读写吞吐对比图示看出,当未开启readdir优化功能及直读功能时:
1.88.x版本的ossfs在create file和sequential read上有优势。
1.91及以上版本的ossfs在sequential Write、Random Read和Random Write上有优势。
开启readdir优化功能后ls和find操作性能对比
开启readdir优化功能前后,对1000个文件执行ls
及find
指令的耗时对比如下。
由以上性能对比图示看出,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进程使用的内存,包括直读功能预取使用的内存和其他内存。
由以上性能对比图示看出,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性能压测。
操作步骤
创建OSS存储卷与存储声明PVC,建议您在新创建的Bucket或子路径下测试。具体操作,请参见使用OSS静态存储卷。
使用以下sysbench.yaml内容,创建sysbench应用,并挂载上一步已创建的PVC。
执行以下命令,部署sysbench应用。
kubectl apply -f sysbench.yaml
登录到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优化功能及直读功能进行简单验证。