我的 Amazon Elastic File System(Amazon EFS)的性能非常慢。我想确定原因并解决问题。
简短描述
Amazon EFS 的分布式多可用区架构导致每个文件操作的延迟开销很小。总体吞吐量通常会随着平均 I/O 大小增加而增加,因为开销会分摊到更大量数据上。
Amazon EFS 性能取决于多个因素,包括下列因素:
- EFS 的存储类。
- 性能和吞吐量模式。
- 在 EFS 上执行的操作类型(如元数据密集型等)。
- EFS 中存储的数据的属性(如文件的大小和数量)。
- 挂载选项。
- 客户端限制。
解决方法
EFS 的存储类
有关详细信息,请参阅 Performance summary。
性能和吞吐量模式
性能模式
Amazon EFS 提供了两种性能模式:通用和最大 I/O。应用程序可以弹性地纵向扩展其 IOPS,使其达到与性能模式相关的限制。
要确定使用哪种性能模式,请参阅 Performance modes。
吞吐量模式
基于文件的工作负载通常在短时间内推动高吞吐量,但在长时间内推动低吞吐量。Amazon EFS 设计为在一段时间内突增至高吞吐量水平。
配置的吞吐量和 IOPS 会影响 Amazon EFS 的性能。
最佳做法是对工作负载要求进行基准测试,从而帮助您选择适当的吞吐量和性能模式。在选择预配吞吐量时,请选择适合您的工作负载要求的值。要分析文件系统消耗的吞吐量和 IOPS,请参阅 Using metric math with Amazon EFS。
Amazon EFS 可通过三种吞吐量模式纵向扩展至千兆字节的存储量:突增、弹性和预配。如果使用突增吞吐量,则 Amazon EFS 上的吞吐量会随着文件系统增长而扩展。如果使用预配吞吐量,则可以立即预配文件系统的吞吐量,而与存储的数据量无关。借助弹性吞吐量,可以根据工作负载纵向扩展或缩减吞吐量。有关吞吐量模式的详细信息,请参阅 Amazon EFS 突增积分的工作原理是什么?
对 EC2 实例执行的操作类型
元数据 I/O 操作
EFS 性能在以下情况下会受到影响:
- 当文件大小很小时,因为它是一个分布式系统。分布式架构导致每个文件操作的延迟开销很小。由于这种每操作延迟,总吞吐量通常会随着平均 I/O 大小的增加而增加,因为开销会分摊到更多数据上。
- 如果工作负载或操作连续生成许多小文件,共享文件系统的性能就会受到影响。这会导致每个操作的开销增加。
- 如果应用程序执行元数据密集型操作,例如“ls”、“rm”、“mkdir”、“rmdir”、“lookup”、“getattr”或“setattr”等,则会发生元数据 I/O。任何需要系统获取特定块地址的操作都被视为元数据密集型工作负载。有关详细信息,请参阅以下内容:
计量: Amazon EFS 如何报告文件系统和对象大小以及性能提示。
挂载选项
- 如果使用 amazon-efs-utils 挂载文件系统,则默认情况下会应用推荐的挂载选项。
- 如果使用非默认挂载选项,则可能会降低性能。例如,如果使用较小的 rsize 和 wsize,或者降低或关闭属性缓存。检查 mount 命令的输出,以查看当前使用的挂载选项:
有关详细信息,请参阅 Mount the file system on the EC2 instance and test。
NFS 客户端版本
与 NFSv4.0(每秒少于 1,000 个文件)相比,网络文件系统(NFS)版本 4.1(NFSv4)协议为并行小文件读取操作提供了更好的性能(每秒超过 10,000 个文件)。
客户端限制
EC2 实例的瓶颈
如果使用文件系统的应用程序没有从 EFS 获得预期的性能,则优化该应用程序。此外,对应用程序所在的主机或服务进行基准测试,如 Amazon EC2、AWS Lambda 等。EC2 实例的资源紧缩可能会影响应用程序有效使用 EFS 的能力。
要检查 EC2 的配置是否不足以满足应用程序要求,请监控 Amazon EC2 CloudWatch 指标,如 CPU、Amazon Elastic Block Store(Amazon EBS)等。分析应用程序架构和资源要求的各种指标有助于确定是否应根据要求重新配置应用程序或实例。
使用 4.0+ Linux 内核版本
为了获得最佳性能并避免一些已知的 NFS 客户端问题,最好将 AMI 与 Linux 内核 4.0 或更新版本一起使用。
此规则的一个例外是 RHEL 和 CentOS 7.3 及更新版本。这些操作系统的内核收到了应用于 NFS v4.1 的修复和增强功能的向后移植版本。有关详细信息,请参阅 NFS support。
复制文件
使用 cp 命令复制文件时,可能会遇到速度缓慢的情况。这是因为复制命令是一个串行操作,这意味着它一次复制一个文件。如果每个文件的文件大小都很小,那么发送该文件的吞吐量也很小。
发送文件时,您可能还会注意到延迟。EFS 的分布式特性意味着它必须复制到所有挂载点,因此每个文件操作都有开销。因此,延迟是预期行为。
建议
最好是运行并行 I/O 操作(例如使用 rsync)。如果使用 rsync,请注意 cp 和 rsync 是在串行(单线程)操作中工作的,而不是并行操作。这会减慢复制过程。使用 fpart 或 NU Parallel 等工具。Fpart 是一个帮助您对文件树进行排序并将其打包到“分区”中的工具。Fpart 附带一个名为 fpsync 的 shell 脚本,该脚本包装了 fpart 和 rsync 以并行启动多个 rsync。Fpsync 提供了自己的嵌入式调度器。此方法可比更常见的串行方法更快地完成任务。
有关详细信息,请参阅 Amazon EFS performance。
相关信息
Quotas for NFS clients