

# 改善基于 Linux 的 EC2 实例的网络延迟
<a name="ena-improve-network-latency-linux"></a>

网络延迟是指数据包从源传输到目的地所花费的时间。通过网络发送数据的应用程序依赖于及时的响应来提供积极的用户体验。高网络延迟可能会导致各种问题，例如：
+ 网页加载时间慢
+ 视频流滞后
+ 难以访问在线资源

本节概述了您可以采取哪些步骤来改善 Linux 上运行的 Amazon EC2 实例的网络延迟。要实现最佳延迟，请按照以下步骤配置您的实例、内核和 ENA 驱动程序设置。有关其他配置指南，请参阅 GitHub 上的 [ENA Linux 驱动程序最佳实践和性能优化指南](https://github.com/amzn/amzn-drivers/blob/master/kernel/linux/ena/ENA_Linux_Best_Practices.rst)。

**注意**  
步骤和设置可能略有不同，具体取决于您的特定网络硬件、启动实例的 AMI 以及您的应用程序用例。在进行任何更改之前，请全面测试和监控您的网络性能，以确保获得预期的结果。

## 减少数据包的网络跃点数
<a name="ena-latency-reduce-hops"></a>

数据包在路由器之间移动时经过的每个跃点都会增加网络延迟。通常，流量必须经过多个跃点才能到达目的地。有两种方法可以减少 Amazon EC2 实例的网络跃点数，具体如下：
+ **集群置放群组**：当您指定[集群置放群组](placement-strategies.md#placement-groups-cluster)时，Amazon EC2 会启动彼此靠近、物理上位于同一可用区（AZ）且封装更紧密的实例。群组中实例的物理接近允许它们利用高速连接，从而实现低延迟和高单流吞吐量。
+ **专属主机**：[专属主机](dedicated-hosts-overview.md)是一种专供您使用的物理服务器。通过专属主机，您可以启动您的实例，使其在同一台物理服务器上运行。在同一专属主机上运行的实例无需任何额外的网络跃点即可在彼此之间进行通信。

## Linux 内核配置如何影响延迟
<a name="ena-latency-kernel-config"></a>

Linux 内核配置可以增加或减少网络延迟。要实现延迟优化目标，必须根据工作负载的具体要求对 Linux 内核配置进行微调。

Linux 内核有许多配置选项可能有助于减少网络延迟。最具影响力的选项如下。
+ **启用忙轮询模式** – 忙轮询模式可减少网络接收路径上的延迟。启用忙轮询模式时，套接字层代码可以直接轮询网络设备的接收队列。繁忙轮询的缺点是，由于在紧密循环中轮询新数据，主机中的 CPU 使用率更高。有两种全局设置可以控制等待所有接口数据包的微秒数。

     
`busy_read`  
套接字读取的低延迟繁忙轮询超时。这可以控制等待套接字层读取设备队列上的数据包的微秒数。要使用 **sysctl** 命令全局启用该功能，Linux 内核组织推荐的值为 50 微秒。有关更多信息，请参阅 *Linux 内核用户和管理员指南*中的 [busy\$1read](https://www.kernel.org/doc/html/v5.19/admin-guide/sysctl/net.html?highlight=busy_read)。  

  ```
  [ec2-user ~]$ sudo sysctl -w net.core.busy_read=50
  ```  
`busy_poll`  
轮询和选择的低延迟繁忙轮询超时。这可以控制等待事件的微秒数。推荐值介于 50-100 微秒之间，具体取决于您要轮询的套接字数。您添加的套接字越多，数字就应该越大。  

  ```
  [ec2-user ~]$ sudo sysctl -w net.core.busy_poll=50
  ```
+ **配置 CPU 电源状态（C 状态）**– C 状态控制内核在非活动状态下可能进入的睡眠级别。您可能需要控制 C 状态来调整系统的延迟与性能。在更深层的 C 状态中，CPU 本质上处于睡眠状态，在唤醒并转回活动状态之前无法响应请求。将核心置于睡眠状态需要时间，尽管睡眠中的核心可为其他核心提供更多空间以加速至更高频率，但该睡眠中的核心也需要时间来重新唤醒并执行工作。

  例如，如果某个负责处理网络数据包中断的核心处于睡眠状态，那么在处理此类中断时可能会出现延迟。您可以配置系统，使其不使用更深层的 C 状态。虽然这种配置降低了处理器反应延迟，但也减少了 Turbo Boost 其他内核的可用空间。

  为了降低处理器的反应延迟，可以限制深层 C 状态。有关更多信息，请参阅《Amazon Linux 2 User Guide》**中的 [High performance and low latency by limiting deeper C-states](https://docs.amazonaws.cn/linux/al2/ug/processor_state_control.html#c-states)。

## 中断裁决
<a name="ena-latency-interrupt-moderation"></a>

ENA 网络驱动程序支持实例和网络之间的通信。该驱动程序可处理网络数据包，并将其传递到网络堆栈或 Nitro 卡。当网络数据包进入时，Nitro 卡会产生一个中断，以便 CPU 通知软件某个事件。

中断  
中断是设备或应用程序发送到处理器的信号。中断通知处理器发生某个事件或达到条件，需要立即关注。中断可以处理时间敏感型任务，例如从网络接口接收数据、处理硬件事件或处理来自其他设备的请求。

中断裁决  
中断裁决是一种技术，通过聚合或延迟中断来减少设备产生的中断数量。中断裁决的目的是通过减少与处理大量中断相关的开销来提高系统性能。中断过多会增加 CPU 使用率，对吞吐量产生不利影响，而中断过少会增加延迟。

动态中断裁决  
动态中断裁决是一种增强的中断裁决形式，可根据当前系统负载和流量模式动态调整中断速率。它的目标是在减少中断开销和每秒数据包或带宽之间取得平衡。  
某些 AMI 默认启用动态中断裁决（但在所有 AMI 中都可以启用或禁用）。

为了最大限度减少网络延迟，可能需要禁用中断裁决。但是，这也会增加中断处理的开销。在减少延迟和最小化开销之间找到正确的平衡非常重要。`ethtool` 命令可以帮助您配置中断裁决。默认情况下，`rx-usecs` 设置为 `20`，`tx-usecs` 设置为 `64`。

要获取当前的中断裁决配置，请使用以下命令：

```
[ec2-user ~]$ ethtool -c interface | egrep "rx-usecs:|tx-usecs:|Adaptive RX"
Adaptive RX: on  TX: off
rx-usecs: 20
tx-usecs: 64
```

要禁用中断裁决和动态中断裁决，请使用以下命令。

```
[ec2-user ~]$ sudo ethtool -C interface adaptive-rx off rx-usecs 0 tx-usecs 0
```