元数据配置与调优

使用ossfs 2.0与对象存储OSS交互时,合理优化发往OSS服务端的元数据请求量,不仅能减少OSS请求以节省服务调用成本,还能提升系统并发处理能力以及改善挂载点的读写性能。本文介绍一些典型场景下的元数据调优最佳实践。

配置项

配置项

说明

attr_timeout

元数据缓存失效时间。单位为秒。默认为60s。失效后需向OSS请求最新的元数据。

max_inode_cache_count

表示启用主动控制元数据缓存数量。

  • 默认为0,表示不主动进行元数据数量控制,依赖操作系统自动淘汰元数据。

  • 配置为正整数时,表示启用元数据数量主动控制。当缓存条目数超过设定值时,ossfs2.0 将按照一定的规则淘汰超出部分的条目。

oss_negative_cache_timeout

负缓存的失效时间。单位为秒。

  • 默认为0,表示不启用负缓存。

  • 配置为正整数时,表示启用负缓存且负缓存在设定时间后过期。

oss_negative_cache_size

负缓存的最大条目数量。默认为10000。当缓存条目数超过设定值时,ossfs2.0 将按照一定的规则淘汰超出部分的条目。

场景与使用建议

减少OSS请求与性能加速

场景

使用建议

依次访问已知文件列表中的文件

开启元数据缓存。在遍历访问某个文件夹下的所有文件时,先通过ls命令将目标文件夹下所有文件的元数据提前加载至本地元数据缓存。同时配合较长的缓存失效时间attr_timeout,以此减少后续访问子目录项时的重复元数据请求,最终实现整体性能的提升。

大量创建文件

开启元数据负缓存。挂载时指定--oss_negative_cache_timeout=30(单位为秒,建议小于attr_timeout)和--oss_negative_cache_size(默认值为10000,如无特殊情况,保持默认即可)。

场景同时满足如下条件:

  • 文件数量较多(如超过100万)、变动不频繁(如只读场景)且需重复访问文件

  • 有读写操作消耗机器的页缓存,会触发操作系统内存压力回收元数据

  • 机器内存足够

    重要

    以平均文件名长度为50字节估算,100万个元数据的内存占用最多约600 MiB,1000万个元数据的内存占用最多约6 GiB。实际建议预留充足的内存余量。

样例场景:在64 GiB 内存的机器上执行包含1000万条数据集的ImageNet训练任务。任务会先遍历数据集构建元数据,随后再读文件。

使用建议:读任务会占用机器的页缓存,使得操作系统内核会发起请求淘汰元数据。开启元数据缓存,可避免元数据淘汰,将其全部缓存在内存中,减少后续的OSS元数据请求。机器内存足够缓存全部1000万条元数据且留有充足的余量。

  • 设置--max_inode_cache_count为超过所需访问的全部文件数量(如11000000),将元数据全部缓存。

  • 此外还需设置--attr_timeout为一个较大的值(如36000,即10小时),避免元数据频繁失效。

内存控制

访问场景

场景示例

使用建议

需要访问的文件数量不多

访问文件数量在100万以内

无需专门设置,由操作系统自动控制元数据缓存数量。

文件不会重复访问

访问一个目录后,后续在元数据过期时间前均无需读取该目录下的文件

无需专门设置,由操作系统自动控制元数据缓存数量。

对内存占用比较敏感

希望减少ossfs2进程的元数据占用,且对元数据性能不敏感

根据实际需求设置--max_inode_cache_count参数。

ossfs 2.0的读写缓冲也有内存占用(挂载选项说明),实际操作时建议预留部分内存。

使用示例

场景示例

使用建议

执行ImageNet训练任务

  • 机器规格:16 核CPU,64 GiB内存

  • 数据集大小:1000

挂载时指定--max_inode_cache_count=11000000 --attr_timeout=36000,将元数据全部缓存,且过期时间设为10小时。基于此配置的训练过程中ossfs 2.0进程占用内存约为5.9 GiB,训练速度约为每秒2100张图片。

使用默认参数时,训练速度约为每秒630张图片。

频繁查询文件,文件大小较小(如10 KB)或无并发访问

  • 机器规格:8 核CPU,32 GiB内存

  • 文件数量:10

挂载时指定--attr_timeout=36000。元数据占用内存并不多,仅将过期时间设为较大的值(如10小时)即可。在首次访问10万个文件后的10小时内,再次访问均能命中缓存。例如单流依次执行stat命令查询Bucket中的10万个文件,首次访问耗时约为781s,后续10小时内多次重新访问耗时均约为55s。

发起10个并发,单并发创建1万个空文件

  • 机器规格:8 核CPU,32 GiB内存

  • 文件数量:10万,单并发1

挂载时指定--oss_negative_cache_timeout=30。配置负缓存后,耗时约为470s。

如果未配置负缓存,则耗时约为680s,且OSS元数据请求数量多一倍。

依次读取单目录下文件元数据

  • 机器规格:8 核CPU,32 GiB内存

  • 文件数量:1

挂载时指定--attr_timeout=36000。提前执行ls命令,再读取文件夹下文件元数据,耗时约为18s。

未提前执行ls命令,直接读取目录下文件元数据,耗时约为111s。