Nitro 系统性能调整注意事项
Nitro 系统是由 AWS 打造的硬件和软件组件集合,可实现高性能、高可用性和高安全性。Nitro System 提供类似裸机的功能,从而消除了所有虚拟化开销并支持需要完全访问主机硬件的工作负载。有关更多详细信息,请参阅 AWS Nitro System
所有最新一代 EC2 实例类型都在 EC2 Nitro 卡上执行网络数据包处理。本主题涵盖 Nitro 卡上的高级数据包处理、影响数据包处理性能的网络架构和配置的常见方面,以及您可以采取哪些措施来实现基于 Nitro 的实例的峰值性能。
Nitro 卡可处理所有输入和输出(I/O)接口,例如虚拟私有云(VPC)所需的接口。对于通过网络发送或接收信息的所有组件,Nitro 卡可充当 I/O 流量的独立计算设备,在物理上与运行客户工作负载的系统主板分开。
Nitro 卡上的网络数据包流
基于 Nitro System 构建的 EC2 实例具有硬件加速功能,可以更快地处理数据包,以每秒数据包数(PPS)吞吐率衡量。当 Nitro 卡对新流执行初始评估时,其会保存流中所有数据包相同的信息,例如安全组、访问控制列表和路由表条目。当处理同一个流的额外数据包时,其可以使用保存的信息来减少这些数据包的开销。
您的连接速率通过每秒连接数(CPS)指标来衡量。每个新连接都需要额外的处理开销,必须将其纳入工作负载能力估计中考虑。在设计工作负载时,请务必同时考虑 CPS 和 PPS 指标。
如何建立连接
在基于 Nitro 的实例与另一个端点之间建立连接时,Nitro 卡会评估两个端点之间发送或接收的第一个数据包的完整流。对于同一个流的后续数据包,通常不需要完全重新评估。但有一些例外情况。有关异常的更多信息,请参阅 不使用硬件加速的数据包。
以下属性定义了两个端点及其之间的数据包流。这五个属性一起统称为 5 元组流。
-
源 IP
-
源端口
-
目的地 IP
-
目的地端口
-
通信协议
数据包流的方向称为入口(入站)和出口(出站)。以下高级描述总结了端到端网络数据包流。
-
入口 – 当 Nitro 卡处理入站网络数据包时,它会根据状态防火墙规则和访问控制列表评估数据包。它跟踪连接、计量连接并执行其他适用的操作。然后,它将数据包转发到主机 CPU 上的目标。
-
出口 – 当 Nitro 卡处理出站网络数据包时,它会查找远程接口目标,评估各种 VPC 功能,应用速率限制,并执行其他适用的操作。然后,它会将数据包转发到网络上的下一跃点目标。
实现最佳性能的网络设计
要利用 Nitro 系统的性能,您必须了解网络处理需求以及这些需求如何影响 Nitro 资源的工作负载。然后,您可以针对网络环境进行设计以获得最佳性能。您的基础架构设置以及应用程序工作负载设计和配置可能会影响数据包处理和连接速率。例如,如果您的应用程序建立了高速率连接(例如 DNS 服务、防火墙或虚拟路由器),则其利用硬件加速的机会就会减少,此类加速仅会发生在建立连接后。
您可以配置应用程序和基础架构设置,以简化工作负载并提高网络性能。但是,并非所有数据包都符合加速条件。Nitro 系统使用完整的网络流处理新连接和不符合加速条件的数据包。
本节的其余部分将重点介绍应用程序和基础架构设计注意事项,以帮助确保数据包尽可能在加速路径内流动。
Nitro 系统的网络设计注意事项
在为实例配置网络流量时,需要考虑许多可能影响 PPS 性能的方面。建立流量后,大多数定期传入或传出的数据包都符合加速条件。但是,为了确保基础架构设计和数据包流继续符合协议标准,也存在例外情况。
要从 Nitro 卡中获得最佳性能,您应仔细考虑以下基础架构和应用程序配置详细信息的优缺点。
基础架构注意事项
您的基础架构配置可能会影响数据包流和处理效率。以下列表包括一些重要注意事项。
- 具有非对称性的网络接口配置
-
安全组使用连接跟踪来跟踪有关流入和流出实例的流量的信息。非对称路由(即流量通过一个网络接口进入实例,然后通过另一个网络接口离开)可能会降低实例在跟踪流量时所能达到的峰值性能。有关安全组连接跟踪、未跟踪的连接和自动跟踪的连接的更多信息,请参阅Amazon EC2 安全组连接跟踪。
- 网络驱动程序
-
网络驱动程序会定期更新和发布。如果您的驱动程序已过时,则可能会严重影响性能。让驱动程序保持最新,以确保您拥有最新的补丁并可以利用性能改进,例如仅适用于最新一代驱动程序的加速路径功能。早期版本的驱动程序不支持加速路径功能。
要利用加速路径功能,建议您在实例上安装最新的 ENA 驱动程序。
Linux 实例:ENA Linux 驱动程序 2.2.9 或更高版本。要从 Amazon Drivers GitHub 存储库安装或更新 ENA Linux 驱动程序,请参阅自述文件中的驱动程序编译
部分。 Windows 实例:ENA Windows 驱动程序 2.0.0 或更高版本。要安装或更新 ENA Windows 驱动程序,请参阅 在 EC2 Windows 实例上安装 ENA 驱动程序。
- 端点之间的距离
-
由于应用程序层的 TCP 窗口化,同一可用区域中两个实例之间的连接每秒可以处理的数据包比跨区域连接更多,这决定了在任何给定时间可以传输的数据量。实例之间的距离较长会增加延迟,并减少端点可以处理的数据包数量。
应用程序设计注意事项
应用程序设计和配置的某些方面可能会影响您的处理效率。以下列表包括一些重要注意事项。
- 数据包大小
-
较大的数据包大小可以增加实例可在网络上发送和接收的数据的吞吐量。较小的数据包大小可以提高数据包处理速率,但当数据包数量超过 PPS 限额时,这可能会降低实现的最大带宽。
如果数据包的大小超过网络跃点的最大传输单元(MTU),则路径上的路由器可能会将其分段。生成的数据包片段被视为例外,并以标准速率(未加速)进行处理。这可能会导致您的性能发生变化。Amazon EC2 支持 9001 字节的巨型帧,但并非所有服务都支持。我们建议您在配置 MTU 时评估拓扑。
- 协议权衡
-
TCP 等可靠协议比 UDP 等不可靠协议具有更多开销。UDP 传输协议较低的开销和简化的网络处理可以带来更高的 PPS 速率,但代价是牺牲可靠的数据包传输。如果可靠的数据包传输对您的应用程序并不重要,则 UDP 可能是一个不错的选择。
- 微爆
-
当流量在短时间内超过限额而不是均匀分布时,就会发生微爆。这通常发生在微秒级。
例如,假设您有一个实例可以发送高达 10Gbps 的速率,而您的应用程序在半秒钟内发送了完整的 10Gb。这种微爆在前半秒超出了允许值,而在后半秒的剩余时间里没有留下任何内容。尽管您在 1 秒的时间范围内发送了 10Gb,但前半秒的限额可能会导致数据包排队或被丢弃。
您可以使用诸如 Linux Traffic Control 之类的网络调度程序来帮助调整吞吐量,避免因微爆导致数据包排队或被丢弃。
- 流数
-
单个流限制在 5Gbps 以内,除非它位于支持高达 10Gbps 的集群置放群组内,或者它使用支持高达 25Gbps 的 ENA Express。
同样,Nitro 卡可以跨多个流处理更多数据包,而不是使用单个流。为了实现每个实例的峰值数据包处理速率,我们建议在聚合带宽为 100 Gbps 或更高的实例上至少有 100 个流。随着聚合带宽容量的增加,实现峰值处理速率所需的流数也随之增加。基准测试将帮助您确定在网络上实现峰值速率所需的配置。
- 弹性网络适配器(ENA)队列数量
-
默认情况下,系统会根据您的实例大小和类型为网络接口分配最大 ENA 队列数量。减少队列数量会降低可实现的最大 PPS 速率。为了获得最佳性能,我们建议使用默认队列分配。
对于 Linux,默认情况下,网络接口配置为最大值。对基于数据面板开发套件(DPDK)的应用程序,建议您配置最大可用队列数。
- 功能处理开销
-
流量镜像和 ENA Express 等功能可能会增加更多的处理开销,从而降低绝对数据包处理性能。您可以限制功能使用或禁用功能以提高数据包处理速率。
- 连接跟踪以保持状态
-
您的安全组使用连接跟踪来存储有关进出实例的流量的信息。连接跟踪对网络流量每个单独的流应用规则,以确定是允许还是拒绝该流量。Nitro 卡使用流跟踪来维护流状态。随着安全组规则的应用越来越多,评估流程需要做更多工作。
注意
并非所有网络流量都会被跟踪。如果安全组规则配置了 未跟踪的连接,则除了在有多个有效回复路径时自动跟踪连接以确保对称路由之外,无需进行其他工作。
不使用硬件加速的数据包
并非所有数据包都能利用硬件加速。处理这些例外情况会涉及一些处理开销,这是确保网络流正常运行所必需的。网络流必须可靠地满足协议标准,符合 VPC 设计的变化,并且仅将数据包路由到允许的目标。但是,开销会降低您的性能。
- 数据包片段
-
如应用程序注意事项下所述,由超过网络 MTU 的数据包生成的数据包片段作为例外情况处理,无法利用硬件加速。
- 空闲连接
-
当连接在一段时间内没有活动时,即使该连接尚未达到其超时限制,系统也可以取消其优先级。然后,如果数据是在取消连接优先级后进入的,则系统需要将其作为例外情况处理才能重新连接。
要管理连接,您可以使用连接跟踪超时来关闭空闲连接。您也可以使用 TCP keepalive 使空闲连接保持打开状态。有关更多信息,请参阅 空闲连接跟踪超时。
- VPC 突变
-
安全组、路由表和访问控制列表的更新都需要在处理路径中进行重新评估,以确保路由条目和安全组规则仍然按预期适用。
- ICMP 流
-
互联网控制信息协议 (ICMP) 是网络设备用来诊断网络通信问题的网络层协议。这些数据包始终使用完整流。
最大限度地提高 Nitro 系统的网络性能
在您做出任何设计决策或调整实例上的任何网络设置之前,建议您采取以下步骤来帮助确保获得最佳结果:
-
通过回顾 Nitro 系统的网络设计注意事项,了解为提高性能可以采取的措施的利弊。
有关 Linux 上实例配置的更多注意事项和最佳实践,请参阅 GitHub 上的 ENA Linux Driver Best Practices and Performance Optimization Guide
。 -
使用峰值活跃流计数对您的工作负载进行基准测试,以确定应用程序性能的基准。使用性能基准,您可以测试设置或应用程序设计中的变体,以了解哪些注意事项的影响最大,尤其是在您计划纵向扩展或横向扩展时。
以下列表包含您可以根据系统需求调整 PPS 性能的措施。
-
缩短两个实例之间的物理距离。当发送和接收实例位于同一个可用区或使用集群置放群组时,您可以减少数据包从一个端点传输到另一个端点所需的跃点数。
-
使用 未跟踪的连接。
-
对网络流量使用 UDP 协议。
-
对于聚合带宽为 100Gbps 或更高的 EC2 实例,请将工作负载分配到 100 个或更多的单个流中,以将工作均匀分布到 Nitro 卡上。
监控 Linux 实例的性能
您可以在 Linux 实例上使用 Ethtool 指标,监控带宽、数据包速率和连接跟踪等实例网络性能指标。有关更多信息,请参阅 监控 EC2 实例上 ENA 设置的网络性能。