Amazon EFS - Amazon Elastic File System
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon EFS

以下章节概述了 Amazon EFS 性能,并描述了您的文件系统配置如何影响关键性能维度。我们还提供了一些重要的提示和建议,以优化文件系统的性能。

性能摘要

文件系统性能通常使用延迟、吞吐量和每秒输入/输出操作数 (IOPS) 的维度来衡量。Amazon EFS 在这些维度上的性能取决于您的文件系统的配置。以下配置会影响 Amazon EFS 文件系统的性能:

  • 存储类别 — EFS 单区或 EFS 标准

  • 性能模式-一般用途或最大 I/O

  • 吞吐量模式 — 突发、弹性或预配置

下表说明了存储类和一般性能模式设置的可用组合下的 Amazon EFS 文件系统的性能。

存储类和性能模式组合的文件系统性能
延迟 1 最大 IOPS 最大吞吐量

文件系统配置-存储类和性能模式

读取操作

写入操作

读取操作

写入操作

Per-file-system 读2

Per-file-system 写 2

每台客户机读取/写入

单区存储和通用型

低至 250 微秒 (µs)

低至 1.6 毫秒 (ms)

35,000 7,000

3 — 5 GiBps

1 — 3 GiBps

500 MiBps

标准存储和一般用途

低至 250 微秒

As low as 2.7 ms 35,000 7,000

3 — 5 GiBps

1 — 3 GiBps

500 MiBps
注意

脚注:

  1. 延迟性能适用于 2022 年 12 月 17 日当天或之后创建的所有Amazon Web Services 区域可用 Amazon EFS 的文件系统和挂载目标。要在该日期之前创建的文件系统上实现指定的延迟性能,您需要删除并重新创建与该文件系统关联的装载目标。

    读取和写入成本优化的存储类别(标准 IA 和 One Zone-IA)的文件数据的延迟低为两位数毫秒。

  2. 最大读取和写入吞吐量取决于Amazon Web Services 区域和取决于文件系统的吞吐量模式。有关更多信息,请参阅默认吞吐

    吞吐量超过的最Amazon Web Services 区域大吞吐量需要增加吞吐量配额。Amazon EFS 服务团队会 case-by-case 根据任何增加吞吐量的请求进行考虑。批准可能取决于您的工作负载类型。要了解有关申请增加配额的更多信息,请参阅Amazon EFS 限额和限制

存储类别和性能

Amazon EFS 使用以下存储类别:

  • EFS 单区存储类 — EFS 单区和 EFS 单区不频繁访问(EFS 单区-IA)。EFS One Zone 存储类在单个可用区中复制数据。

  • EFS 标准存储类别 — EFS 标准和 EFS 标准 IA。EFS 标准存储类跨多个可用区(多可用区)复制数据。

读取或写入任一 IA 存储类时的首字节延迟都高于 EFS 标准或 EFS One Zone 存储类的首字节延迟。

有关 EFS 存储类别的更多信息,请参阅 EFS 存储类

性能模式

Amazon EFS 提供两种性能模式:通用模式和最大 I/O 模式:

  • 通用模式支持高达 35,000 IOPS,每项操作的延迟最低,是文件系统的推荐性能模式。具有 EFS One Zone 存储类的文件系统始终使用通用性能模式。对于具有 EFS 标准存储类的文件系统,您可以使用默认的通用性能模式或 Max I/O 性能模式。

  • Max I/O 模式专为高度并行化的工作负载而设计,这些工作负载可以承受比一般用途模式更高的延迟。使用 EFS One Zone 存储类的文件系统或使用弹性吞吐量模式的文件系统不支持最大 I/O 模式。

注意

创建文件系统后,您无法更改文件系统的性能模式。

我们建议对绝大多数应用程序使用通用性能模式。如果您不确定要使用哪种性能模式,请选择通用性能模式。为了帮助确保您的工作负载保持在使用通用模式的文件系统可用的 IOPS 限制范围内,您可以监控该PercentIOLimit CloudWatch 指标。有关更多信息,请参阅Amazon EFS 的亚马逊 CloudWatch 指标

应用程序可以弹性地将其 IOPS 扩展到与性能模式相关的极限。您无需单独为 IOPS 付费;IOPS 包含在文件系统的吞吐量核算中。每个网络文件系统 (NFS) 请求都计为 4 千字节 (KB) 的吞吐量或其实际请求和响应大小,以较大者为准。

吞吐

文件系统的吞吐量模式决定了文件系统的可用吞吐量。Amazon EFS 提供三种吞吐量模式:突发、弹性和预配置。读取吞吐量打折,允许您提高读取吞吐量高于写入吞吐量。视情况而定Amazon Web Services 区域,读取discount 在 1.66 到 3 倍之间。有关更多信息,请参阅默认吞吐 折扣会降低读取计量的吞吐量,并且不会影响写入或突发积分累积。此外,读取折扣绝不会将为单个 NFS 请求计量的吞吐量降低到 4 KB 的最小请求大小以下。

了解按吞吐

所有 Amazon EFS 文件系统都有相关的计量吞吐量。每种吞吐量模式的计量吞吐量的确定方式各不相同。

  • 对于使用突增吞吐量模式的文件系统,计量吞吐量由 EFS 标准或 EFS One Zone 存储类中存储的数据量决定。

  • 对于使用弹性吞吐量模式的文件系统,计量吞吐量由读取和写入的数据量决定。

  • 对于使用预置吞吐量模式的文件系统,计量吞吐量由预置吞吐量决定。

读取请求和写入请求按不同的速率计费。Amazon EFS 计量读取请求的速率是其他请求的三分之一。

例 的 EFS 计量吞吐量

例如,如果您每秒 30 兆字节的读取吞吐量和写入吞吐量 (MiBps),则读取部分计为计量吞吐量的 10 MiBps ,写入部分计为 30 MiBps,计量吞吐量合计为 40 MiBps。经计量速率调整后的综合吞吐量反映在MeteredIOBytes亚马逊 CloudWatch 指标中。有关更多信息,请参阅Amazon EFS 的亚马逊 CloudWatch 指标

为文件系统选择正确的吞吐量模式

为您的文件系统选择正确的吞吐量模式取决于工作负载的性能要求。

  • 突增吞吐量 — 如果您希望吞吐量随文件系统中的存储量而扩展,请使用突增吞吐量模式。

    如果在使用突增吞吐量模式后,您发现您的应用程序受到吞吐量限制(例如,它使用了超过 80% 的允许吞吐量或者您已经用完了所有突发积分),则应使用弹性或预置吞吐量模式。

    有关更多信息,请参阅突增吞吐

  • 弹性吞吐量 — 当您的工作负载和性能要求激增或不可预测且难以预测,或者当您的应用程序将吞吐量提高到 5% 或更低的 average-to-peak 比率时,请使用弹性吞吐量。有关更多信息,请参阅弹性吞吐

  • 预置@@ 吞吐量-如果您知道工作负载的性能要求,或者当您的应用程序将吞吐量提高到 5% 或更高的 average-to-peak 比率时,请使用预置吞吐量。有关更多信息,请参阅预置吞吐

您可以使用 Amazon CloudWatch 通过将指标与MeteredIOBytes指标进行比较来确定您的工作负载 average-to-peak 比率。PermittedThroughput有关 Amazon EFS 指标的更多信息,请参阅Amazon EFS 的亚马逊 CloudWatch 指标

突增吞吐

对于需要随文件系统存储量而扩展吞吐量的工作负载,建议使用 Bursting Troupthoust 模式。在突增吞吐量模式下,基本吞吐量与 EFS 标准存储类中文件系统的大小成正比,速率 KiBps 为每 GiB 存储 50。当文件系统消耗的吞吐量低于其基本吞吐率时,会累积突发积分;当吞吐量超过基本速率时,突发积分会被扣除。

当有突发积分可用时,文件系统可以将吞吐量提高到 MiBps 每 TiB 存储 100 个,最高可达 Amazon EFS 区域的限制,最低为 100 MiBps。如果没有突发积分可用,则文件系统最多可以驱动 MiBps 每 TiB 存储 50 个,最少 1 个 MiBps。

有关每个区域限制的信息,请参阅突增和预置吞吐量模式的默认吞吐量配额表。

了解亚马逊 EFS 突发积分

使用突增吞吐量,每个文件系统都会随着时间的推移获得突发积分,基准速率由存储在 EFS 标准或 EFS One Zone Standard 存储类中的文件系统的大小决定。基准速率为 MiBps 每千兆字节 [TiB] 存储 50(相当于 KiBps 每 GiB 存储 50)。Amazon EFS 计量读取操作最高为写入操作速率的三分之一,允许文件系统将基准速率提高到 KiBps 每 GiB 读取吞吐量 150 或 KiBps 每 GiB 写入吞吐量 50。

文件系统可以持续以其基准计量速率提高吞吐量。每当文件系统处于非活动状态或使吞吐量低于其基准计量速率时,文件系统就会累积突发积分。累计的突增积分使文件系统可以推高吞吐量,使其高于其基准速率。

例如,在 EFS 标准存储中具有 100 GiB 计量数据的文件系统的基准吞吐量为 5 MiBps。在 24 小时的非活动状态下,文件系统可获得价值 432,000 MiB 的积分(5 MiB × 86,400 秒 = 432,000 MiB),这可以用来在 100 MiBps 的状态下突破 72 分钟(432,000 MiB ≥ 100 MiBps = 72 分钟)。

如果大于 1 TiB 的文件系统在剩下 50% 的时间内处于非活动状态,则它们在多达 50% 的时间内始终可以突然爆发。

下表提供了突增行为的示例。

文件系统大小 突增吞吐 基准吞吐
标准存储中有 100 GiB 的计量数据
  • 突增至 300 (MiBps) 只读,每天最多 72 分钟,或

  • 突增至 100 MiBps 只写模式,每天最多可写入 72 分钟

  • 连续驱动多达 15 个 MiBps 只读驱动器

  • 连续驱动多达 5 个 MiBps 只写模式

标准存储中有 1 TiB 的计量数据
  • 每天 12 小时突增至 300 MiBps 只读模式,或

  • 每天 12 小时突增至 100 MiBps 只写入

  • 驱动器 150 持续 MiBps 只读

  • 连续驱动 50 MiBps 次只写操作

标准存储中有 10 TiB 的计量数据
  • 每天 12 小时突破为 GiBps 只读 3,或

  • 每天 12 小时突增至 1 GiBps 只写模式

  • 驱动器 1.5 持续 GiBps 只读

  • 连续驱动 500 MiBps 只写驱动

通常,较大的文件系统
  • 每天 12 小时突增至每 TiB 存储容量 300 MiBps 只读,或

  • 每天 12 小时突增至每 TiB 存储容量 100 次 MiBps 只写入

  • 持续驱动每 TiB 存储容量 150 次 MiBps 只读

  • 持续驱动每 TiB 存储容量 50 次 MiBps 只写入

注意

Amazon EFS 为所有文件系统提供的计量吞吐量为 1 MiBps ,即使基准速率较低也是如此。

用于确定基准和突发率的文件系统大小是通过DescribeFileSystems API 操作提供的ValueInStandard计量大小。

小于 1 TiB 的文件系统可以获得的积分可达到最高 2.1 TiB 积分余额,对于大于 1 TiB 的文件系统,可达到每 TiB 存储 2.1 TiB 的积分余额。这种行为意味着文件系统可以累积足够的积分以连续突发长达 12 小时。

弹性吞吐

对于使用弹性吞吐量的文件系统,Amazon EFS 会自动向上或向下扩展吞吐量性能,以满足您的工作负载活动的需求。对于性能要求难以预测的峰值或不可预测的工作负载,或者对于将吞吐量提高到平均峰值吞吐量 5% 或更低的应用程序( average-to-peak 比率),Elastic 吞吐量是最佳吞吐量模式。

由于具有 Elastic 吞吐量的文件系统的吞吐量性能会自动扩展,因此您无需指定或预置吞吐量容量来满足您的应用程序需求。您只需为读取或写入的元数据和数据量付费,在 Elastic 吞吐量模式下不会累积或消耗突发积分。

总而言之,Elastic 吞吐量最多可以驱动 3 个 GiBps GiBps 用于读取操作,1 个用于写入操作Amazon Web Services 区域。

注意

弹性吞吐量模式仅适用于配置了通用性能模式的文件系统。

预置吞吐

在预置吞吐量模式下,您可以指定文件系统可以驱动的吞吐量级别,不受文件系统大小或突发积分余额的影响。如果您知道工作负载的性能要求,或者您的应用程序将吞吐量提高到该 average-to-peak 比率的 5% 或以上,请使用预置吞吐量。

使用预置吞吐量,您需要为预置吞吐量付费。如果存储在文件系统的 EFS 标准存储中的数据的计量大小提供的基准吞吐量高于您预置的吞吐量,则您的文件系统将自动使用突增吞吐量模式。

在所有区域,预置吞吐量最多可 GiBps 为每个文件系统驱动 3 次读取操作和 1 GiBps 次写入操作。

对切换吞吐量模式和更改预配置数量的限制

您可以切换现有文件系统的吞吐量模式并更改吞吐量。但是,在将吞吐量模式切换到预置吞吐量或更改预置吞吐量后,以下操作将在 24 小时内受到限制:

  • 从预置吞吐量模式切换到突增或弹性吞吐量模式。

  • 减少预置吞吐量。

Amazon EFS 性能提示

在使用 Amazon EFS 时,请记住以下性能提示。

I/O 大小

Amazon EFS 的分布式特性可实现高水平的可用性、耐久性和可扩展性。这种分布式架构使得每次文件操作只产生很小的延迟开销。由于这种每项操作的延迟,总吞吐量通常会随着平均 I/O 大小的增加而增加,因为开销会摊销到更大的数据量上。

请求模型

如果您启用对文件系统的异步写入,待处理的写入操作在异步写入 Amazon EFS 之前,会在 Amazon EC2 实例上缓冲这些操作。异步写入通常具有较低的延迟。在执行异步写入时,内核使用额外内存进行缓存。

启用了同步写入的文件系统,或者使用绕过缓存的选项打开文件的文件系统(例如,O_DIRECT),向 Amazon EFS 发出同步请求。每项操作都要在客户端和 Amazon EFS 之间往返。

注意

您选择的请求模型需要权衡一致性(如果您使用多个 Amazon EC2 实例)和速度。使用同步写入可以在处理下一个请求之前完成每个写入请求事务,从而提高数据一致性。使用异步写入可通过缓冲待处理的写入操作来提高吞吐量。

NFS 客户端挂载设置

确认您使用的是中挂载 EFS 文件系统和中所述的推荐安装选项其它安装注意事项

在 Amazon EC2 实例上安装文件系统时,Amazon EFS 支持网络文件系统版本 4.0 和 4.1 (NFSv4) 协议。与 NFSv4.0(每秒 1,000 个文件以下)相比,NFSv4.1 为parallel 小文件读取操作(大于每秒 10,000 个文件)提供了更好的性能。对于运行 macOS Big Sur 的Amazon EC2 macOS 实例,仅支持 NFSv4.0。

不要使用以下挂载选项:

  • noacactimeo=0acregmax=0acdirmax=0— 这些选项禁用属性缓存,这会对性能产生非常大的影响。

  • lookupcache=poslookupcache=none— 这些选项禁用文件名查找缓存,这会对性能产生非常大的影响。

  • fsc— 此选项启用本地文件缓存,但不会更改 NFS 缓存一致性,也不会减少延迟。

注意

在装载文件系统时,考虑将 NFS 客户端的读写缓冲区大小增加到 1 MB。

优化小文件性能

您可以通过最大限度地减少文件重新打开、提高并行度以及尽可能捆绑参考文件来提高小文件性能。

  • 尽量减少往返服务器的次数。

    如果您稍后在工作流程中需要文件,请不要不必要地关闭文件。保持文件描述符处于打开状态可以直接访问缓存中的本地副本。文件打开、关闭和元数据操作通常无法异步或通过管道进行。

    读取或写入小文件时,额外的两次往返行程非常重要。

    每次往返(文件打开、文件关闭)所花费的时间可能与读取或写入兆字节的批量数据一样长。在计算作业开始时打开一次输入或输出文件,并在整个作业期间保持打开状态会更有效。

  • 使用并行性来减少往返时间的影响。

  • 将参考文件捆绑到.zip文件中。一些应用程序使用大量小型、主要是只读的参考文件。将它们捆绑在一个.zip文件中,可以让你通过一次开合往返读取多个文件。

    .zip格式允许随机访问单个文件。

优化目录性能

在同时修改的非常大的目录(超过 10 万个文件ls)上执行 listing () 时,Linux NFS 客户端可能会挂起,而不会返回响应。此问题已在内核 5.11 中修复,该内核已移植到亚马逊 Linux 2 内核 4.14、5.4 和 5.10。

如果可能,我们建议将文件系统上的目录数保持在 10,000 以下。尽可能多地使用嵌套的子目录。

列出目录时,如果不需要文件属性,请避免获取文件属性,因为它们不存储在目录本身中。

优化 NFS read_ahead_kb 的大小

NFSread_ahead_kb 属性定义 Linux 内核在顺序读取操作期间要预读或预取的千字节数。

对于 5.4.* 之前的 Linux 内核版本,该read_ahead_kb值是通过NFS_MAX_READAHEAD乘以rsize(在装载选项中设置的客户端配置的读取缓冲区大小)的值来设置的。使用推荐的装载选项时,此公式设置read_ahead_kb为 15 MB。

注意

从 Linux 内核版本 5.4.* 开始,Linux NFS 客户端使用 128 KB 的默认read_ahead_kb值。我们建议将此值增加到 15 MB。

在 1.33.2 及更高amazon-efs-utils版本中提供的 Amazon EFS 挂载帮助程序会在装载文件系统后自动将该read_ahead_kb值修改为等于 15 *rsize 或 15 MB。

对于 Linux 内核 5.4 或更高版本,如果您不使用挂载帮助程序挂载文件系统,请考虑手动设置为 15 MBread_ahead_kb 以提高性能。装载文件系统后,您可以使用以下命令重置该read_ahead_kb值。在使用此命令之前,请替换以下值:

  • read-ahead-value-kb替换为所需的大小(以千字节为单位)。

  • efs-mount-point替换为文件系统的挂载点。

device_number=$(stat -c '%d' efs-mount-point) ((major = ($device_number & 0xFFF00) >> 8)) ((minor = ($device_number & 0xFF) | (($device_number >> 12) & 0xFFF00))) sudo bash -c "echo read-ahead-value-kb > /sys/class/bdi/$major:$minor/read_ahead_kb"

以下示例将read_ahead_kb大小设置为 15 MB。

device_number=$(stat -c '%d' efs) ((major = ($device_number & 0xFFF00) >> 8)) ((minor = ($device_number & 0xFF) | (($device_number >> 12) & 0xFFF00))) sudo bash -c "echo 15000 > /sys/class/bdi/$major:$minor/read_ahead_kb"