元数据缓存

ossfs元数据缓存适用于单机高I/O读写OSS数据的场景。开启ossfs元数据缓存后,能够提升整体的文件操作效率,使文件操作响应更加迅速。本文将为您介绍如何更好地使用和配置ossfs元数据缓存。

重要

在使用元数据缓存时,需要留意数据一致性和时效性问题。因此,在对数据实时性要求较高的场景中,不建议开启ossfs元数据缓存。

功能背景

元数据是指描述数据的数据,包括文件大小、创建时间、修改时间、用户和组ID等,其中用户和组ID等信息是对象存储所不具备的属性,但文件系统会依赖这些属性做权限相关检查。ossfs通过获取OSS内文件自定义头中的额外的信息,从而支持在Linux环境中根据文件属性进行文件操作。

通过启用ossfs元数据缓存,在性能、资源以及用户体验方面都有显著优势。

  • 性能方面,能够减少元数据读取的延迟,尤其是在高I/O操作的场景下,可提升整体的文件操作效率。

  • 资源方面,能减少对OSS服务的调用次数,降低频繁访问热点数据时的QPS压力。

  • 用户体验方面,对于用户来说,文件操作响应更快。

适用场景

  • 单机访问OSS场景。

  • 在分布式环境下,从对象存储服务(OSS)中读取那些不频繁变化的数据的场景,例如在进行AI训练集的读取、AI模型文件的读取以及大数据查询等操作。

工作原理

ossfs通过使用客户端内存对OSS的元数据进行缓存,以此降低远程存储的操作延迟。具体机制如下:

  • 初次访问缓存:

    当ossfs挂载点下的文件或目录首次被访问时,ossfs客户端会从OSS获取该对象的元数据,并将其存储在本地缓存中。

  • 后续访问加速:

    如果未开启缓存淘汰策略或者缓存未过期,后续对该对象的元数据访问将直接从本地缓存中读取,无需再次向OSS发起网络请求,从而大大减少了延迟。

  • 缓存更新策略:

    ossfs会依据一定的策略(例如缓存过期、缓存超限等)来更新本地缓存。

  • 多客户端缓存同步:

    ossfs的元数据缓存为使用客户端内存的单机本地缓存,不支持单机多ossfs挂载以及多机间元数据的变动同步。

模式对比

未开启元数据缓存与开启元数据缓存两种模式对比情况如下:

是否开启元数据缓存

命令

请求方式

操作

性能

未开启元数据缓存

stat

向OSS远程Bucket发送HeadObject请求去获取文件项元数据。

每个文件对应一个HeadObject请求,从OSS远程Bucket获取数据。

OSS远程Bucket中获取文件项元数据,读取速度相对内存中较慢。

ls

向OSS远程Bucket发送ListObject请求获取目录列表数据、发送HeadObject请求获取文件项元数据。

发起一个ListObject请求,目录下每个文件/目录项都对应一个HeadObject请求,从OSS远程Bucket获取数据。

开启元数据缓存(元数据缓存未过期)

stat

本地内存中获取文件项元数据。

内存中获取数据。

本地内存中获取文件项元数据,读取速度快。

ls

向OSS远程Bucket发送ListObject请求获取目录列表数据、本地内存中获取文件项元数据。

发起一个ListObject 请求,从OSS的远程Bucket中获取数据;而对于目录下的每个文件或目录项,从内存中获取相应的数据。

配置选项

ossfs提供了灵活的配置选项来管理元数据缓存:

选项名称

描述

参数值

max_stat_cache_size

控制是否启用元数据缓存和缓存的大小。请根据OSS中被频繁访问的对象数量进行配置。在内存充足时,建议配置足够大的值,以有效提升操作体验。

-omax_stat_cache_size=1,000,000,此时元数据缓存空间约占内存400 MB。如果设置为0,表示禁用元数据缓存。若不进行设置,则表示使用默认值。

默认值:100,000

单位:个(文件或目录)

大小:约占用内存40 MB

stat_cache_expire

控制是否启用元数据缓存的过期淘汰策略以及调整缓存的过期时间。建议根据业务需求自定义缓存过期时间。

-ostat_cache_expire=1800表示缓存过期时间为30分钟。如果设置为-1,表示关闭缓存的过期淘汰策略。若不进行设置,则表示使用默认值。除非数据挂载后不会进行任何更新,否则不建议关闭淘汰策略。

说明

ossfs默认开启缓存过期淘汰策略,并且设置了缓存上限。缓存上限默认为100,000个(文件或目录),约占用内存40 MB。

默认值:900

单位:秒

readdir_optimize

控制是否使用缓存优化,默认为不使用。

添加该挂载选项后ossfs在ls时不会发送HeadObject请求去获取文件项元数据如giduid等,只有访问文件大小为0才发送HeadObject请求。不过,由于权限检查等原因,仍然可能产生一定数量的HeadObject请求,此参数请根据应用程序特性选择。

如需启用,您可以在挂载时添加-oreaddir_optimize=true

默认值:false

元数据缓存管理机制

ossfs元数据缓存管理机制如下表所示。

缓存情况

操作

文件属性已在缓存且未开启淘汰策略或缓存未过期

直接从缓存中读取文件元数据

文件属性已在缓存但缓存过期

更新该缓存

文件属性不在缓存内且缓存空间有空余

直接将新条目加入缓存

文件属性不在缓存内且缓存已满并开启缓存过期淘汰策略

遍历缓存,删除过期条目

文件属性不在缓存内且缓存已满未开启缓存过期淘汰策略

根据LRU策略,淘汰长时间未访问过的条目

使用建议

  • 若您不关注文件的元数据,建议添加readdir_optimize选项,可大幅提升listfind性能。开启后不再支持软链接。

  • 在多客户端高数据更新实时性需求场景中,需谨慎启用缓存。可通过设置-omax_stat_cache_size=0禁用缓存以维持一致性,但这可能导致性能下降及额外费用。

    若应用需要保证多客户端强一致性,建议使用云存储网关CSG文件存储CPFS,不建议使用ossfs。

  • 在文件数量较多的情况下,适当增大max_stat_cache_size值以避免频繁淘汰。

    如果操作的文件数过多,且服务器内存又不足时,建议使用ossutilOSS SDK进行操作。如果必须采用挂载方式来挂载对象存储服务(OSS),建议使用云存储网关CSG或者文件存储CPFS