当平均利用率较低时,为什么我的 Amazon Elastic Compute Cloud(Amazon EC2)实例超出了其网络限制?

上次更新日期:2022 年 5 月 26 日

当平均利用率较低时,为什么我的 Amazon Elastic Compute Cloud(Amazon EC2)实例超出了其网络限制?

简短描述

您可以通过 Elastic Network Adapter(ENA)在支持增强联网的实例上实时查询网络性能指标。这些指标提供自上一次驱动程序重置以来在每个网络接口上队列或丢弃的数据包的累计数量。以下是一些 ENA 指标:

  • bw_in_allowance_exceeded:由于入站聚合带宽超过实例的最大值而队列或丢弃的数据包数。
  • bw_out_allowance_exceeded:由于出站聚合带宽超过实例的最大值而队列或丢弃的数据包数。
  • pps_allowance_exceeded:由于双向每秒数据包数(PPS)超出实例的最大值而队列或丢弃的数据包数。

在某些情况下,即使在 Amazon CloudWatch 中看到的平均带宽或 PPS 较低,您也可能会看到队列或丢弃。例如,CloudWatch 中的 NetworkInNetworkOutNetworkPacketsInNetworkPacketsOut 指标可能会显示未表明达到限制的量。

解决方法

微爆流是上述症状的最常见原因。微爆流是需求的短时峰值,然后是低活动或没有活动的时期。这些突发只持续几秒、几毫秒甚至几微秒。在微爆流的情况下,上一节中列出的 CloudWatch 指标不够精细,无法反映它们。

如何计算平均值

上一节中列出的 CloudWatch 中的 EC2 指标每 1 分钟采样一次。这些指标捕获该时段内传输的总字节数或数据包数。然后,这些示例将在 5 分钟的期间聚合并发布到 CloudWatch。该周期内的每个统计数据都会返回不同的样本值:

  • Minimum(最小值)是字节/数据包计数最低的样本值。
  • Maximum(最大值)是具有最高字节/数据包计数的样本值。
  • Sum(总和)是所有样本值的总和。
  • SampleCount(样本计数)是聚合样本的数量(在本例中为 5)。
  • Average(平均值)是平均样本值,通过将总和除以 SampleCount 计算得出。

平均吞吐量或 PPS 可以通过两种方式计算:

  • 总和除以周期(例如 300 秒),得出简单的 5 分钟平均值。
  • 最大值除以 60 秒,得出活动最多的一分钟内的平均值。

微爆流如何反映在 CloudWatch 指标中

以下是微爆流的示例,以及它在 CloudWatch 中的反映方式:

  • 该实例的网络带宽性能为 10Gbps (1.25Gb/s)。
  • 在给定的样本(60 秒)中,20GB 的出站数据传输会占用所有可用带宽,从而导致 bw_out_allowance_exceeded 递增。传输将在大约 20 秒钟内完成,之后不会再发送任何数据。
  • 实例对于剩余的 4 个样本保持空闲状态(240 秒)。

在此示例中,5 分钟内的平均吞吐量远低于微爆流期间的平均吞吐量:

SUM(NetworkOut) / PERIOD = ((20 GB * 1 sample) + (0 GB * 4 samples)) / 300 seconds = ~0.066 GB/s * 8 bits = ~0.533 Gbps

即使您根据最高样本计算吞吐量,平均值仍然无法反映吞吐量:

MAXIMUM(NetworkOut) / 60 seconds = 20 GB / 60 = ~0.333 GB/s * 8 bits = ~2.667 Gbps

监控微爆流

要更精细地测量吞吐量和 PPS,请使用操作系统(OS)工具监控网络统计信息。在塑造或活动频繁期间,更频繁地监控网络统计信息。

以下是操作系统工具的示例:

Linux

  • sar
  • nload
  • iftop
  • iptraf-ng

Windows

  • 性能监视器

CloudWatch 代理可以在 Linux 和 Windows 上使用,用于将这些操作系统级别的网络指标作为自定义指标发布到 CloudWatch。这些指标的发布间隔可以低至 1 秒。请注意,高分辨率指标(周期小于 60 秒的指标)会导致更高的费用。有关 CloudWatch 定价的更多信息,请参阅 Amazon CloudWatch 定价

监控 ENA 提供的网络性能指标是最佳实践。驱动程序版本必须高于或等于 2.2.10(Linux)和 2.2.2(Windows)才能让您查看指标。有关更多信息,请查看 LinuxWindows 的相关页面。CloudWatch 代理还可以发布 ENA 指标。

有关发布适用于 Linux 的 ENA 指标的说明,请参阅收集网络性能指标。对于 Windows,性能监视器中提供了 ENA 指标,而 CloudWatch 代理可以在其中发布任何可用的指标。

防止微爆流

为避免微爆流,需要按发送方调节流量,以使其不超过最大吞吐量或数据包速率。这使得微爆流难以避免。按发送方调节流量通常需要应用程序级别的更改。根据此更改的实施方式,可能需要在发送方处提供并开启对流量调整的操作系统支持。这可能并不总能实现,或者并不总是切合实际。短时间内进行太多次发送数据包的连接时也会发生微爆流,在这种情况下,调整单个发送方的步调无济于事。

由于这些原因,最佳做法是监控 ENA 指标,如前所述。如果经常达到限制,或者如果有证据表明这会影响您的应用程序,请执行以下操作:

  • 纵向扩展:改用更大的实例大小。较大的实例通常具有更高的限额。网络优化型实例(例如 C5n 中带有“n”的实例)比其各自的非网络优化实例具有更高的限额。
  • 横向扩展:将流量分散到多个实例,以减少单个实例的流量和争用。

在 Linux 上,除了上述选项外,高级用户还有一些潜在的缓解选项:

  • SO_MAX_PACING_RATE:应用程序可以将此套接字选项传递给 setsockopt,以指定最大调节速率(每秒字节数)。然后,Linux 内核会调整来自该套接字的流量,使其不超过限制。此选项要求具备以下条件:
    应用程序级代码更改。
    来自内核的支持
    使用公平队列(FQ)队列规则或内核对 TCP 层调节的支持(仅适用于 TCP)。
  • 列队规则(qdiscs):一些 qdiscs 在各种不同级别上提供对流量调节的支持。有关更多信息,请参阅流量控制(TC)手册页面。
  • 浅传输(Tx)队列:在某些情况下,浅传输 Tx 队列有助于减少 PPS 限制。它可以通过两种方式实现:
    字节队列限制(BQL):BQL 动态限制 Tx 队列上正在运行的字节数。在 Linux 内核附带的 ENA 驱动程序版本(以“K”结尾的版本)上,BLQ 默认处于打开状态。对于来自 GitHub 的 ENA 驱动程序版本(以“K”结尾的版本),BQL 从 2.6.1g 版本开始提供,默认情况下处于关闭状态。您可以使用 enable_bql ENA 模块参数打开 BQL。
    缩短 Tx 队列长度:将 Tx 队列长度从默认的 1024 个数据包减少到更低的数量(最少 256 个)。您可以使用 ethtool 更改此长度。

这篇文章对您有帮助吗?


您是否需要账单或技术支持?