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 字段的值设置为 -1,允许缓存的数据增长,直到占用您指定为 cache-dir 的值的目录中所有可用容量。

  • 您可以使用 cache-dir 字段指定用于存储文件缓存数据的目录。请注意,指定缓存目录是启用文件缓存的前提条件。

  • 您可以使用 ttl-secs 字段控制缓存数据失效的时间。默认情况下,ttl-secs 字段设置为 60,指定 60 秒。我们建议您提高该值。

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

随机读取和部分读取

如果首次文件读取操作从文件开头或偏移 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 缓存适用于所选存储空间支持的任何用户指定的目录,例如本地 SSD永久性磁盘内存中 tmpfsFilestore。Cloud Storage FUSE 缓存性能与缓存使用的底层存储空间相匹配,且开销极低。如需详细了解缓存性能,请参阅 Cloud Storage FUSE 缓存性能和最佳实践

持久性

卸载后,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 静态装载

  • 仅缓存特定文件夹或目录:您可以使用 –only-dir 选项仅装载和缓存特定的存储桶级文件夹,而不是装载整个存储桶。如需了解详情,请参阅在存储桶中装载目录

统计信息缓存概览

Cloud Storage FUSE 统计信息缓存是用于对象元数据的缓存,可提高特定于文件属性(例如大小、修改时间或权限)的操作的性能。利用统计信息缓存,可通过使用缓存的数据执行操作(而不是向 Cloud Storage 发送统计信息对象请求)来缩短延迟时间。默认情况下,统计信息缓存处于启用状态,其 stat-cache-max-size-mb 值为 32 MB,ttl-secs 值设置为 60 秒。我们建议您同时增加这两个值。如需详细了解统计信息缓存,请参阅 GitHub 上的语义文档

类型缓存概览

Cloud Storage FUSE 类型缓存是元数据缓存,可加快用于检查文件或目录是否存在的特定元数据操作的性能。使用类型缓存可通过在本地存储相关信息,减少为检查文件或目录是否存在而向 Cloud Storage 发出的请求数量,从而缩短延迟时间。默认情况下,类型缓存处于启用状态,其 type-cache-max-size-mb 值为 4 MB,ttl-secs 值为 60 秒。我们建议您同时增加这两个值。如需详细了解类型缓存,请参阅 GitHub 上的语义文档

配置缓存失效

ttl-secs 字段指定元数据在文件缓存中保持有效的时长。该字段表示缓存数据的存留时间 (TTL),缓存数据会在 TTL 到期后失效。当元数据条目无效时,系统会从 Cloud Storage 查询后续读取数据。

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

如果为 ttl-secs 指定的值大于 0,则文件缓存的元数据仅在您指定的时间内有效。所有缓存类型均设置了默认值 60。对于文件缓存,我们建议您在平衡一致性需求的同时,根据两次重复读取之间的预期时间来增加 ttl-secs 值。根据数据更改的重要性和频率,我们建议您将 ttl-secs 值设置为您的工作负载允许的最高值。

除了指定表示秒数的值之外,ttl-secs 标志还支持 0-1 的值。

  • ttl-secs 值为 0:当您输入值 0 时,ttl-secs 标志可确保通过向 Cloud Storage 发出“获取元数据”调用来确保读取最新文件,该调用可检查从中传送数据的文件,以确保缓存保持一致。如果缓存中的文件是最新的,则会直接从缓存传送。与指定 ttl-secs 值(0 除外)时相比,性能效率较低,因为必须始终先调用 Cloud Storage 来优先检查元数据。如果文件位于缓存中并且未更改,则在发出“获取元数据”调用后从缓存中传送文件并保持一致性。

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

缓存数据的读取路径

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

注意事项

  • 将 Cloud Storage FUSE 与文件缓存、统计信息缓存或类型缓存搭配使用可以提高性能,但会降低一致性。如需了解详情,请参阅 GitHub 上的语义文档

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

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

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

后续步骤