Cloud Storage FUSE 中的缓存概览

Cloud Storage FUSE 提供四种类型的可选缓存来帮助提高数据检索的性能:

文件缓存概览

Cloud Storage FUSE 文件缓存是基于客户端的读取缓存,可从您选择的速度更快的缓存存储空间中传送重复文件读取。

文件缓存的优势

  • 提高性能:文件缓存通过直接从缓存介质传送读取来缩短延迟时间并提高吞吐量。从缓存传送时,小型随机 I/O 操作的速度可以显著加快。

  • 使用现有容量:文件缓存可以使用缓存目录的现有预配机器容量,而不会产生额外的存储费用。这包括 Cloud GPU 机器类型(例如 a2-ultragpua3-highgpu)随附的本地 SSD、永久性磁盘(每个虚拟机使用的启动磁盘)或内存中 /tmpfs

  • 减少费用:缓存命中在本地传送,不会产生 Cloud Storage 操作或网络费用。

  • 提高了 AI 和机器学习训练的总拥有成本:文件缓存通过更快地加载数据来提高 Cloud GPU 和 Cloud TPU 的利用率,这样可以缩短训练时间并提供更高的 AI 和机器学习训练工作负载的性价比。

启用并配置文件缓存

文件缓存默认处于停用状态,您可以使用 Cloud Storage FUSE 配置文件启用和配置它。您可以使用以下字段控制缓存行为:

  • max-size-mb:用于控制缓存数据可占用的缓存目录最大容量。默认情况下,max-size-mb 字段会设置为允许缓存的数据增长,直到占用缓存目录中所有可用容量。

  • cache-dir:指定用于存储文件缓存数据的目录。请注意,指定缓存目录是启用文件缓存的先决条件。

  • ttl-secs:确定缓存的数据何时过期,需要从 Cloud Storage 刷新。默认情况下,ttl-secs 字段会在处于非活跃状态 60 秒后过期并从 Cloud Storage 刷新。我们建议您增加此值。

    如需了解如何控制缓存数据失效,请参阅配置缓存数据失效。如需详细了解缓存数据逐出,请参阅逐出

  • enable-parallel-downloads:通过使用多个工作器并行下载文件(使用文件缓存目录作为预提取缓冲区),加快大小超过 1 GB 的大型文件(包括首次读取)的读取性能。 我们建议您为服务和检查点恢复操作启用并行下载。如需详细了解如何启用和配置并行下载,请参阅配置并行下载

随机读取和部分读取

如果首次文件读取操作从文件开头(偏移 0)开始,则 Cloud Storage FUSE 文件缓存会提取整个文件并将其加载到缓存中,即使只读取小部分子集也是如此。这样可以直接从缓存传送来自同一对象的后续随机或部分读取。

如果文件的首次读取操作从偏移 0 以外的任何位置开始,则默认情况下,Cloud Storage FUSE 不会触发异步完整文件提取。如需更改此行为,以便 Cloud Storage FUSE 在初始随机读取时将文件提取到缓存,请将 cache-file-for-range-read 标志设置为 true。如果对同一对象执行许多不同的随机或部分读取操作,我们建议您启用 cache-file-for-range-read 标志。

逐出

逐出缓存的元数据和数据的方式是基于最久未使用 (LRU) 算法,该算法会在达到按照 max-size-mb 限制配置的空间阈值后开始。如果条目根据 TTL 过期,则系统首先会对 Cloud Storage 发出“获取元数据”调用,且受网络延迟时间的限制。由于数据和元数据是单独管理的,因此您可能会遇到一个实体被逐出或失效,而另一个实体不会被逐出或失效的情况。

持久性

卸载后,Cloud Storage FUSE 缓存不会保留,并会在重启时重启。对于文件缓存,虽然在卸载和重启时会移除从缓存中提供文件所需的元数据条目,但文件缓存中的数据可能仍存在于文件目录中。您应在卸载或重启后删除文件缓存目录中的数据。

安全

启用缓存后,Cloud Storage FUSE 会使用您使用 cache-dir 字段指定的缓存目录作为缓存的底层目录,以未加密的格式保存 Cloud Storage 存储桶中的文件。有权访问此缓存目录的任何用户或进程都可以访问这些文件。我们建议您限制对此目录的访问。

直接访问或多次访问文件缓存

使用 Cloud Storage FUSE 以外的进程访问或修改缓存目录中的文件可能会导致数据损坏。Cloud Storage FUSE 缓存特定于每个运行中的 Cloud Storage FUSE 进程,但在相同或不同机器上运行的不同 Cloud Storage FUSE 进程中无法感知。因此,我们不建议为不同的 Cloud Storage FUSE 进程使用同一缓存目录。

如果多个 Cloud Storage FUSE 进程需要在同一机器上运行,则每个 Cloud Storage FUSE 进程都应有自己的特定缓存目录,或使用以下某种方法确保您的数据不会损坏:

  • 使用共享缓存装载所有存储桶:使用动态装载,通过共享缓存在单个进程中装载您有权访问的所有存储桶。如需了解详情,请参阅 Cloud Storage FUSE 动态装载

  • 在特定存储桶上启用缓存:使用静态装载仅对指定的存储桶启用缓存。如需了解详情,请参阅 Cloud Storage FUSE 静态装载

  • 仅缓存特定文件夹或目录:仅装载和缓存特定的存储桶级文件夹,而不是装载整个存储桶。如需了解详情,请参阅在存储桶中装载目录

统计信息缓存概览

Cloud Storage FUSE 统计信息缓存是用于对象元数据的缓存,可提高特定于文件属性(例如大小、修改时间或权限)的操作的性能。利用统计信息缓存,可通过使用缓存的数据执行操作(而不是向 Cloud Storage 发送统计信息对象请求)来缩短延迟时间。如需详细了解统计信息缓存,请参阅 GitHub 上的语义文档

统计信息缓存默认处于启用状态,并且可以使用 Cloud Storage FUSE 配置文件进行配置。缓存的大小上限由 stat-cache-max-size-mb 字段控制,其默认值为 32 (32 MB)。缓存的 TTL 由 ttl-secs 字段控制,其默认值为 60(60 秒)。

最佳做法

对于统计信息缓存,如果您的工作负载最多涉及 20,000 个文件,我们建议您为 stat-cache-max-size-mb 字段使用默认值 32。如果您的工作负载超过 20,000 个文件,则每增加 6,000 个文件,stat-cache-max-size-mb 值就将增加 10,每个文件大约增加 1,500 个字节。

stat-cache-max-size-mb 是装载级层的限制,实际内存用量可能低于您指定的值。或者,您可以将 stat-cache-max-size-mb 设置为 -1,使统计信息缓存根据需要使用尽可能多的内存。

类型缓存概览

Cloud Storage FUSE 类型缓存是元数据缓存,可加快用于检查文件或目录是否存在的特定元数据操作的性能。使用类型缓存可通过在本地存储相关信息,减少为检查文件或目录是否存在而向 Cloud Storage 发出的请求数量,从而缩短延迟时间。如需详细了解类型缓存,请参阅 GitHub 上的语义文档

类型缓存默认处于启用状态,并且可以使用 Cloud Storage FUSE 配置文件进行配置。缓存的大小上限由 type-cache-max-size-mb 字段控制,其默认值为 4 (4 MB)。缓存的 TTL 由 ttl-secs 字段控制,其默认值为 60(60 秒)。

最佳做法

对于类型缓存,如果要装载的存储桶的单个目录中的文件数上限不超过 20,000,我们建议您为 type-cache-max-size-mb 字段使用默认值 4。如果要装载的单个目录中的最大文件数超过 20,000,则每 5,000 个文件 type-cache-max-size-mb 值将增加 1,平均每个文件大约增加 200 个字节。

type-cache-max-size-mb 是装载级层的限制,实际内存用量可能低于您指定的值。此外,您也可以将 type-cache-max-size-mb 值设置为 -1,使类型缓存根据需要使用尽可能多的内存。

列表缓存概览

Cloud Storage FUSE 列表缓存适用于目录和文件列表或 ls 响应,可提高列表操作速度。对于在执行过程中重复显示完整目录列表的工作负载(例如 AI/机器学习训练运行),列表缓存尤其有用。

列表缓存保留在页面缓存的内存中,由内核根据内存可用性进行控制,而状态和类型缓存则保留在机器的内存中,由 Cloud Storage FUSE 控制。

启用列表缓存

文件缓存默认处于停用状态。您可以使用 kernel-list-cache-ttl-secs 字段启用列表缓存,并使用以下任一值:

  • 一个正值,表示存留时间 (TTL)(以秒为单位),以将目录列表响应保留在内核的页面缓存中。

  • 值为 -1 可绕过条目到期时间,并在缓存可用时返回列表响应。

如需启用和配置列表缓存,请参阅 Cloud Storage FUSE 配置文件

配置缓存失效

以下部分介绍了如何为所有缓存类型配置缓存失效。

文件、统计信息和类型缓存失效

对于文件、统计信息和类型缓存,ttl-secs 字段会指定缓存元数据的存留时间 (TTL)(以秒为单位),即从 Cloud Storage 中提取到过期并需要刷新之间的时间。

您可以在 Cloud Storage FUSE 配置文件中配置 ttl-secs

ttl-secs 字段默认设置为 60。如果为 ttl-secs 指定的值大于 0,则文件缓存的元数据仅在您指定的时间内有效。对于文件缓存,我们建议您在平衡一致性需求的同时,根据两次重复读取之间的预期时间来增加 ttl-secs 值。根据数据更改的重要性和频率,我们建议您将 ttl-secs 值设置为您的工作负载允许的最高值。当元数据条目无效时,系统将从 Cloud Storage 查询后续读取操作。

除了接受表示缓存的元数据过期并需要刷新的特定 TTL 值(以秒为单位)之外,您还可以使用以下值来指定文件的读取方式:

  • ttl-secs 值为 0:通过向 Cloud Storage 发出 GET 元数据调用来确保读取包含最新数据的文件,该调用可检查从中传送数据的文件,以确保缓存保持一致。如果缓存中的文件是最新的,则会直接从缓存传送。指定 0 以外的值可能会导致性能降低,因为必须始终先调用 Cloud Storage 来优先检查元数据。如果文件位于缓存中并且未更改,则在发出“GET 元数据”调用后从缓存中传送文件并保持一致性。

  • ttl-secs 值为 -1:确保始终从缓存中读取文件(如果有),而不检查一致性。在不检查一致性的情况下传送文件可能会提供不一致的数据,只能临时用于数据未更改的作业中运行的工作负载。例如,使用 -1 值对于机器学习训练很有用,其中系统会跨多个周期读取相同的数据而不进行任何更改。

列出缓存失效操作

通过使用 kernel-list-cache-ttl-secs 字段指定大于 0 的值来设置列表缓存失效。目录列表响应会保留在内核的页面缓存中,并在您指定的时间内保持有效。默认情况下,列表缓存处于停用状态,并设置为值 0。如果您指定值 -1,Cloud Storage FUSE 会停用列表缓存到期时间,并在缓存可用时从缓存中返回列表响应。

缓存数据的读取路径

Cloud Storage FUSE 缓存会在将重复读取提取到缓存后加快这些读取的速度。在首次读取以及缓存未命中时,都会直接转到 Cloud Storage,且受到正常 Cloud Storage 网络延迟时间的限制。 如需提高首次读取性能,请参阅提高首次读取性能

注意事项

  • 启用文件缓存、统计信息缓存、类型缓存或列表缓存可以提高性能,但会降低一致性,这通常发生在您使用多个更改频率较高的客户端访问同一存储桶时。为减少对一致性的影响,我们建议将存储桶装载为只读。如需详细了解缓存行为,请参阅 GitHub 上的 Cloud Storage FUSE 语义文档

  • 如果文件缓存条目尚未根据其 TTL 过期,并且文件位于缓存中,则整个操作将从本地客户端缓存传送,而不会向 Cloud Storage 发出任何请求。

  • 如果文件缓存条目根据其 TTL 过期,则系统首先对 Cloud Storage 发出“获取元数据”调用,如果文件不在缓存中,则从 Cloud Storage 检索文件。这两种操作都会受到网络延迟的影响。如果元数据条目已失效,但文件在缓存中,并且其对象世代没有更改,则只有在发出“获取元数据”调用来检查数据是否有效之后,才会从缓存中传送该文件。

  • 如果 Cloud Storage FUSE 客户端修改缓存文件或其元数据,则文件会立即失效,并在同一客户端进行的后续读取中确保一致性。但是,如果不同的客户端访问同一文件或其元数据,并且缓存了其条目,则将读取文件或元数据的缓存版本而不是更新版本,直到该特定客户端的 TTL 设置使该文件无效。

  • 为避免缓存抖动,请确保整个数据集不超过缓存容量。此外,请考虑缓存介质可以提供的最大容量和性能。如果达到预配缓存的最大性能和/或容量限制,则直接从 Cloud Storage 读取会很有帮助,因为限制比 Cloud Storage FUSE 高得多。

后续步骤