Amazon EFS 性能
以下章节概述了 Amazon EFS 性能,还介绍了文件系统配置如何影响关键性能维度。我们还提供了一些用于优化文件系统性能的重要提示和建议。
性能摘要
文件系统性能通常通过使用延迟、吞吐量和每秒进行读写操作的次数(IOPS)来衡量。Amazon EFS 在这些方面的性能取决于文件系统的配置。以下配置会影响 Amazon EFS 文件系统的性能:
文件系统类型 – 区域性或单区
性能模式 – 通用或最大 I/O
重要
与通用性能模式相比,最大 I/O 性能模式具有更高的每操作延迟。为了提高性能,我们建议始终使用通用性能模式。有关更多信息,请参阅 性能模式。
吞吐量模式 – 弹性、预配置或突增
下表概述了使用通用性能模式的文件系统的性能规格,以及不同文件系统类型和吞吐量模式的可能组合。
存储和吞吐量配置 | 延迟 | 最大 IOPS | 最大吞吐量 | |||||
---|---|---|---|---|---|---|---|---|
文件系统类型 |
吞吐量模式 |
读取操作 |
写入操作 |
读取操作 |
写入操作 |
按文件系统读取1 |
按文件系统写入1 |
按客户端读取/写入 |
区域性 |
Elastic |
低至 250 微秒(µs) |
As low as 2.7 milliseconds (ms) | 90,000–250,0002 | 50,000 |
每秒 10–60 千兆字节(GiBps) |
1–5 GiBps |
每秒 1500 兆字节(MiBps)3 |
区域性 |
Provisioned |
低至 250 微秒 |
As low as 2.7 ms | 55,000 | 25,000 |
3–10 GiBps |
1–3.33 GiBps |
500 MiBps |
区域性 |
Bursting |
低至 250 微秒 |
As low as 2.7 ms | 35,000 | 7,000 |
3–5 GiBps |
1–3 GiBps |
500 MiBps |
单区 |
Elastic, Provisioned, Bursting |
低至 250 微秒 |
低至 1.6 毫秒 |
35,000 | 7,000 |
3 GiBps 4 |
1 GiBps 4 |
500 MiBps |
注意
脚注:
最大读取和写入吞吐量取决于 Amazon Web Services 区域。如果吞吐量超过 Amazon Web Services 区域的最大吞吐量,则需要增加吞吐量配额。Amazon EFS 服务团队会根据具体情况考虑任何额外吞吐量请求。是否批准可能取决于工作负载类型。有关请求增加配额的更多信息,请参阅Amazon EFS 限额。
-
使用弹性吞吐量的文件系统对于不频繁访问的数据,最高可以驱动 90000 次读取 IOPS;而对于频繁访问的数据,则最高可以驱动 250000 次读取 IOPS。要实现最高 IOPS,还需适用其它建议。有关更多信息,请参阅 优化需要高吞吐量和 IOPS 的工作负载。
-
对于使用弹性吞吐量并使用版本 2.0 或更高版本的 Amazon EFS 客户端(amazon-efs-utils 版本)或 Amazon EFS CSI 驱动程序(aws-efs-csi-driver)挂载的文件系统,最高合并读取和写入吞吐量为 1500 MiBps。对于所有其它文件系统,吞吐量限制为 500 MiBps。有关 Amazon EFS 客户端的更多信息,请参阅安装 Amazon EFS 客户端。
-
使用突增吞吐量的单区文件系统可以驱动与使用突增吞吐量的区域性文件系统相同的每文件系统读取和写入吞吐量(读取最高为 5 GiBps,写入最高为 3 GiBps)。
存储类
Amazon EFS 存储类专为实现最有效的存储而设计,具体取决于用例。
-
EFS 标准存储类使用固态驱动器 (SSD) 存储为频繁访问的文件提供最低延迟级别。该存储类的读取第一个字节延迟低至 250 微秒,写入第一个字节延迟低至 2.7 毫秒。
EFS 不频繁访问(IA)和 EFS 归档存储类可存储访问频率较低的数据,这些数据不需要频繁访问的数据所需的延迟性能。这些存储类提供的第一个字节延迟为数十毫秒。
有关 EFS 存储类的更多信息,请参阅 EFS 存储类。
性能模式
Amazon EFS 提供两种性能模式:通用模式和最大 I/O 模式。
-
通用模式的每次操作延迟最低,是文件系统的默认性能模式。单区文件系统始终使用通用性能模式。为了提高性能,我们建议始终使用通用性能模式。
-
最大 I/O 模式是上一代性能类型,专为高度并行化的工作负载而设计,与通用模式相比,这些工作负载可以容忍更高的延迟。“单区”文件系统或使用弹性吞吐量的文件系统不支持最大 I/O 模式。
重要
由于最大 I/O 的每次操作延迟较高,因此我们建议对所有文件系统使用通用性能模式。
为了帮助确保工作负载保持在使用通用性能模式的文件系统的 IOPS 限制范围内,可以监控 PercentIOLimit
CloudWatch 指标。有关更多信息,请参阅 Amazon EFS 的 CloudWatch 指标。
应用程序可以弹性扩展其 IOPS,以达到与性能模式相关的限制。无需单独为 IOPS 付费;它们已包含在文件系统的吞吐量核算中。每个网络文件系统(NFS)请求都以 4 千字节(KB)吞吐量或其实际请求和响应大小计算,以较大者为准。
吞吐量模式
文件系统的吞吐量模式决定了文件系统可用的吞吐量。Amazon EFS 提供三种吞吐量模式:弹性、预配置和突增。读取吞吐量已打折,使您能够获得比写入吞吐量更高的读取吞吐量。每种吞吐量模式下可用的最大吞吐量取决于 Amazon Web Services 区域。有关不同区域中最大文件系统吞吐量的更多信息,请参阅Amazon EFS 限额。
文件系统可以实现 100% 的读写组合吞吐量。例如,如果文件系统使用其读取吞吐量限制的 33%,则该文件系统可以同时达到其写入吞吐量限制的 67%。可以在控制台的文件系统详细信息页面上的吞吐量利用率(%)图表中监控文件系统的吞吐量使用情况。有关更多信息,请参阅 监控吞吐量性能。
为文件系统选择正确的吞吐量模式
为文件系统选择正确的吞吐量模式取决于工作负载的性能要求。
弹性吞吐量(推荐)– 当工作负载激增或不可预测且性能要求难以预测时,或者当应用程序以 5% 或更低的平均峰值比驱动吞吐量时,请使用默认的弹性吞吐量。有关更多信息,请参阅 弹性吞吐量。
-
预置吞吐量 – 如果您知道工作负载的性能要求,或者当您的应用程序以 5% 或更高的平均峰值比驱动吞吐量时,请使用预置吞吐量。有关更多信息,请参阅 预配置吞吐量。
-
突增吞吐量 – 如果您希望吞吐量随文件系统中的存储量扩展,请使用突增吞吐量。
如果在使用突增吞吐量后,发现您的应用程序受到吞吐量限制(例如,使用的吞吐量超过允许吞吐量的 80%,或者已经使用了所有突增点数),则应使用弹性吞吐量或预置吞吐量。有关更多信息,请参阅 突增吞吐量。
可以使用 Amazon CloudWatch 通过将 MeteredIOBytes
指标与 PermittedThroughput
指标进行比较来确定工作负载的平均峰值比。有关 Amazon EFS 指标的更多信息,请参阅Amazon EFS 的 CloudWatch 指标。
弹性吞吐量
对于使用弹性吞吐量的文件系统,Amazon EFS 会自动扩缩吞吐量性能,以满足工作负载活动需求。对于性能要求难以预测的激增或不可预测的工作负载,或者对于以平均峰值吞吐量的 5% 或更低(平均峰值比)驱动吞吐量的应用程序,弹性吞吐量是最佳吞吐量模式。
由于具有弹性吞吐量的文件系统的吞吐量性能会自动扩缩,因此无需指定或预置吞吐能力来满足应用程序需求。只需为读取或写入的元数据和数据量付费,并且在使用弹性吞吐量时不会累积或消耗突增点数。
注意
弹性吞吐量仅适用于使用通用性能模式的文件系统。
有关每个区域的弹性吞吐量限制的信息,请参阅您可以提高的 Amazon EFS 配额。
预配置吞吐量
使用预置吞吐量时,可以指定文件系统可以驱动的吞吐量级别,不受文件系统大小或突增点数余量影响。如果您知道工作负载的性能要求,或者当您的应用程序以 5% 或更高的平均峰值比驱动吞吐量时,请使用预置吞吐量。
对于使用预置吞吐量的文件系统,会针对为文件系统启用的吞吐量向您收费。一个月内计费的吞吐量基于预配置的吞吐量,该吞吐量超过文件系统包含的标准存储的基准吞吐量,不超过 Amazon Web Services 区域中现行的突增基准吞吐量限制。
如果文件系统的基准吞吐量超过预置吞吐量,则会自动使用文件系统允许的突增吞吐量(不超过该 Amazon Web Services 区域中的现行突发基准吞吐量限制)。
有关每个区域的预置吞吐量限制的信息,请参阅您可以提高的 Amazon EFS 配额。
突增吞吐量
对于需要吞吐量随文件系统存储量扩展的工作负载,建议使用突增吞吐量。使用突增吞吐量时,基本吞吐量与标准存储类中文件系统的大小成正比,每 GiB 存储的速率为 50 KiBps。当文件系统消耗的吞吐量低于其基本吞吐量速率时,突增点数就会累积,当吞吐量超过基本速率时,会扣除突增点数。
有突增点数可用时,文件系统可以将吞吐量提高到每 TiB 存储 100 MiBps,不超过 Amazon Web Services 区域的限制,最低为 100 MiBps。如果没有可用的突增点数,文件系统可以驱动最高每 TiB 存储 50 MiBps,最低为 1 MiBps。
有关每个区域的突增吞吐量的信息,请参阅General resource quotas that cannot be changed。
了解 Amazon EFS 突增点数
使用突增吞吐量,每个文件系统随时间推移获得基准速率的突增点数,该基准速率由存储在 EFS 标准存储类中的文件系统大小决定。基准速率为每太字节 [TiB] 存储 50 MiBps(相当于每 GiB 存储 50 KiBps)。Amazon EFS 对读取操作的计量最多为写入操作速率的三分之一,允许文件系统将基准速率提高到每 GiB 读取吞吐量 150 KiBps,或每 GiB 写入吞吐量 50 KiBps。
文件系统可以其基准计量速率持续提高吞吐量。每当文件系统处于不活动状态或吞吐量低于其基准计量速率时,文件系统就会累积突增点数。累计的突增积分使文件系统可以推高吞吐量,使其高于其基准速率。
例如,在标准存储类中包含 100 GiB 计量数据的文件系统的基准吞吐量为 5 MiBps。在 24 小时不活动期间,文件系统将获得 43.2 万 MiB 点数(5 MiB × 8.64 万秒 = 43.2 万 MiB),这些点数可用于以 100 MiBps 的速率突发 72 分钟(43.2 万 MiB ÷ 100 MiBps = 72 分钟)。
如果大于 1 TiB 的文件系统在 50% 的时间内处于不活动状态,该文件系统在其余 50% 的时间内始终可以突增。
下表提供了突增行为的示例。
文件系统大小 | 突增吞吐量 | 基准吞吐量 |
---|---|---|
标准存储中有 100 GiB 计量数据 |
|
|
标准存储中有 1 TiB 计量数据 |
|
|
标准存储中有 10 TiB 计量数据 |
|
|
通常,较大的文件系统 |
|
|
注意
即使基准速率较低,Amazon EFS 也可为所有文件系统提供 1 MiBps 的计量吞吐量。
确定基准速率和突增速率时所使用的文件系统大小是通过 DescribeFileSystems API 操作可用的 ValueInStandard
计量大小。
小于 1 TiB 的文件系统可以获得的积分可达到最高 2.1 TiB 积分余额,对于大于 1 TiB 的文件系统,可达到每 TiB 存储 2.1 TiB 的积分余额。此行为意味着文件系统可以累积足够的点数来持续突增长达 12 小时。
对切换吞吐量和更改预置量的限制
可以切换现有文件系统的吞吐量模式并更改吞吐量。但是,在将吞吐量模式切换到预置吞吐量或更改预置吞吐量后,以下操作将在 24 小时内受到限制:
-
从预置吞吐量模式切换到弹性或突增吞吐量模式。
-
减少预置吞吐量。
Amazon EFS 性能提示
在使用 Amazon EFS 时,请记住以下性能提示。
平均 I/O 大小
Amazon EFS 的分布式特性实现了高水平的可用性、持久性和可扩展性。这种分布式架构使得每次文件操作只产生很小的延迟开销。由于这种每次操作的延迟,总吞吐量通常会随着平均 I/O 大小增加而增加,因为开销在更大量数据之间分摊。
优化需要高吞吐量和 IOPS 的工作负载
对于需要高吞吐量和 IOPS 的工作负载,请使用配置了通用性能模式和弹性吞吐量的区域性文件系统。
注意
要对频繁访问的数据实现最大 250000 次读取 IOPS,文件系统必须使用弹性吞吐量。
要实现最高级别的性能,必须通过按如下方式配置应用程序或工作负载来利用并行化。
在所有客户端和目录之间均匀分配工作负载,目录数至少与使用的客户端数量相同。
通过将各个线程与不同的数据集或文件对齐,最大限度地减少争用。
-
将工作负载分配到 10 个或更多的 NFS 客户端,单个装载目标中每个客户端至少有 64 个线程。
同时连接
可以同时在多达数千个 Amazon EC2 和其他 Amazon 计算实例上挂载 Amazon EFS 文件系统。如果可以跨更多实例并行执行应用程序,则可以在跨计算实例的聚合中提高文件系统的吞吐量级别。
请求模型
如果启用对文件系统的异步写入,则待处理的写入操作会在 Amazon EC2 实例上缓冲,然后再异步写入 Amazon EFS。异步写入通常具有较低的延迟。在执行异步写入时,内核使用额外内存进行缓存。
启用了同步写入的文件系统或使用绕开缓存选项(例如 O_DIRECT
)打开文件的文件系统将向 Amazon EFS 发出同步请求。每个操作都将在客户端和 Amazon EFS 之间往返一次。
注意
您选择的请求模型将在一致性(如果您使用多个 Amazon EC2 实例)和速率之间进行取舍。使用同步写入可以在处理下一个请求之前完成每个写入请求事务,从而提高数据一致性。使用异步写入可通过缓冲待处理的写入操作来提高吞吐量。
NFS 客户端挂载设置
确认您使用的是 挂载 EFS 文件系统 和 Linux 的挂载注意事项 中推荐的挂载选项。
在 Amazon EC2 实例上挂载文件系统时,Amazon EFS 支持网络文件系统版本 4.0 和 4.1(NFSv4)协议。与 NFSv4.0(每秒少于 1 千个文件)相比,NFSv4.1 为并行小文件读取操作提供了更高的性能(每秒大于 1 万个文件)。对于运行 macOS Big Sur 的 Amazon EC2 macOS 实例,仅支持 NFSv4.0。
请勿使用以下挂载选项:
noac
、actimeo=0
、acregmax=0
、acdirmax=0
– 这些选项会禁用属性缓存,这会对性能产生非常大的影响。lookupcache=pos
、lookupcache=none
– 这些选项会禁用文件名查找缓存,这会对性能产生非常大的影响。fsc
– 此选项启用本地文件缓存,但不会更改 NFS 缓存的一致性,也不会减少延迟。
注意
在挂载文件系统时,请考虑将 NFS 客户端的读写缓冲区大小增加到 1 MB。
优化小文件性能
可以通过最大限度地减少文件重新打开次数、增加并行度,以及尽可能捆绑参考文件来提高小文件的性能。
尽量减少往返服务器的次数。
如果以后在工作流中需要文件,请不要不必要地关闭这些文件。保持文件描述符处于打开状态可以直接访问缓存中的本地副本。文件打开、关闭和元数据操作通常不能以异步方式或通过管道进行。
读取或写入小文件时,两次额外往返非常重要。
每次往返(文件打开、文件关闭)所花费的时间可能与读取或写入兆字节批量数据一样多。在计算作业开始时打开一次输入或输出文件,并在整个作业期间保持打开状态会更有效。
使用并行度来减少往返时间的影响。
将参考文件捆绑到
.zip
文件中。有些应用程序使用大量较小的主要是只读文件的参考文件。将这些文件捆绑到一个.zip
文件中,只需一次打开-关闭往返操作即可读取多个文件。.zip
格式允许随机访问单个文件。
优化目录性能
在同时修改的超大目录(超过 10 万个文件)上执行列出操作(ls)时,Linux NFS 客户端可能会挂起而不返回响应。此问题已在内核 5.11 中修复,该内核已移植到 Amazon Linux 2 内核 4.14、5.4 和 5.10。
我们建议您在可能的情况下,将文件系统上的目录数保持在 1 万以内。尽可能多地使用嵌套子目录。
列出目录时,如果不需要文件属性,应避免获取这些属性,因为它们并未存储在目录本身中。
优化 NFS read_ahead_kb 的大小
NFS read_ahead_kb
属性定义了 Linux 内核在顺序读取操作期间要提前读取或预取的千字节数。
对于 5.4.* 之前的 Linux 内核版本,read_ahead_kb
值是通过 NFS_MAX_READAHEAD
乘以 rsize
(挂载选项中设置的客户端配置的读取缓冲区大小)的值来设置的。使用推荐的挂载选项时,此公式将 read_ahead_kb
设置为 15 MB。
注意
从 Linux 内核版本 5.4.* 开始,Linux NFS 客户端使用默认 read_ahead_kb
值 128 KB。我们建议将此值增加到 15 MB。
挂载文件系统后,amazon-efs-utils
版本 1.33.2 及更高版本中提供的 Amazon EFS 挂载帮助程序会自动将 read_ahead_kb
值修改为等于 15 * rsize
或 15 MB。
对于 Linux 内核 5.4 或更高版本,如果不使用挂载帮助程序来挂载文件系统,请考虑手动将 read_ahead_kb
设置为 15 MB 以提高性能。挂载文件系统后,可使用以下命令重置 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 "echoread-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"