本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
亚马逊EFS业绩
以下各节概述了 Amazon 的EFS性能,并描述了您的文件系统配置如何影响关键性能维度。我们还提供了一些用于优化文件系统性能的重要提示和建议。
性能摘要
文件系统性能通常使用延迟、吞吐量和每秒输入/输出操作数 () IOPS 等维度来衡量。Amazon 在这些方面的EFS表现取决于您的文件系统的配置。以下配置会影响 Amazon EFS 文件系统的性能:
文件系统类型 – 区域性或单区
性能模式 – 通用或最大 I/O
重要
与通用性能模式相比,最大 I/O 性能模式具有更高的每操作延迟。为了提高性能,我们建议始终使用通用性能模式。有关更多信息,请参阅 性能模式。
吞吐量模式 – 弹性、预配置或突增
下表概述了使用通用性能模式的文件系统的性能规格,以及文件系统类型和吞吐量模式的可能不同组合。
存储和吞吐量配置 | 延迟 | 最大值 IOPS | 最大吞吐量 | |||||
---|---|---|---|---|---|---|---|---|
文件系统类型 |
吞吐量模式 |
读取操作 |
写入操作 |
读取操作 |
写入操作 |
P er-file-system read 1 |
P er-file-system 写入 1 |
按客户端读取/写入 |
区域性 |
弹性 |
低至 250 微秒(µs) |
低至 2.7 毫秒 (ms) | 90,000—250,000 2 | 50000 |
每秒 10—60 千兆字节 () GiBps |
1—5 GiBps |
每秒 1,500 兆字节 (3) MiBps |
区域性 |
已预置 |
低至 250 微秒 |
低至 2.7 毫秒 | 55,000 | 25000 |
3—10 GiBps |
1—3.33 GiBps |
500 MiBps |
区域性 |
突增 |
低至 250 微秒 |
低至 2.7 毫秒 | 35000 | 7,000 |
3—5 GiBps |
1—3 GiBps |
500 MiBps |
单区 |
弹性、预配置、爆发 |
低至 250 微秒 |
低至 1.6 毫秒 |
35000 | 7,000 |
3 GiBps 4 |
1 GiBps 4 |
500 MiBps |
注意
脚注:
最大读取和写入吞吐量取决于 AWS 区域。如果吞吐量超过 AWS 区域的最大吞吐量,则需要增加吞吐量配额。任何增加吞吐量的请求都将由 Amazon EFS 服务团队 case-by-case进行考虑。是否批准可能取决于工作负载类型。有关请求增加配额的更多信息,请参阅亚马逊EFS配额。
-
IOPS对于不经常访问的数据,使用 Elastic 吞吐量的文件系统最多可以读取 90,000 次,频繁访问的数据最多可读取 250,000 次。IOPS要达到最大吞吐量,还需要其他建议。IOPS有关更多信息,请参阅 优化需要高吞吐量的工作负载以及 IOPS。
-
MiBps 对于使用弹性吞吐量且使用版本 2.0 或更高版本的 Amazon EFS 客户端(amazon-efs-utils 版本)或 Amazon D EFS CSI river () 装载的文件系统,最大合并读写吞吐量为 1,500。aws-efs-csi-driver对于所有其他文件系统,吞吐量限制为 500 MiBps。有关 Amazon EFS 客户端的更多信息,请参阅 安装亚马逊EFS客户端
-
使用突增吞吐量的单区域文件系统可以驱动与使用突发吞吐量的区域文件系统相同的 per-file-system读取和写入吞吐量(读取的最大读取量为 5,写入的最大读 GiBps 取量为 3 GiBps )。
存储类
根据用例,Amazon EFS 存储类别专为实现最有效的存储而设计。
-
EFS标准存储类使用固态硬盘 (SSD) 存储,为经常访问的文件提供最低的延迟。该存储类提供的读取首字节延迟低至 250 微秒,写入延迟低至 2.7 毫秒。
EFS低频访问 (IA) 和EFS存档存储类存储不经常访问的数据,这些数据不需要频繁访问的数据所需的延迟性能。这些存储类提供的第一个字节延迟为数十毫秒。
有关EFS存储类的更多信息,请参阅EFS 存储类。
性能模式
Amazon EFS 提供两种性能模式,通用模式和最大 I/O 模式。
-
通用模式的每次操作延迟最低,是文件系统的默认性能模式。One Zone 文件系统始终使用通用性能模式。为了提高性能,我们建议始终使用通用性能模式。
-
最大 I/O 模式是上一代性能类型,专为高度并行化的工作负载而设计,与通用模式相比,这些工作负载可以容忍更高的延迟。“单区”文件系统或使用弹性吞吐量的文件系统不支持最大 I/O 模式。
重要
由于最大 I/O 的每次操作延迟较高,因此我们建议对所有文件系统使用通用性能模式。
为了帮助确保您的工作负载保持在使用通用性能模式的文件系统的可用IOPS限制范围内,您可以监控该PercentIOLimit
CloudWatch 指标。有关更多信息,请参阅 CloudWatch Amazon 的指标 EFS。
应用程序可以将其IOPS弹性扩展到与性能模式相关的极限。您无需单独付费IOPS;它们包含在文件系统的吞吐量核算中。每个网络文件系统 (NFS) 请求都以 4 千字节 (KB) 的吞吐量或其实际请求和响应大小计算,以较大者为准。
吞吐量模式
文件系统的吞吐量模式决定了文件系统可用的吞吐量。Amazon EFS 提供三种吞吐量模式:弹性、预配置和突增。读取吞吐量已打折,使您能够获得比写入吞吐量更高的读取吞吐量。每种吞吐量模式下可用的最大吞吐量取决于 AWS 区域。有关不同区域中最大文件系统吞吐量的更多信息,请参阅亚马逊EFS配额。
文件系统可以实现 100% 的读写组合吞吐量。例如,如果文件系统使用其读取吞吐量限制的 33%,则该文件系统可以同时达到其写入吞吐量限制的 67%。可以在控制台的文件系统详细信息页面上的吞吐量利用率(%)图表中监控文件系统的吞吐量使用情况。有关更多信息,请参阅 监控吞吐量性能。
为文件系统选择正确的吞吐量模式
为文件系统选择正确的吞吐量模式取决于工作负载的性能要求。
弹性吞吐量(推荐)— 当您的工作负载激增或不可预测且性能要求难以预测时,或者您的应用程序以 5% 或更低的 average-to-peak比率驱动吞吐量时,请使用默认的弹性吞吐量。有关更多信息,请参阅 弹性吞吐量。
-
预配置吞吐量-如果您知道工作负载的性能要求,或者当您的应用程序以 5% 或更高的 average-to-peak比例提高吞吐量时,请使用预配置吞吐量。有关更多信息,请参阅 预配置吞吐量。
-
突增吞吐量-如果您希望吞吐量随文件系统中的存储量而扩展,请使用突增吞吐量。
如果在使用突增吞吐量后,发现您的应用程序受到吞吐量限制(例如,它使用的吞吐量超过允许吞吐量的 80%,或者您已经用完了所有突增额度),则应使用 Elastic 吞吐量或预配置吞吐量。有关更多信息,请参阅 突增吞吐量。
您可以使用 Amazon CloudWatch 通过将指标与MeteredIOBytes
指标进行比较来确定工作负载的 average-to-peakPermittedThroughput
比率。有关 Amazon EFS 指标的更多信息,请参阅CloudWatch Amazon 的指标 EFS。
弹性吞吐量
对于使用弹性吞吐量的文件系统,Amazon EFS 会自动向上或向下扩展吞吐量性能,以满足您的工作负载活动的需求。对于性能要求难以预测的尖峰或不可预测的工作负载,或者对于吞吐量以平均峰值吞吐量的 5% 或更低( average-to-peak比率)的应用程序,弹性吞吐量是最佳吞吐量模式。
由于具有 Elastic 吞吐量的文件系统的吞吐量性能会自动扩展,因此您无需指定或预置吞吐量容量即可满足您的应用程序需求。您只需为读取或写入的元数据和数据量付费,并且在使用 Elastic 吞吐量时不会累积或消耗突增积分。
注意
弹性吞吐量仅适用于使用通用性能模式的文件系统。
有关每个区域弹性吞吐量限制的信息,请参阅您可以增加的亚马逊EFS配额。
预配置吞吐量
使用预配置吞吐量,您可以指定文件系统可以驱动的吞吐量级别,不受文件系统大小或突发信用余额的影响。如果您知道工作负载的性能要求,或者您的应用程序将吞吐量提高到该 average-to-peak比率的 5% 或更多,请使用预配置吞吐量。
对于使用预配置吞吐量的文件系统,您需要为文件系统启用的吞吐量付费。一个月内计费的吞吐量基于预配置的吞吐量,该吞吐量超过文件系统包含的标准存储的基准吞吐量,不超过 AWS 区域中现行的突增基准吞吐量限制。
如果文件系统的基准吞吐量超过预配置的吞吐量,则它会自动使用文件系统允许的突增吞吐量(不超过其中的现行\ Bursting 基准吞吐量限制)。 AWS 区域
有关每RegionProvisioned 吞吐量限制的信息,请参阅您可以增加的亚马逊EFS配额。
突增吞吐量
对于需要随文件系统存储量而扩展的吞吐量的工作负载,建议使用突增吞吐量。使用突增吞吐量时,基本吞吐量与标准存储类中的文件系统大小成正比,每 GiB 存储空间的速率为 KiBps 每 GiB 存储 50。当文件系统消耗的吞吐量低于其基本吞吐量速率时,突增点数就会累积,当吞吐量超过基本速率时,会扣除突增点数。
当突发积分可用时,文件系统最多可以将吞吐量提高到 MiBps每 TiB 存储 100,不 AWS 区域 超过限制,最小为 100。 MiBps如果没有可用的突发积分,则文件系统最多可以驱动 MiBps 每 TiB 存储 50 个,最少为 1。 MiBps
有关按区域突增吞吐量的信息,请参阅。General resource quotas that cannot be changed
了解 Amazon EFS 突发积分
使用突增吞吐量时,每个文件系统会随着时间的推移获得突发积分,其基准速率由存储在EFS标准存储类中的文件系统的大小决定。基准速率为 MiBps 每 TiB [TiB] 存储 50 个(相当于每 KiBps GiB 存储 50 个)。Amazon 可将读取操作EFS计量到写入操作速率的三分之一,从而允许文件系统将基准速率提高到 KiBps 每 GiB 读取吞吐量 150,或每 KiBps GiB 写入吞吐量 50。
文件系统可以其基准计量速率持续提高吞吐量。每当文件系统处于不活动状态或吞吐量低于其基准计量速率时,文件系统就会累积突增点数。累计的突增积分使文件系统可以推高吞吐量,使其高于其基准速率。
例如,标准存储类中具有 100 GiB 计量数据的文件系统的基准吞吐量为 5。 MiBps在 24 小时的非活动状态下,文件系统将获得价值 43.2 万MiB(5 MiB × 86,400 秒 = 432,000 Mi B)的积分,这些积分可用于以 100 的速度突发持续 72 分钟(432,000 MiB ε 100 MiBps = 72 分钟)。 MiBps
如果大于 1 TiB 的文件系统在 50% 的时间内处于不活动状态,该文件系统在其余 50% 的时间内始终可以突增。
下表提供了突增行为的示例。
文件系统大小 | 突增吞吐量 | 基准吞吐量 |
---|---|---|
标准存储中有 100 GiB 计量数据 |
|
|
标准存储中有 1 TiB 计量数据 |
|
|
标准存储中有 10 TiB 计量数据 |
|
|
通常,较大的文件系统 |
|
|
注意
Amazon EFS 为所有文件系统提供的计量吞吐量为 1 MiBps ,即使基准速率较低。
用于确定基准速率和突发速率的文件系统大小是DescribeFileSystemsAPI操作中可用的ValueInStandard
计量大小。
小于 1 TiB 的文件系统可以获得的积分可达到最高 2.1 TiB 积分余额,对于大于 1 TiB 的文件系统,可达到每 TiB 存储 2.1 TiB 的积分余额。此行为意味着文件系统可以累积足够的点数来持续突增长达 12 小时。
对切换吞吐量和更改预配置量的限制
可以切换现有文件系统的吞吐量模式并更改吞吐量。但是,在将吞吐量模式切换到预配置吞吐量或更改预配置吞吐量后,以下操作将在 24 小时内受到限制:
-
从预配置吞吐量模式切换到弹性吞吐量模式或突增吞吐量模式。
-
减少预配置吞吐量。
亚马逊EFS绩效提示
使用 Amazon 时EFS,请记住以下性能提示。
平均 I/O 大小
Amazon 的分布式特性EFS可实现高水平的可用性、耐久性和可扩展性。这种分布式架构使得每次文件操作只产生很小的延迟开销。由于这种每次操作的延迟,总吞吐量通常会随着平均 I/O 大小增加而增加,因为开销在更大量数据之间分摊。
优化需要高吞吐量的工作负载以及 IOPS
对于需要高吞吐量的工作负载IOPS,请使用配置了通用性能模式和弹性吞吐量的区域文件系统。
注意
要实现对经常访问的数据的最大读IOPS取量 250,000,文件系统必须使用 Elastic 吞吐量。
要实现最高级别的性能,必须通过按如下方式配置应用程序或工作负载来利用并行化。
在所有客户端和目录之间均匀分配工作负载,目录数至少与使用的客户端数量相同。
通过将各个线程与不同的数据集或文件对齐,最大限度地减少争用。
-
将工作负载分布在 10 个或更多NFS客户机上,单个装载目标中每个客户机至少有 64 个线程。
同时连接
您最多可以同时在数千个 Amazon EC2 和其他 AWS 计算实例上挂载 Amazon EFS 文件系统。如果可以跨更多实例并行执行应用程序,则可以在跨计算实例的聚合中提高文件系统的吞吐量级别。
请求模型
如果您启用对文件系统的异步写入,则待处理的写入操作会在EFS异步写入到 Amazon 之前在 Amazon EC2 实例上进行缓冲。异步写入通常具有较低的延迟。在执行异步写入时,内核使用额外内存进行缓存。
启用同步写入功能的文件系统或使用绕过缓存的选项打开文件的文件系统(例如O_DIRECT
),会向 Amazon EFS 发出同步请求。每项操作都要在客户和 Amazon 之间往返EFS。
注意
您选择的请求模式需要权衡一致性(如果您使用多个 Amazon EC2 实例)和速度。使用同步写入可以在处理下一个请求之前完成每个写入请求事务,从而提高数据一致性。使用异步写入可通过缓冲待处理的写入操作来提高吞吐量。
NFS客户机装载设置
确认您使用的是 挂载EFS文件系统 和 Linux 的安装注意事项 中推荐的挂载选项。
在亚马逊EC2实例上安装文件系统时,亚马逊EFS支持网络文件系统版本 4.0 和 4.1 (NFSv4) 协议。NFSv4与 .0(每秒少于 1,000 个文件)相比,NFSv4.1 为并行小文件读取操作(每秒大于 10,000 个文件)提供了更好的性能。对于运行 EC2 macOS Big Sur 的亚马逊 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 万以内。尽可能多地使用嵌套子目录。
列出目录时,如果不需要文件属性,应避免获取这些属性,因为它们并未存储在目录本身中。
优化 read_ahe NFS ad_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 客户端使用默认read_ahead_kb
值 128 KB。我们建议将此值增加到 15 MB。
EFS安装文件系统后,1.33.2 及更高amazon-efs-utils
版本中提供的 Amazon 挂载帮助程序会自动将该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"