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 | 表示启用主动控制元数据缓存数量。
|
readdirplus | 执行readdir操作时,是否预加载元数据缓存。
|
close_to_open | 是否支持close-to-open语义。
|
一致性说明
开启文件属性缓存后,可能会导致ossfs 2.0挂载目录元数据与OSS Bucket中不一致。在默认情况下(attr_timeout为60s),如果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 | 负缓存的失效时间。单位为秒。
|
oss_negative_cache_size | 负缓存的最大条目数量。默认为10000。当缓存条目数超过设定值时,ossfs2.0 将按照一定的规则淘汰超出部分的条目。 |
一致性说明
开启元数据负缓存后,如果 ossfs 2.0 曾缓存某文件(如 object-A)的“不存在”结果(即 404 响应),则即使该文件已在 OSS 服务端被创建,在负缓存有效期内仍无法被访问。只有等待指定的oss_negative_cache_timeout时间到期后,负缓存项失效,后续 stat 等命令才能重新获取到该文件并正常显示。因此在对数据一致性要求较高的场景,不建议开启负缓存功能。