本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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。
不要使用以下挂载选项:
noac
、actimeo=0
、acregmax=0
、acdirmax=0
— 这些选项禁用属性缓存,这会对性能产生很大的影响。lookupcache=pos
、lookupcache=none
— 这些选项禁用文件名查找缓存,这对性能有很大的影响。fsc
— 此选项启用本地文件缓存,但不会更改 NFS 缓存一致性,也不会减少延迟。
在挂载文件系统时,请考虑将 NFS 客户端的读取和写入缓冲区的大小提高到 1 MB。
优化小文件性能
您可以通过最大限度地减少文件重新打开次数、提高并行度以及在可能的情况下绑定参考文件来提高小文件性能。
尽量减少到服务器的往返次数。
如果您稍后在工作流程中需要文件,请不要不必要地关闭它们。保持文件描述符处于打开状态可以直接访问缓存中的本地副本。文件打开、关闭和元数据操作通常不能以异步方式或通过管道进行。
在读取或写入小文件时,额外的两次往返非常重要。
每次往返(文件打开、文件关闭)所花费的时间可能与读取或写入兆字节的批量数据一样长。在计算作业开始时打开一次输入或输出文件,然后在作业的整个长度内保持打开状态,效率更高。
使用并行性来减少往返时间的影响。
将参考文件捆绑在
.zip
文件。某些应用程序使用大量的小型参考文件,这些参考文件大多为只读。将这些捆绑在.zip
file 允许你一次开闭往返读取多个文件。这些区域有:
.zip
format 允许随机访问单个文件。
优化目录性能
在执行列表时(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
值通过使用以下命令。在使用此命令之前,请替换以下值:
Replace
以千字节为单位的所需大小。read-ahead-value-kb
Replace
使用文件系统的挂载点。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"