使用 ENA Express 提高 EC2 实例之间的网络性能 - Amazon Elastic Compute Cloud

使用 ENA Express 提高 EC2 实例之间的网络性能

ENA Express 由 AWS 可扩展的可靠数据报(SRD)技术提供支持。SRD 是一种高性能网络传输协议,使用动态路由来提高吞吐量并最大限度地减少尾部延迟。使用 ENA Express,您可在同一可用区中的两个 EC2 实例之间通信。

ENA Express 的优势
  • 将可用区内的单个流可以使用的最大带宽从 5 Gbps 增大到 25 Gbps,最大不超过实例的总计限制。

  • 减少 EC2 实例之间网络流量的尾部延迟,尤其是在网络高负载期间。

  • 检测并避开拥塞的网络路径。

  • 直接在网络层处理某些任务,比如接收端的数据包重新排序以及所需的大部分重传。这样可以腾出应用层用于其他工作。

注意
  • 如果您的应用程序每秒发送或接收大量数据包,并且大部分时间都需要优化延迟,尤其是在网络不拥塞的时段,那么 增强联网 可能更适合您的网络。

  • 无法跨本地区中的子网发送 ENA Express 流量。

为实例上的网络接口附件启用 ENA Express 后,发送实例会启动与接收实例的通信,SRD 会检测 ENA Express 是否同时在发送实例和接收实例上运行。如果 ENA Express 正在运行,则通信可以使用 SRD 传输。如果 ENA Express 未在运行,则通信将退回到标准 ENA 传输。

在网络流量较少的时段内,当数据包使用 ENA Express 时,您可能会注意到数据包延迟略有增加(数十微秒)。在此期间,优先考虑特定网络性能特征的应用程序可以从 ENA Express 中受益,如下所示:

  • 同一个可用区内的最大单个流带宽从 5Gbps 提升到 25Gbps,最大不超过实例的总计限制,进程可以从中受益。例如,如果一种特定的实例类型支持最大 12.5Gbps 的贷款,单个流的带宽上限也将是 12.5Gbps。

  • 在网络拥塞时段,运行时间较长的进程会减少尾部延迟。

  • 网络响应时间分配更流畅、更标准时,进程可以从中受益。

ENA Express 的工作原理

ENA Express 由 AWS 可扩展的可靠数据报(SRD)技术提供支持。该技术通过不同的 AWS 网络路径为每个网络流分配数据包,并在检测到拥塞迹象时动态调整分配。它还能管理接收端的数据包重新排序。

为确保 ENA Express 能够按预期方式管理网络流量,实例的发送和接收以及实例之间的通信必须满足以下所有要求:

  • 同时支持发送和接收实例类型。有关更多信息,请参阅 ENA Express 支持的实例类型 表。

  • 发送和接收实例都必须配置 ENA Express。如配置存在差异,则可能会遇到流量默认为标准 ENA 传输的情况。以下方案显示了可能发生的情况。

    方案:配置差异

    实例 已启用 ENA Express UDP 使用 ENA Express
    实例 1
    实例 2

    在这种情况下,两个实例之间的 TCP 流量可以使用 ENA Express,因为两个实例均已启用该功能。但是,由于其中一个实例不将 ENA Express 用于 UDP 流量,因此这两个实例之间通过 UDP 进行的通信则使用标准 ENA 传输。

  • 发送和接收实例必须在同一可用区中运行。

  • 实例之间的网络路径不得包含中间件。ENA Express 目前不支持中间件。

  • (仅限 Linux 实例)要充分利用带宽潜力,请使用驱动程序版本 2.2.9 或更高版本。

  • (仅限 Linux 实例)要生成指标,请使用驱动程序版本 2.8 或更高版本。

如果未满足任何要求,实例将使用标准 TCP/UDP 协议,但不使用 SRD 进行通信。

为确保您的实例网络驱动程序配置为最佳性能,请查看 ENA 驱动程序的最佳实践推荐。这些最佳实践同样适用于 ENA Express。有关更多信息,请参阅 GitHub 网站上的 ENA Linux Driver Best Practices and Performance Optimization Guide(ENA Linux 驱动程序最佳实践和性能优化指南)。

注意

Amazon EC2 是指实例与作为附件附加到该实例的网络接口之间的关系。ENA Express 设置适用于该附件。如果网络接口从实例中分离,则该附件将不再存在,应用于它的 ENA Express 设置将不再生效。终止实例时也是如此,即使网络接口仍然存在。

在为发送和接收实例上的网络接口附件启用 ENA Express 后,您可以使用 ENA Express 指标来帮助确保实例充分利用 SRD 技术所提供的性能改进。有关 ENA Express 指标的更多信息,请参阅 ENA Express 指标

ENA Express 支持的实例类型

以下选项卡显示了支持 ENA Express 的实例类型。

General purpose
实例类型 架构
m6a.12xlarge x86_64
m6a.16xlarge x86_64
m6a.24xlarge x86_64
m6a.32xlarge x86_64
m6a.48xlarge x86_64
m6a.metal x86_64
m6i.8xlarge x86_64
m6i.12xlarge x86_64
m6i.16xlarge x86_64
m6i.24xlarge x86_64
m6i.32xlarge x86_64
m6i.metal x86_64
m6id.8xlarge x86_64
m6id.12xlarge x86_64
m6id.16xlarge x86_64
m6id.24xlarge x86_64
m6id.32xlarge x86_64
m6id.metal x86_64
m7a.12xlarge x86_64
m7a.16xlarge x86_64
m7a.24xlarge x86_64
m7a.32xlarge x86_64
m7a.48xlarge x86_64
m7a.metal-48xl x86_64
m7g.12xlarge arm64
m7g.16xlarge arm64
m7g.metal arm64
m7gd.12xlarge arm64
m7gd.16xlarge arm64
m7gd.metal arm64
m7i.12xlarge x86_64
m7i.16xlarge x86_64
m7i.24xlarge x86_64
m7i.48xlarge x86_64
m7i.metal-24xl x86_64
m7i.metal-48xl x86_64
m8g.12xlarge arm64
m8g.16xlarge arm64
m8g.24xlarge arm64
m8g.48xlarge arm64
m8g.metal-24xl arm64
m8g.metal-48xl arm64
Compute optimized
实例类型 架构
c6a.12xlarge x86_64
c6a.16xlarge x86_64
c6a.24xlarge x86_64
c6a.32xlarge x86_64
c6a.48xlarge x86_64
c6a.metal x86_64
c6gn.16xlarge arm64
c6i.8xlarge x86_64
c6i.12xlarge x86_64
c6i.16xlarge x86_64
c6i.24xlarge x86_64
c6i.32xlarge x86_64
c6i.metal x86_64
c6id.8xlarge x86_64
c6id.12xlarge x86_64
c6id.16xlarge x86_64
c6id.24xlarge x86_64
c6id.32xlarge x86_64
c6id.metal x86_64
c7a.12xlarge x86_64
c7a.16xlarge x86_64
c7a.24xlarge x86_64
c7a.32xlarge x86_64
c7a.48xlarge x86_64
c7a.metal-48xl x86_64
c7g.12xlarge arm64
c7g.16xlarge arm64
c7g.metal arm64
c7gd.12xlarge arm64
c7gd.16xlarge arm64
c7gd.metal arm64
c7i.12xlarge x86_64
c7i.16xlarge x86_64
c7i.24xlarge x86_64
c7i.48xlarge x86_64
c7i.metal-24xl x86_64
c7i.metal-48xl x86_64
c8g.12xlarge arm64
c8g.16xlarge arm64
c8g.24xlarge arm64
c8g.48xlarge arm64
c8g.metal-24xl arm64
c8g.metal-48xl arm64
Memory optimized
实例类型 架构
r6a.12xlarge x86_64
r6a.16xlarge x86_64
r6a.24xlarge x86_64
r6a.32xlarge x86_64
r6a.48xlarge x86_64
r6a.metal x86_64
r6i.8xlarge x86_64
r6i.12xlarge x86_64
r6i.16xlarge x86_64
r6i.24xlarge x86_64
r6i.32xlarge x86_64
r6i.metal x86_64
r6id.8xlarge x86_64
r6id.12xlarge x86_64
r6id.16xlarge x86_64
r6id.24xlarge x86_64
r6id.32xlarge x86_64
r6id.metal x86_64
r7a.12xlarge x86_64
r7a.16xlarge x86_64
r7a.24xlarge x86_64
r7a.32xlarge x86_64
r7a.48xlarge x86_64
r7a.metal-48xl x86_64
r7g.12xlarge arm64
r7g.16xlarge arm64
r7g.metal arm64
r7gd.12xlarge arm64
r7gd.16xlarge arm64
r7gd.metal arm64
r7i.12xlarge x86_64
r7i.16xlarge x86_64
r7i.24xlarge x86_64
r7i.48xlarge x86_64
r7i.metal-24xl x86_64
r7i.metal-48xl x86_64
r8g.12xlarge arm64
r8g.16xlarge arm64
r8g.24xlarge arm64
r8g.48xlarge arm64
r8g.metal-24xl arm64
r8g.metal-48xl arm64
u7i-12tb.224xlarge x86_64
u7in-16tb.224xlarge x86_64
u7in-24tb.224xlarge x86_64
u7in-32tb.224xlarge x86_64
x2idn.16xlarge x86_64
x2idn.24xlarge x86_64
x2idn.32xlarge x86_64
x2idn.metal x86_64
x2iedn.8xlarge x86_64
x2iedn.16xlarge x86_64
x2iedn.24xlarge x86_64
x2iedn.32xlarge x86_64
x2iedn.metal x86_64
x8g.12xlarge arm64
x8g.16xlarge arm64
x8g.24xlarge arm64
x8g.48xlarge arm64
x8g.metal-24xl arm64
x8g.metal-48xl arm64
Accelerated computing
实例类型 架构
g6.48xlarge x86_64
g6e.12xlarge x86_64
g6e.24xlarge x86_64
g6e.48xlarge x86_64
Storage optimized
实例类型 架构
i4g.4xlarge arm64
i4g.8xlarge arm64
i4g.16xlarge arm64
i4i.8xlarge x86_64
i4i.12xlarge x86_64
i4i.16xlarge x86_64
i4i.24xlarge x86_64
i4i.32xlarge x86_64
i4i.metal x86_64
im4gn.4xlarge arm64
im4gn.8xlarge arm64
im4gn.16xlarge arm64

适用于 Linux 实例的先决条件

为确保 ENA Express 能够有效运行,请按如下所示更新 Linux 实例设置。

  • 如果您的实例使用巨型帧,请运行以下命令,以将最大传输单元(MTU)设置为 8900

    [ec2-user ~]$ sudo ip link set dev eth0 mtu 8900
  • 增加接收器(Rx)环的大小,如下所示:

    [ec2-user ~]$ ethtool -G device rx 8192
  • 要最大化 ENA Express 带宽,请按如下方式配置您的 TCP 队列限制:

    1. 将 TCP 小队列限制设置为 1MB 或更大值。这会增加在套接字上排队等待传输的数据量:

      sudo sh -c 'echo 1048576 > /proc/sys/net/ipv4/tcp_limit_output_bytes'
    2. 如果您的 Linux 发行版启用了字节队列限制,请禁用 eth 设备上的字节队列限制。这也会增加设备队列排队等待传输的数据。

      sudo sh -c 'for txq in /sys/class/net/eth0/queues/tx-*; do echo max > ${txq}/byte_queue_limits/limit_min; done'
      注意

      默认情况下,Amazon Linux 发行版的 ENA 驱动程序会禁用字节队列限制。

调整 Linux 实例上 ENA Express 设置的性能

要检查您的 Linux 实例配置以获得最佳 ENA Express 性能,您可以运行以下脚本(可在 Amazon GitHub 存储库中获取):

https://github.com/amzn/amzn-ec2-ena-utilities/blob/main/ena-express/check-ena-express-settings.sh

该脚本会运行一系列测试,并提供建议配置更改和必需配置更改的建议。