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

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

Amazon EFS 性能提示

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

平均 I/O 大小

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

请求模型

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

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

注意

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

NFS 客户端挂载设置

确认您使用的是和中推荐的挂载选项挂载 EFS 文件系统然后在其他安装注意事项.

在 Amazon EC2 实例上挂载文件系统时,Amazon EFS 支持网络文件系统版本 4.0 和 4.1 (NFSv4) 协议。与 NFSv4.0(每秒少于 1000 个文件)相比,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文件。某些应用程序使用大量的小型参考文件,这些参考文件大多为只读。将这些捆绑在.zipfile 允许你一次开闭往返读取多个文件。

    这些区域有:.zipformat 允许随机访问单个文件。

优化目录性能

在执行列表时(ls)在同时修改的非常大的目录(超过 10 万个文件)上,Linux NFS 客户端可能会挂起,而不会返回响应。此问题已在内核 5.11 中得到修复,该内核已移植到 Amazon 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 客户端使用默认的read_ahead_kb值为 128 KB。我们建议将此值增加到 15 MB。

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

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

  • Replaceread-ahead-value-kb以千字节为单位的所需大小。

  • Replaceefs-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"