Cloud Storage FUSE 性能和最佳实践

本页面介绍 Cloud Storage FUSE 在延迟时间、带宽和重试方面的性能,以及使用 Cloud Storage FUSE 时的最佳实践。

读写

与随机读写工作负载相比,Cloud Storage FUSE 更适合顺序读写工作负载。Cloud Storage FUSE 使用启发式方法来检测文件何时被顺序读取,这使得 Cloud Storage FUSE 能够使用相同的 TCP 连接向 Cloud Storage 发出更少、更大的读取请求。

为了优化顺序读取性能,建议上传和读取大小介于 5 MB 到 200 MB 之间的文件。为了优化随机读取性能,建议您上传和读取大小约为 2 MB 的文件。

缓存

将 Cloud Storage FUSE 与文件、统计信息、类型或这三种缓存类型搭配使用可以提高性能并降低费用,但也可以降低一致性。

统计信息和类型缓存

统计信息和类型缓存可以减少重复读取同一文件时对 Cloud Storage 的串行调用次数,从而提高性能。根据具有重复读取且可能受益于缓存的文件的数量设置统计信息和类型缓存。您可以使用文件数来表示缓存的大致大小。我们建议对每种缓存类型应用以下限制:

  • stat-cache-max-size-mb:如果您的工作负载最多涉及 20,000 个文件,请使用默认值 32。如果您的工作负载超过 20,000 个文件,则每增加 6,000 个文件,stat-cache-max-size-mb 值就将增加 10,每个文件大约增加 1,500 个字节。

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

  • type-cache-max-size-mb:如果要装载的存储桶的单个目录中的最大文件数最多为 20,000,请使用默认值 4。如果要装载的单个目录中的最大文件数超过 20,000,则每 5,000 个文件 type-cache-max-size-mb 值将增加 1,平均每个文件大约增加 200 个字节。

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

我们建议您在运行工作负载之前,通过在已装载的存储桶上传递 ls -R 来运行完整列表,以更快的批处理方法提前填充类型缓存,从而提高首次运行时的性能。

文件缓存最佳实践

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

IOPS(每秒查询次数)

对于需要高瞬时每秒输入/输出操作次数(IOPS,在 Cloud Storage 中也称为“每秒查询次数”)的工作负载,Filestore 是比 Cloud Storage FUSE 更好的选择。Filestore 也是在单个文件系统上获得非常高的 IOPS 和更低延迟的更好选择。

或者,如果底层缓存介质 IOPS 高、延时低,您还可以使用 Cloud Storage FUSE 文件缓存功能在其性能特征基础上进行构建。

延迟时间和吞吐量

Cloud Storage FUSE 的延迟时间高于本地文件系统。当您一次读取或写入一个小型文件时,吞吐量会降低,因为这会导致多次单独的 API 调用。一次读取或写入多个大型文件有助于提高吞吐量。使用 Cloud Storage FUSE 文件缓存功能提高较小的随机 I/O 的性能。

Cloud Storage FUSE 的文件系统延迟时间会影响 rsync,一次只能读写一个文件。如需并行向存储桶或从存储桶转移多个文件,请运行 gcloud storage rsync 来使用 Google Cloud CLI。如需了解详情,请参阅 rsync 文档

实现最大吞吐量

如需实现最大吞吐量,请使用具有足够 CPU 资源的机器来提高吞吐量并使网络接口卡 (NIC) 达到饱和。CPU 资源不足可能会导致 Cloud Storage FUSE 限流。

如果您使用的是 Google Kubernetes Engine,且工作负载需要更高的吞吐量,请增加对 Cloud Storage FUSE 边车容器的 CPU 分配。您可以增加边车容器使用的资源或分配不限数量的资源。

速率限制

如需限制 Cloud Storage FUSE 向 Cloud Storage 发送的流量的速率,您可以在 gcsfuse 命令中使用以下选项:

  • --limit-ops-per-sec 选项用于控制 Cloud Storage FUSE 向 Cloud Storage 发送请求的速率。

  • --limit-bytes-per-sec 选项用于控制 Cloud Storage FUSE 从 Cloud Storage 下载数据的带宽。

如需详细了解这些选项,请参阅 gcsfuse 命令行文档

所有速率限制都是近似值,并在 8 小时内完成。默认情况下,系统不会应用速率限制。

上传过程控制

默认情况下,从 Cloud Storage FUSE 到 Cloud Storage 的失败请求会使用指数退避算法重试,不超过指定的退避时长上限,值默认为 30s(30 秒)。退避时长超过指定的时长上限后,重试会继续指定的时长上限。您可以在 gcsfuse 调用中使用 --max-retry-sleep 选项来指定退避时长。

如需详细了解 --max-retry-sleep 选项,请参阅 gcsfuse 命令行文档

目录语义

Cloud Storage 使用平面命名空间运行,这意味着目录实际不存在于 Cloud Storage 中,而是以斜杠 (/) 结尾的对象名称表示(例如,在对象名称 my-bucket/directory/file.txt 中,my-bucket/directory/ 表示目录)。作为对象名称的一部分但不是实际存在的对象的目录称为隐式定义的目录

默认情况下,当您装载具有隐式定义目录的存储桶时,Cloud Storage FUSE 无法推断或访问这些目录。Cloud Storage FUSE 只能推断明确定义的目录,也就是说,目录是 Cloud Storage 存储桶中实际存在的对象。

例如,假设您装载一个名为 my-bucket 的存储桶,其中包含对象 my-bucket/directory/file1.txt。如果您在存储桶装载点上运行 ls,则 Cloud Storage FUSE 将无法访问 my-bucket/directory/ 目录或其中的 file1.txt 对象,因为 directory 不是 Cloud Storage 中实际存在的对象。如需允许 Cloud Storage FUSE 推断目录及其中的对象,您可以使用 mkdir 命令在本地文件系统中创建目录或者在 gcsfuse 命令中添加 --implicit-dirs 选项,以明确定义目录。

如需详细了解目录语义,包括如何使用现有前缀装载存储桶,请参阅 GitHub 文档中的文件和目录。 如需详细了解 --implicit-dirs 选项,请参阅 Cloud Storage FUSE 命令行文档

列出对象时的注意事项

当您列出已装载存储桶中的所有对象时(例如,通过运行 ls),Cloud Storage FUSE 会在 Cloud Storage 上调用对象:列出 API。API 会对结果进行分页,这意味着 Cloud Storage FUSE 可能需要发出多次调用,具体取决于存储桶中的对象数量。请注意,这可能会使列出操作费用高昂,速度缓慢。

基准

如需了解如何对 Cloud Storage FUSE 执行负载测试,请参阅 GitHub 文档中的性能基准

日志记录

如需为 Cloud Storage FUSE 活动(包括日志轮换)配置日志记录,请在 Cloud Storage FUSE 配置文件中指定 logging 键下的字段。默认情况下,日志文件会轮替并占用大约 1 GiB 的空间。