

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

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

**ENA Express 的优势**
+ 将可用区内的单个流可以使用的最大带宽从 5 Gbps 增大到 25 Gbps，最大不超过实例的总计限制。
+ 减少 EC2 实例之间网络流量的尾部延迟，尤其是在网络高负载期间。
+ 检测并避开拥塞的网络路径。
+ 直接在网络层处理某些任务，比如接收端的数据包重新排序以及所需的大部分重传。这样可以腾出应用层用于其他工作。

**注意**  
如果您的应用程序每秒发送或接收大量数据包，并且大部分时间都需要优化延迟，尤其是在网络不拥塞的时段，那么 [增强联网](enhanced-networking.md) 可能更适合您的网络。
ENA Express 流量无法在本地区域中发送。

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

在网络流量较少的时段内，当数据包使用 ENA Express 时，您可能会注意到数据包延迟略有增加（数十微秒）。在此期间，优先考虑特定网络性能特征的应用程序可以从 ENA Express 中受益，如下所示：
+ 同一个可用区内的最大单个流带宽从 5Gbps 提升到 25Gbps，最大不超过实例的总计限制，进程可以从中受益。例如，如果一种特定的实例类型支持最大 12.5Gbps 的贷款，单个流的带宽上限也将是 12.5Gbps。
+ 在网络拥塞时段，运行时间较长的进程会减少尾部延迟。
+ 网络响应时间分配更流畅、更标准时，进程可以从中受益。

**Topics**
+ [

## ENA Express 的工作原理
](#ena-express-how-it-works)
+ [

## ENA Express 支持的实例类型
](#ena-express-supported-instance-types)
+ [

## 适用于 Linux 实例的先决条件
](#ena-express-prereq-linux)
+ [

## 调整 Linux 实例上 ENA Express 设置的性能
](#ena-express-tune)
+ [

# 查看 EC2 实例的 ENA Express 设置
](ena-express-list-view.md)
+ [

# 为 EC2 实例配置 ENA Express 设置
](ena-express-configure.md)

## ENA Express 的工作原理


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

为确保 ENA Express 能够按预期方式管理网络流量，实例的发送和接收以及实例之间的通信必须满足以下所有要求：
+ 同时支持发送和接收实例类型。有关更多信息，请参阅 [ENA Express 支持的实例类型](#ena-express-supported-instance-types) 表。
+ 发送和接收实例都必须配置 ENA Express。如配置存在差异，则可能会遇到流量默认为标准 ENA 传输的情况。以下方案显示了可能发生的情况。

  **方案：配置差异**    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AWSEC2/latest/UserGuide/ena-express.html)

  在这种情况下，两个实例之间的 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](https://github.com/amzn/amzn-drivers/blob/master/kernel/linux/ena/ENA_Linux_Best_Practices.rst)（ENA Linux 驱动程序最佳实践和性能优化指南）。

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

在为发送和接收实例上的网络接口附件启用 ENA Express 后，您可以使用 ENA Express 指标来帮助确保实例充分利用 SRD 技术所提供的性能改进。有关 ENA Express 指标的更多信息，请参阅 [ENA Express 指标](monitoring-network-performance-ena.md#network-performance-metrics-ena-express)。

## ENA Express 支持的实例类型


以下实例类型支持 ENA Express。

------
#### [ General purpose ]


| 实例类型 | 架构 | 
| --- | --- | 
| m6a.12xlarge | x86\$164 | 
| m6a.16xlarge | x86\$164 | 
| m6a.24xlarge | x86\$164 | 
| m6a.32xlarge | x86\$164 | 
| m6a.48xlarge | x86\$164 | 
| m6a.metal | x86\$164 | 
| m6i.8xlarge | x86\$164 | 
| m6i.12xlarge | x86\$164 | 
| m6i.16xlarge | x86\$164 | 
| m6i.24xlarge | x86\$164 | 
| m6i.32xlarge | x86\$164 | 
| m6i.metal | x86\$164 | 
| m6id.8xlarge | x86\$164 | 
| m6id.12xlarge | x86\$164 | 
| m6id.16xlarge | x86\$164 | 
| m6id.24xlarge | x86\$164 | 
| m6id.32xlarge | x86\$164 | 
| m6id.metal | x86\$164 | 
| m6idn.8xlarge | x86\$164 | 
| m6idn.12xlarge | x86\$164 | 
| m6idn.16xlarge | x86\$164 | 
| m6idn.24xlarge | x86\$164 | 
| m6idn.32xlarge | x86\$164 | 
| m6idn.metal | x86\$164 | 
| m6in.8xlarge | x86\$164 | 
| m6in.12xlarge | x86\$164 | 
| m6in.16xlarge | x86\$164 | 
| m6in.24xlarge | x86\$164 | 
| m6in.32xlarge | x86\$164 | 
| m6in.metal | x86\$164 | 
| m7a.12xlarge | x86\$164 | 
| m7a.16xlarge | x86\$164 | 
| m7a.24xlarge | x86\$164 | 
| m7a.32xlarge | x86\$164 | 
| m7a.48xlarge | x86\$164 | 
| m7a.metal-48xl | x86\$164 | 
| m7g.12xlarge | arm64 | 
| m7g.16xlarge | arm64 | 
| m7g.metal | arm64 | 
| m7gd.12xlarge | arm64 | 
| m7gd.16xlarge | arm64 | 
| m7gd.metal | arm64 | 
| m7i.12xlarge | x86\$164 | 
| m7i.16xlarge | x86\$164 | 
| m7i.24xlarge | x86\$164 | 
| m7i.48xlarge | x86\$164 | 
| m7i.metal-24xl | x86\$164 | 
| m7i.metal-48xl | x86\$164 | 
| m8a.16xlarge | x86\$164 | 
| m8a.24xlarge | x86\$164 | 
| m8a.48xlarge | x86\$164 | 
| m8a.metal-24xl | x86\$164 | 
| m8a.metal-48xl | x86\$164 | 
| m8azn.12xlarge | x86\$164 | 
| m8azn.24xlarge | x86\$164 | 
| m8azn.metal-12xl | x86\$164 | 
| m8azn.metal-24xl | x86\$164 | 
| m8g.12xlarge | arm64 | 
| m8g.16xlarge | arm64 | 
| m8g.24xlarge | arm64 | 
| m8g.48xlarge | arm64 | 
| m8g.metal-24xl | arm64 | 
| m8g.metal-48xl | arm64 | 
| m8gb.8xlarge | arm64 | 
| m8gb.12xlarge | arm64 | 
| m8gb.16xlarge | arm64 | 
| m8gb.24xlarge | arm64 | 
| m8gb.48xlarge | arm64 | 
| m8gb.metal-24xl | arm64 | 
| m8gb.metal-48xl | arm64 | 
| m8gd.12xlarge | arm64 | 
| m8gd.16xlarge | arm64 | 
| m8gd.24xlarge | arm64 | 
| m8gd.48xlarge | arm64 | 
| m8gd.metal-24xl | arm64 | 
| m8gd.metal-48xl | arm64 | 
| m8gn.8xlarge | arm64 | 
| m8gn.12xlarge | arm64 | 
| m8gn.16xlarge | arm64 | 
| m8gn.24xlarge | arm64 | 
| m8gn.48xlarge | arm64 | 
| m8gn.metal-24xl | arm64 | 
| m8gn.metal-48xl | arm64 | 
| m8i.24xlarge | x86\$164 | 
| m8i.32xlarge | x86\$164 | 
| m8i.48xlarge | x86\$164 | 
| m8i.96xlarge | x86\$164 | 
| m8i.metal-48xl | x86\$164 | 
| m8i.metal-96xl | x86\$164 | 
| m8id.24xlarge | x86\$164 | 
| m8id.32xlarge | x86\$164 | 
| m8id.48xlarge | x86\$164 | 
| m8id.96xlarge | x86\$164 | 
| m8id.metal-48xl | x86\$164 | 
| m8id.metal-96xl | x86\$164 | 

------
#### [ Compute optimized ]


| 实例类型 | 架构 | 
| --- | --- | 
| c6a.12xlarge | x86\$164 | 
| c6a.16xlarge | x86\$164 | 
| c6a.24xlarge | x86\$164 | 
| c6a.32xlarge | x86\$164 | 
| c6a.48xlarge | x86\$164 | 
| c6a.metal | x86\$164 | 
| c6gn.4xlarge | arm64 | 
| c6gn.8xlarge | arm64 | 
| c6gn.12xlarge | arm64 | 
| c6gn.16xlarge | arm64 | 
| c6i.8xlarge | x86\$164 | 
| c6i.12xlarge | x86\$164 | 
| c6i.16xlarge | x86\$164 | 
| c6i.24xlarge | x86\$164 | 
| c6i.32xlarge | x86\$164 | 
| c6i.metal | x86\$164 | 
| c6id.8xlarge | x86\$164 | 
| c6id.12xlarge | x86\$164 | 
| c6id.16xlarge | x86\$164 | 
| c6id.24xlarge | x86\$164 | 
| c6id.32xlarge | x86\$164 | 
| c6id.metal | x86\$164 | 
| c6in.8xlarge | x86\$164 | 
| c6in.12xlarge | x86\$164 | 
| c6in.16xlarge | x86\$164 | 
| c6in.24xlarge | x86\$164 | 
| c6in.32xlarge | x86\$164 | 
| c6in.metal | x86\$164 | 
| c7a.12xlarge | x86\$164 | 
| c7a.16xlarge | x86\$164 | 
| c7a.24xlarge | x86\$164 | 
| c7a.32xlarge | x86\$164 | 
| c7a.48xlarge | x86\$164 | 
| c7a.metal-48xl | x86\$164 | 
| c7g.12xlarge | arm64 | 
| c7g.16xlarge | arm64 | 
| c7g.metal | arm64 | 
| c7gd.12xlarge | arm64 | 
| c7gd.16xlarge | arm64 | 
| c7gd.metal | arm64 | 
| c7gn.4xlarge | arm64 | 
| c7gn.8xlarge | arm64 | 
| c7gn.12xlarge | arm64 | 
| c7gn.16xlarge | arm64 | 
| c7gn.metal | arm64 | 
| c7i.12xlarge | x86\$164 | 
| c7i.16xlarge | x86\$164 | 
| c7i.24xlarge | x86\$164 | 
| c7i.48xlarge | x86\$164 | 
| c7i.metal-24xl | x86\$164 | 
| c7i.metal-48xl | x86\$164 | 
| c8a.16xlarge | x86\$164 | 
| c8a.24xlarge | x86\$164 | 
| c8a.48xlarge | x86\$164 | 
| c8a.metal-24xl | x86\$164 | 
| c8a.metal-48xl | x86\$164 | 
| c8g.12xlarge | arm64 | 
| c8g.16xlarge | arm64 | 
| c8g.24xlarge | arm64 | 
| c8g.48xlarge | arm64 | 
| c8g.metal-24xl | arm64 | 
| c8g.metal-48xl | arm64 | 
| c8gb.8xlarge | arm64 | 
| c8gb.12xlarge | arm64 | 
| c8gb.16xlarge | arm64 | 
| c8gb.24xlarge | arm64 | 
| c8gb.48xlarge | arm64 | 
| c8gb.metal-24xl | arm64 | 
| c8gb.metal-48xl | arm64 | 
| c8gd.12xlarge | arm64 | 
| c8gd.16xlarge | arm64 | 
| c8gd.24xlarge | arm64 | 
| c8gd.48xlarge | arm64 | 
| c8gd.metal-24xl | arm64 | 
| c8gd.metal-48xl | arm64 | 
| c8gn.8xlarge | arm64 | 
| c8gn.12xlarge | arm64 | 
| c8gn.16xlarge | arm64 | 
| c8gn.24xlarge | arm64 | 
| c8gn.48xlarge | arm64 | 
| c8gn.metal-24xl | arm64 | 
| c8gn.metal-48xl | arm64 | 
| c8i.24xlarge | x86\$164 | 
| c8i.32xlarge | x86\$164 | 
| c8i.48xlarge | x86\$164 | 
| c8i.96xlarge | x86\$164 | 
| c8i.metal-48xl | x86\$164 | 
| c8i.metal-96xl | x86\$164 | 
| c8id.24xlarge | x86\$164 | 
| c8id.32xlarge | x86\$164 | 
| c8id.48xlarge | x86\$164 | 
| c8id.96xlarge | x86\$164 | 
| c8id.metal-48xl | x86\$164 | 
| c8id.metal-96xl | x86\$164 | 

------
#### [ Memory optimized ]


| 实例类型 | 架构 | 
| --- | --- | 
| r6a.12xlarge | x86\$164 | 
| r6a.16xlarge | x86\$164 | 
| r6a.24xlarge | x86\$164 | 
| r6a.32xlarge | x86\$164 | 
| r6a.48xlarge | x86\$164 | 
| r6a.metal | x86\$164 | 
| r6i.8xlarge | x86\$164 | 
| r6i.12xlarge | x86\$164 | 
| r6i.16xlarge | x86\$164 | 
| r6i.24xlarge | x86\$164 | 
| r6i.32xlarge | x86\$164 | 
| r6i.metal | x86\$164 | 
| r6id.8xlarge | x86\$164 | 
| r6id.12xlarge | x86\$164 | 
| r6id.16xlarge | x86\$164 | 
| r6id.24xlarge | x86\$164 | 
| r6id.32xlarge | x86\$164 | 
| r6id.metal | x86\$164 | 
| r6idn.8xlarge | x86\$164 | 
| r6idn.12xlarge | x86\$164 | 
| r6idn.16xlarge | x86\$164 | 
| r6idn.24xlarge | x86\$164 | 
| r6idn.32xlarge | x86\$164 | 
| r6idn.metal | x86\$164 | 
| r6in.8xlarge | x86\$164 | 
| r6in.12xlarge | x86\$164 | 
| r6in.16xlarge | x86\$164 | 
| r6in.24xlarge | x86\$164 | 
| r6in.32xlarge | x86\$164 | 
| r6in.metal | x86\$164 | 
| r7a.12xlarge | x86\$164 | 
| r7a.16xlarge | x86\$164 | 
| r7a.24xlarge | x86\$164 | 
| r7a.32xlarge | x86\$164 | 
| r7a.48xlarge | x86\$164 | 
| r7a.metal-48xl | x86\$164 | 
| r7g.12xlarge | arm64 | 
| r7g.16xlarge | arm64 | 
| r7g.metal | arm64 | 
| r7gd.12xlarge | arm64 | 
| r7gd.16xlarge | arm64 | 
| r7gd.metal | arm64 | 
| r7i.12xlarge | x86\$164 | 
| r7i.16xlarge | x86\$164 | 
| r7i.24xlarge | x86\$164 | 
| r7i.48xlarge | x86\$164 | 
| r7i.metal-24xl | x86\$164 | 
| r7i.metal-48xl | x86\$164 | 
| r7iz.8xlarge | x86\$164 | 
| r7iz.12xlarge | x86\$164 | 
| r7iz.16xlarge | x86\$164 | 
| r7iz.32xlarge | x86\$164 | 
| r7iz.metal-16xl | x86\$164 | 
| r7iz.metal-32xl | x86\$164 | 
| r8a.16xlarge | x86\$164 | 
| r8a.24xlarge | x86\$164 | 
| r8a.48xlarge | x86\$164 | 
| r8a.metal-24xl | x86\$164 | 
| r8a.metal-48xl | x86\$164 | 
| r8g.12xlarge | arm64 | 
| r8g.16xlarge | arm64 | 
| r8g.24xlarge | arm64 | 
| r8g.48xlarge | arm64 | 
| r8g.metal-24xl | arm64 | 
| r8g.metal-48xl | arm64 | 
| r8gb.8xlarge | arm64 | 
| r8gb.12xlarge | arm64 | 
| r8gb.16xlarge | arm64 | 
| r8gb.24xlarge | arm64 | 
| r8gb.48xlarge | arm64 | 
| r8gb.metal-24xl | arm64 | 
| r8gb.metal-48xl | arm64 | 
| r8gd.12xlarge | arm64 | 
| r8gd.16xlarge | arm64 | 
| r8gd.24xlarge | arm64 | 
| r8gd.48xlarge | arm64 | 
| r8gd.metal-24xl | arm64 | 
| r8gd.metal-48xl | arm64 | 
| r8gn.8xlarge | arm64 | 
| r8gn.12xlarge | arm64 | 
| r8gn.16xlarge | arm64 | 
| r8gn.24xlarge | arm64 | 
| r8gn.48xlarge | arm64 | 
| r8gn.metal-24xl | arm64 | 
| r8gn.metal-48xl | arm64 | 
| r8i.24xlarge | x86\$164 | 
| r8i.32xlarge | x86\$164 | 
| r8i.48xlarge | x86\$164 | 
| r8i.96xlarge | x86\$164 | 
| r8i.metal-48xl | x86\$164 | 
| r8i.metal-96xl | x86\$164 | 
| r8id.24xlarge | x86\$164 | 
| r8id.32xlarge | x86\$164 | 
| r8id.48xlarge | x86\$164 | 
| r8id.96xlarge | x86\$164 | 
| r8id.metal-48xl | x86\$164 | 
| r8id.metal-96xl | x86\$164 | 
| u7i-6tb.112xlarge | x86\$164 | 
| u7i-8tb.112xlarge | x86\$164 | 
| u7i-12tb.224xlarge | x86\$164 | 
| u7in-16tb.224xlarge | x86\$164 | 
| u7in-24tb.224xlarge | x86\$164 | 
| u7in-32tb.224xlarge | x86\$164 | 
| u7inh-32tb.480xlarge | x86\$164 | 
| x2idn.16xlarge | x86\$164 | 
| x2idn.24xlarge | x86\$164 | 
| x2idn.32xlarge | x86\$164 | 
| x2idn.metal | x86\$164 | 
| x2iedn.8xlarge | x86\$164 | 
| x2iedn.16xlarge | x86\$164 | 
| x2iedn.24xlarge | x86\$164 | 
| x2iedn.32xlarge | x86\$164 | 
| x2iedn.metal | x86\$164 | 
| x8g.12xlarge | arm64 | 
| x8g.16xlarge | arm64 | 
| x8g.24xlarge | arm64 | 
| x8g.48xlarge | arm64 | 
| x8g.metal-24xl | arm64 | 
| x8g.metal-48xl | arm64 | 
| x8aedz.24xlarge | x86\$164 | 
| x8aedz.metal-24xl | x86\$164 | 
| x8i.24xlarge | x86\$164 | 
| x8i.32xlarge | x86\$164 | 
| x8i.48xlarge | x86\$164 | 
| x8i.64xlarge | x86\$164 | 
| x8i.96xlarge | x86\$164 | 
| x8i.metal-48xl | x86\$164 | 
| x8i.metal-96xl | x86\$164 | 

------
#### [ Accelerated computing ]


| 实例类型 | 架构 | 
| --- | --- | 
| g6.48xlarge | x86\$164 | 
| g6e.12xlarge | x86\$164 | 
| g6e.24xlarge | x86\$164 | 
| g6e.48xlarge | x86\$164 | 
| g7e.12xlarge | x86\$164 | 
| g7e.24xlarge | x86\$164 | 
| g7e.48xlarge | x86\$164 | 
| p5.4xlarge | x86\$164 | 
| p5.48xlarge | x86\$164 | 
| p5e.48xlarge | x86\$164 | 
| p5en.48xlarge | x86\$164 | 
| p6-b200.48xlarge | x86\$164 | 
| p6-b300.48xlarge | x86\$164 | 

------
#### [ Storage optimized ]


| 实例类型 | 架构 | 
| --- | --- | 
| i4g.4xlarge | arm64 | 
| i4g.8xlarge | arm64 | 
| i4g.16xlarge | arm64 | 
| i4i.8xlarge | x86\$164 | 
| i4i.12xlarge | x86\$164 | 
| i4i.16xlarge | x86\$164 | 
| i4i.24xlarge | x86\$164 | 
| i4i.32xlarge | x86\$164 | 
| i4i.metal | x86\$164 | 
| i7i.12xlarge | x86\$164 | 
| i7i.16xlarge | x86\$164 | 
| i7i.24xlarge | x86\$164 | 
| i7i.48xlarge | x86\$164 | 
| i7i.metal-24xl | x86\$164 | 
| i7i.metal-48xl | x86\$164 | 
| i7ie.12xlarge | x86\$164 | 
| i7ie.18xlarge | x86\$164 | 
| i7ie.24xlarge | x86\$164 | 
| i7ie.48xlarge | x86\$164 | 
| i7ie.metal-24xl | x86\$164 | 
| i7ie.metal-48xl | x86\$164 | 
| i8g.12xlarge | arm64 | 
| i8g.16xlarge | arm64 | 
| i8g.24xlarge | arm64 | 
| i8g.48xlarge | arm64 | 
| i8g.metal-24xl | arm64 | 
| i8g.metal-48xl | arm64 | 
| i8ge.12xlarge | arm64 | 
| i8ge.18xlarge | arm64 | 
| i8ge.24xlarge | arm64 | 
| i8ge.48xlarge | arm64 | 
| i8ge.metal-24xl | arm64 | 
| i8ge.metal-48xl | arm64 | 
| 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'
     ```

  1. 如果您的 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 驱动程序会禁用字节队列限制。
+ 为了最大限度地减少 ENA Express TCP 流量延迟，您可以禁用 TCP 自动阻塞功能。这可能会导致数据包开销增加幅度很小：

  ```
  sudo bash -c 'echo 0 > /proc/sys/net/ipv4/tcp_autocorking'
  ```

## 调整 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](https://github.com/amzn/amzn-ec2-ena-utilities/blob/main/ena-express/check-ena-express-settings.sh)

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

# 查看 EC2 实例的 ENA Express 设置
查看实例设置

可以通过实例或网络接口验证 ENA Express 设置。要更新 ENA Express 设置，请参阅[为 EC2 实例配置 ENA Express 设置](ena-express-configure.md)。

------
#### [ Console ]

**查看网络接口的 ENA Express 设置**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)。

1. 在左侧导航窗格中，选择 **Network interfaces**（网络接口）。

1. 选择一个网络接口以查看该实例的详细信息。您可以选择 **Network interface ID**（网络接口 ID）链接以打开详情页面，也可以选择列表左侧的复选框，在页面底部的详情窗格中查看详细信息。

1. 在**详细信息**选项卡或详情页面的**网络接口附件**部分中，查看 **ENA Express** 和 **ENA Express UDP** 的设置。

**查看实例的 ENA Express 设置**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)。

1. 在左侧导航窗格中，选择 **Instances (实例)**。

1. 选择实例以查看该实例的详细信息。您可以选择 **Instance ID**（实例类型）链接以打开详情页面，也可以选择列表左侧的复选框，在页面底部的详情窗格中查看详细信息。

1. 在 **Networking**（网络）选项卡的 **Network interfaces**（网络接口）部分中，向右滚动查看 **ENA Express** 和 **ENA Express UDP** 的设置。

------
#### [ Amazon CLI ]

**获取实例的 ENA Express 设置**  
使用 [https://docs.amazonaws.cn/cli/latest/reference/describe-instances.html](https://docs.amazonaws.cn/cli/latest/reference/describe-instances.html) 命令。此命令示例将为 `--instance-ids` 参数所指定每个正在运行的实例连接的网络接口返回 ENA Express 配置列表。

```
aws ec2 describe-instances \
    --instance-ids i-1234567890abcdef0 i-0598c7d356eba48d7 \
    --query 'Reservations[*].Instances[*].[InstanceId, NetworkInterfaces[*].Attachment.EnaSrdSpecification]'
```

下面是示例输出。

```
[
    [
        [
            "i-1234567890abcdef0",
            [
                {
                    "EnaSrdEnabled": true,
                    "EnaSrdUdpSpecification": {
                        "EnaSrdUdpEnabled": false
                    }
                }
            ]
        ]
    ],
    [
        [
            "i-0598c7d356eba48d7",
            [
            {
                    "EnaSrdEnabled": true,
                    "EnaSrdUdpSpecification": {
                        "EnaSrdUdpEnabled": false
                    }
                }
            ]
        ]
    ]
]
```

**获取网络接口的 ENA Express 设置**  
使用 [https://docs.amazonaws.cn/cli/latest/reference/describe-network-interfaces.html](https://docs.amazonaws.cn/cli/latest/reference/describe-network-interfaces.html) 命令。

```
aws ec2 describe-network-interfaces \
    --network-interface-ids eni-1234567890abcdef0 \
    --query NetworkInterfaces[].[NetworkInterfaceId,Attachment.EnaSrdSpecification]
```

下面是示例输出。

```
[
    [
        "eni-1234567890abcdef0",
        {
            "EnaSrdEnabled": true,
            "EnaSrdUdpSpecification": {
                "EnaSrdUdpEnabled": false
            }
        }
    ]
]
```

------
#### [ PowerShell ]

**获取网络接口的 ENA Express 设置**  
使用 [https://docs.amazonaws.cn/powershell/latest/reference/items/Get-EC2NetworkInterface.html](https://docs.amazonaws.cn/powershell/latest/reference/items/Get-EC2NetworkInterface.html) cmdlet。

```
Get-EC2NetworkInterface `
    -NetworkInterfaceId eni-1234567890abcdef0 | `
Select-Object `
    Association, 
    NetworkInterfaceId, 
    OwnerId, 
    @{Name = 'AttachTime'; Expression = { $_.Attachment.AttachTime } },
    @{Name = 'AttachmentId'; Expression = { $_.Attachment.AttachmentId } },
    @{Name = 'DeleteOnTermination'; Expression = { $_.Attachment.DeleteOnTermination } },
    @{Name = 'NetworkCardIndex'; Expression = { $_.Attachment.NetworkCardIndex } },
    @{Name = 'InstanceId'; Expression = { $_.Attachment.InstanceId } },
    @{Name = 'InstanceOwnerId'; Expression = { $_.Attachment.InstanceOwnerId } },
    @{Name = 'Status'; Expression = { $_.Attachment.Status } },
    @{Name = 'EnaSrdEnabled'; Expression = { $_.Attachment.EnaSrdSpecification.EnaSrdEnabled } },
    @{Name = 'EnaSrdUdpEnabled'; Expression = { $_.Attachment.EnaSrdSpecification.EnaSrdUdpSpecification.EnaSrdUdpEnabled } }
```

下面是示例输出。

```
Association         : 
NetworkInterfaceId  : eni-0d1234e5f6a78901b
OwnerId             : 111122223333
AttachTime          : 6/11/2022 1:13:11 AM
AttachmentId        : eni-attach-0d1234e5f6a78901b
DeleteOnTermination : True
NetworkCardIndex    : 0
InstanceId          : i-1234567890abcdef0
InstanceOwnerId     : 111122223333
Status              : attached
EnaSrdEnabled       : True
EnaSrdUdpEnabled    : False
```

------

# 为 EC2 实例配置 ENA Express 设置
配置实例设置

您可为支持的 EC2 实例类型配置 ENA Express，而无需安装任何其他软件。有关更多信息，请参阅 [ENA Express 支持的实例类型](ena-express.md#ena-express-supported-instance-types)。

------
#### [ Console ]

**管理网络接口的 ENA Express**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)。

1. 在左侧导航窗格中，选择 **Network interfaces**（网络接口）。

1. 选择附加到实例的网络接口。您可以选择 **Network interface ID**（网络接口 ID）链接以打开详情页面，也可以选择列表左侧的复选框。

1. 从页面右上角的 **Action**（操作）菜单中选择 **Manage ENA Express**（管理 ENA Express）。这样将打开 **Manage ENA Express**（管理 ENA Express）对话框，显示选定的网络接口 ID 和当前设置。

   如果您选择的网络接口未附加到实例，则菜单中不会出现此操作。

1. 要使用 **ENA Express**，请选择**启用**复选框。

1. 启用 ENA Express 后，您可以配置 UDP 设置。要使用 **ENA Express UDP**，请选择**启用**复选框。

1. 选择**保存**以保存您的设置。

**管理实例的 ENA Express**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)。

1. 在左侧导航窗格中，选择 **Instances (实例)**。

1. 选择想要管理的实例。您可以选择 **Instance ID**（实例 ID）以打开详情页面，也可以选择列表左侧的复选框。

1. 选择要为您的实例配置的 **Network interface**（网络接口）。

1. 从页面右上角的 **Action**（操作）菜单中选择 **Manage ENA Express**（管理 ENA Express）。

1. 要为附加到实例的网络接口配置 ENA Express，请从 **Network interface**（网络接口）列表中进行选择。

1. 要对选定的网络接口附件使用 **ENA Express**，请选择**启用**复选框。

1. 启用 ENA Express 后，您可以配置 UDP 设置。要使用 **ENA Express UDP**，请选择**启用**复选框。

1. 选择**保存**以保存您的设置。

**挂载网络接口时配置 ENA Express**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)。

1. 在左侧导航窗格中，选择 **Network interfaces**（网络接口）。

1. 选择未附加到实例的网络接口 [**Status**（状态）为**可用**]。您可以选择 **Network interface ID**（网络接口 ID）链接以打开详情页面，也可以选择列表左侧的复选框。

1. 选择要附加到的 **Instance**（实例）。

1. 将网络接口附加到实例后要使用 **ENA Express**，请选择**启用**复选框。

1. 启用 ENA Express 后，您可以配置 UDP 设置。要使用 **ENA Express UDP**，请选择**启用**复选框。

1. 要将网络接口附加到实例并保存 ENA Express 设置，请选择 **Attach**（附加）。

------
#### [ Amazon CLI ]

**挂载网络接口时配置 ENA Express**  
使用 [https://docs.amazonaws.cn/cli/latest/reference/;attach-network-interface.html](https://docs.amazonaws.cn/cli/latest/reference/;attach-network-interface.html) 命令，如以下示例所示。

**示例 1：将 ENA Express 用于 TCP 流量，而非 UDP 流量**  
此示例将 `EnaSrdEnabled` 配置为 `true`，且允许 `EnaSrdUdpEnabled` 默认为 `false`。

```
aws ec2 attach-network-interface \
    --network-interface-id eni-1234567890abcdef0 \
    --instance-id i-1234567890abcdef0 \
    --device-index 1 \
    --ena-srd-specification 'EnaSrdEnabled=true'
```

**示例 2：将 ENA Express 用于 TCP 流量和 UDP 流量**  
此示例将 `EnaSrdEnabled` 和 `EnaSrdUdpEnabled` 均配置为 `true`。

```
aws ec2 attach-network-interface \
    --network-interface-id eni-1234567890abcdef0 \
    --instance-id i-1234567890abcdef0 \
    --device-index 1 \
    --ena-srd-specification 'EnaSrdEnabled=true,EnaSrdUdpSpecification={EnaSrdUdpEnabled=true}'
```

**更新网络接口挂载的 ENA Express 设置**  
使用 [https://docs.amazonaws.cn/cli/latest/reference/modify-network-interface-attribute.html](https://docs.amazonaws.cn/cli/latest/reference/modify-network-interface-attribute.html) 命令，如以下示例所示。

**示例 1：将 ENA Express 用于 TCP 流量，而非 UDP 流量**  
此示例将 `EnaSrdEnabled` 配置为 `true`，并且如果之前从未设置过，则允许 `EnaSrdUdpEnabled` 默认为 `false`。

```
aws ec2 modify-network-interface-attribute \
    --network-interface-id eni-1234567890abcdef0 \
    --ena-srd-specification 'EnaSrdEnabled=true'
```

**示例 2：将 ENA Express 用于 TCP 流量和 UDP 流量**  
此示例将 `EnaSrdEnabled` 和 `EnaSrdUdpEnabled` 均配置为 `true`。

```
aws ec2 modify-network-interface-attribute \
    --network-interface-id eni-1234567890abcdef0 \
    --ena-srd-specification 'EnaSrdEnabled=true,EnaSrdUdpSpecification={EnaSrdUdpEnabled=true}'
```

**示例 3：停止将 ENA Express 用于 UDP 流量**  
此示例将 `EnaSrdUdpEnabled` 配置为 `false`。

```
aws ec2 modify-network-interface-attribute \
    --network-interface-id eni-1234567890abcdef0 \
    --ena-srd-specification 'EnaSrdUdpSpecification={EnaSrdUdpEnabled=false}'
```

------
#### [ PowerShell ]

**挂载网络接口时配置 ENA Express**  
使用 [https://docs.amazonaws.cn/powershell/latest/reference/items/Add-EC2NetworkInterface.html](https://docs.amazonaws.cn/powershell/latest/reference/items/Add-EC2NetworkInterface.html) cmdlet，如以下示例中所示。

**示例 1：将 ENA Express 用于 TCP 流量，而非 UDP 流量**  
此示例将 `EnaSrdEnabled` 配置为 `true`，且允许 `EnaSrdUdpEnabled` 默认为 `false`。

```
Add-EC2NetworkInterface `
    -NetworkInterfaceId eni-1234567890abcdef0 `
    -InstanceId i-1234567890abcdef0 `
    -DeviceIndex 1 `
    -EnaSrdSpecification_EnaSrdEnabled $true
```

**示例 2：将 ENA Express 用于 TCP 流量和 UDP 流量**  
此示例将 `EnaSrdEnabled` 和 `EnaSrdUdpEnabled` 均配置为 `true`。

```
Add-EC2NetworkInterface `
    -NetworkInterfaceId eni-1234567890abcdef0 `
    -InstanceId i-1234567890abcdef0 `
    -DeviceIndex 1 `
    -EnaSrdSpecification_EnaSrdEnabled $true `
    -EnaSrdUdpSpecification_EnaSrdUdpEnabled $true
```

**配置网络接口挂载的 ENA Express 设置**  
使用 [https://docs.amazonaws.cn/powershell/latest/reference/items/Edit-EC2NetworkInterfaceAttribute.html](https://docs.amazonaws.cn/powershell/latest/reference/items/Edit-EC2NetworkInterfaceAttribute.html) cmdlet，如以下示例中所示。

**示例 1：将 ENA Express 用于 TCP 流量，而非 UDP 流量**  
此示例将 `EnaSrdEnabled` 配置为 `true`，并且如果之前从未设置过，则允许 `EnaSrdUdpEnabled` 默认为 `false`。

```
Edit-EC2NetworkInterfaceAttribute `
    -NetworkInterfaceId eni-1234567890abcdef0 `
    -EnaSrdSpecification_EnaSrdEnabled $true ; 
Get-EC2NetworkInterface -NetworkInterfaceId eni-0123f4567890a1b23 | `
Select-Object `
    NetworkInterfaceId, 
    @{Name = 'EnaSrdEnabled'; Expression = { $_.Attachment.EnaSrdSpecification.EnaSrdEnabled }}, 
    @{Name = 'EnaSrdUdpEnabled'; Expression = { $_.Attachment.EnaSrdSpecification.EnaSrdUdpSpecification.EnaSrdUdpEnabled }} | `
Format-List
```

**示例 2：将 ENA Express 用于 TCP 流量和 UDP 流量**  
此示例将 `EnaSrdEnabled` 和 `EnaSrdUdpEnabled` 均配置为 `true`。

```
Edit-EC2NetworkInterfaceAttribute `
    -NetworkInterfaceId eni-1234567890abcdef0 `
    -EnaSrdSpecification_EnaSrdEnabled $true `
    -EnaSrdSpecification_EnaSrdUdpSpecification_EnaSrdUdpEnabled $true ;
Get-EC2NetworkInterface -NetworkInterfaceId eni-1234567890abcdef0 | `
Select-Object `
    NetworkInterfaceId, 
    @{Name = 'EnaSrdEnabled'; Expression = { $_.Attachment.EnaSrdSpecification.EnaSrdEnabled }}, 
    @{Name = 'EnaSrdUdpEnabled'; Expression = { $_.Attachment.EnaSrdSpecification.EnaSrdUdpSpecification.EnaSrdUdpEnabled }} | `
Format-List
```

**示例 3：停止将 ENA Express 用于 UDP 流量**  
此示例将 `EnaSrdUdpEnabled` 配置为 `false`。

```
Edit-EC2NetworkInterfaceAttribute `
    -NetworkInterfaceId eni-0123f4567890a1b23 `
    -EnaSrdSpecification_EnaSrdUdpSpecification_EnaSrdUdpEnabled $false ; 
Get-EC2NetworkInterface -NetworkInterfaceId eni-0123f4567890a1b23 | `
Select-Object `
    NetworkInterfaceId, 
    @{Name = 'EnaSrdEnabled'; Expression = { $_.Attachment.EnaSrdSpecification.EnaSrdEnabled }}, 
    @{Name = 'EnaSrdUdpEnabled'; Expression = { $_.Attachment.EnaSrdSpecification.EnaSrdUdpSpecification.EnaSrdUdpEnabled }} | `
Format-List
```

------

## 启动时配置 ENA Express


启动实例时，您可以使用以下方法之一直接配置 ENA Express。指定的链接会提供关于这些方法的 Amazon Web Services 管理控制台 说明。
+ **启动实例向导**：使用启动实例向导时，可以在启动时配置 ENA Express。有关详细信息，请参阅启动实例向导[网络设置](ec2-instance-launch-parameters.md#liw-network-settings)中的**高级网络配置**。
+ **启动模板**：使用启动模板时，可以在启动时配置 ENA Express。有关更多信息，请参阅[创建 Amazon EC2 启动模板](create-launch-template.md)页面，然后展开**网络设置**部分，从中查看**高级网络配置**。