元数据缓存

ossfs 2.0支持通过元数据缓存减少访问文件时产生的OSS元数据请求并提升元数据性能。元数据缓存包括文件属性缓存和负缓存。本文介绍元数据缓存的工作原理。

背景信息

当通过 ossfs 2.0 查询文件元数据时,系统会将其转换为多个 OSS 请求,以模拟本地文件系统的语义。随着文件路径深度增加,OSS 请求次数呈倍数增长,可能引发高 QPS 消耗,影响整体性能并增加服务端负载。

为降低频繁元数据查询带来的请求压力、提升访问效率,ossfs 2.0 引入了多种缓存机制,包括文件属性缓存和负缓存(Negative Cache),通过在客户端缓存正向结果(文件存在)与负向结果(文件不存在),有效减少对 OSS 的重复探测请求,从而显著降低请求频率、提升元数据访问性能。

文件属性缓存

当通过stat等命令首次访问文件或文件夹时,ossfs 2.0会发送OSS请求获取其元数据信息。如果启用了元数据缓存,ossfs 2.0将获取的元数据缓存在内存中。后续对该路径的元数据查询将优先从缓存读取,从而减少对 OSS 的重复请求。

目前支持缓存的文件属性包括文件大小、修改时间和文件类型。其中文件类型仅支持普通文件和文件夹两种类型。

缓存的有效期由attr_timeout(默认为60s)参数控制,在有效期内的访问直接返回缓存结果。当缓存过期后,需重新发起 OSS 请求以获取最新元数据。

默认情况下,当操作系统监测到内存到达一定水位(由操作系统动态计算)时,会根据自身内存管理机制动态触发元数据淘汰操作,通知 ossfs 2.0 释放部分缓存。此外,还支持通过设置max_inode_cache_count参数主动控制文件属性缓存的数量。

适用场景

适用于“读多写少”且变更可控的场景。建议在以下场景中开启文件属性缓存:

  • 挂载的 Bucket 处于只读状态:无写入或修改操作,本地缓存与 OSS 数据始终保持一致。

  • 仅有一个 ossfs 2.0 进程对 Bucket 执行写入操作:单点写入可确保元数据变更来源唯一,避免缓存不一致问题。

    重要

    当多个用户同时修改同一 Bucket 时,如需开启文件属性缓存,请确保各用户的操作路径相互隔离、无重叠或冲突。例如按用户、任务等划分独立目录结构。

配置项

ossfs2.0 提供了灵活的配置项用于管理元数据的文件属性缓存。

配置项

说明

attr_timeout

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

max_inode_cache_count

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

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

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

readdirplus

执行readdir操作时,是否预加载元数据缓存。

  • true(默认):在readdir操作时同步构建子目录项的元数据(如大小、修改时间等)。由于需在内存中维护子目录项的元数据信息,会导致消耗更多内存,但能大大提升后续访问的性能。

  • false:在readdir操作时仅获取文件名列表,不预先构建任何元数据。关闭后,但可能导致频繁的元数据查询请求,影响性能。

close_to_open

是否支持close-to-open语义。

  • false(默认):打开文件时根据文件的元数据缓存过期时间,决定是否发送请求到OSS以获取最新的文件属性。

  • true:打开文件时会发送OSS请求获取OSS中的文件信息,保证元数据信息的实时性。开启后,由于每次打开文件时都会强制发送请求到OSS,在大量读取小文件的场景下会显著增加访问时延。

一致性说明

开启文件属性缓存后,可能会导致ossfs 2.0挂载目录元数据与OSS Bucket中不一致。在默认情况下(attr_timeout60s),如果Bucket中的文件发生变化,通过ossfs 2.0使用stat命令查看该文件,最长需等待60s才能获取到变化后的文件。

在读写场景下,如果OSS中的文件更新频繁,需保证打开文件时元数据实时性,请开启close_to_open选项,不使用本地元数据缓存,保证强一致性。

负缓存

负缓存用于记录文件不存在的状态,避免对频繁访问但实际不存在的路径重复发起 OSS 请求。

通过 ossfs 2.0 查询一个不存在的文件时,系统会向 OSS 发起请求并收到 404 Not Found 响应。如果启用了负缓存,ossfs 2.0 将不会丢弃该结果,而是将其缓存至内存中。在负缓存有效期内,后续对该路径的查询将直接返回即文件(夹)不存在 错误,无需再次发送OSS请求。

负缓存过期时间由oss_negative_cache_timeout(默认为0)参数控制,在有效期内的访问直接返回负缓存结果。当负缓存过期后,需重新发起 OSS 请求以更新负缓存。

负缓存数量上限由oss_negative_cache_size(默认为10000)参数控制,如果负缓存的条目数量超过设定值,会按照一定优先级自动进行淘汰。

适用场景

建议在以下场景中开启负缓存:

  • 挂载的 Bucket 处于只读状态:无写入或修改操作,本地缓存与 OSS 数据始终保持一致。

  • 批量创建文件前存在大量试探性访问:程序通过stat 探测多个配置路径、资源文件或插件目录时部分路径可能不存在。

配置项

ossfs提供了灵活的配置项用于管理元数据的负缓存。

配置项

说明

oss_negative_cache_timeout

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

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

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

oss_negative_cache_size

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

一致性说明

开启元数据负缓存后,如果 ossfs 2.0 曾缓存某文件(如 object-A)的“不存在”结果(即 404 响应),则即使该文件已在 OSS 服务端被创建,在负缓存有效期内仍无法被访问。只有等待指定的oss_negative_cache_timeout时间到期后,负缓存项失效,后续 stat 等命令才能重新获取到该文件并正常显示。因此在对数据一致性要求较高的场景,不建议开启负缓存功能。