如何在同一 Amazon VPC 中的 Amazon EC2 Linux 实例之间进行网络吞吐量基准测试?

上次更新时间:2021 年 3 月 22 日

我想测量位于同一 Amazon Virtual Private Cloud (Amazon VPC) 中的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例之间的网络带宽。该如何操作?

简短描述

以下是当实例位于同一 Amazon VPC 中时,可能会影响 Amazon EC2 网络性能的一些因素:

  • EC2 实例的物理邻近度。 位于同一可用区的实例,在地理上相互最为接近。位于同一区域但在不同可用区的实例、位于同一大洲上不同区域的实例以及位于不同大洲上不同区域的实例,相互之间的距离越来越远。
  • EC2 实例最大传输单位 (MTU)。 网络连接的 MTU 是您的连接允许传输的最大数据包大小(以字节为单位)。所有的 EC2 实例类型均支持 1500 MTU。当前一代的所有 Amazon EC2 实例都支持巨型帧。此外,上一代实例、C3、G2、I2、M3 和 R3 也使用巨型帧。巨型帧允许 1500 MTU 以上的大小。但是,有些情况下,即使使用巨型帧,您的实例也仅限于 1500 MTU。有关更多信息,请参阅巨型帧 (9001 MTU)
  • EC2 实例的大小。 对于相同类型的实例,较大的实例通常能提供比较小的实例更好的网络性能。有关更多信息,请参阅 Amazon EC2 实例类型
  • Amazon EC2 增强了对 Linux 的联网支持,T2 和 M3 实例类型除外。有关更多信息,请参阅 Linux 上的增强联网。有关在您的实例上启用增强联网的信息,请参阅如何在我的 EC2 实例上启用并配置增强联网?
  • 使用置放群组的 Amazon EC2 高性能计算 (HPC) 支持。 HPC 提供完全等分的带宽和低延迟,最多支持 100Gb 网络速度,具体取决于实例类型。如要了解每个实例类型的网络性能,请参阅 Amazon Linux AMI 实例类型矩阵。有关更多信息,请参阅在置放群组中启动实例
  • 实例使用网络 I/O 积分机制来分配网络带宽。通用实例 - 网络性能中,网络性能列中带 符号的实例可以达到指定的最高网络性能。但是,这些实例使用网络 I/O 积分机制根据平均带宽利用率为实例分配带宽。因此,这些实例的网络性能会有所不同。

由于前述因素,不同云环境之间的网络性能可能有显著的差异。一项最佳实践是定期评估环境的网络性能并确立基线,从而提高应用程序的性能。测试网络性能可提供宝贵意见,从而确定最适合您的需求的 EC2 实例类型、大小和配置。您可以在您选择的任意实例组合上运行网络性能测试。

如果需要更多信息,请建立支持案例,并询问您感兴趣的特定实例类型的其他网络性能指标。

解决方法

在开始基准测试之前,先启动并配置您的 EC2 Linux 实例:

1.    启动两个 Linux 实例,以便用来运行网络性能测试。

2.    验证这些实例支持 Linux 增强联网,并且位于同一 Amazon VPC 中。

3.    (可选)如果要在不支持巨型帧的实例之间执行网络测试,请按照 EC2 实例的网络最大传输单位 (MTU) 中所述步骤操作,在您的实例上检查并设置 MTU。

4.    连接到实例以验证您是否可以访问这些实例。

在两个实例上安装 iperf 网络基准测试工具

在一些发行版本(如 Amazon Linux)中,iperf 是 Extra Packages for Enterprise Linux (EPEL) 存储库的一部分。要启用 EPEL 存储库,请参阅如何为运行 CentOS、RHEL 或 Amazon Linux 的 Amazon EC2 实例启用 EPEL 存储库?

注意:iperf 命令指的是版本 2.x。iperf3 命令指的是版本 3.x。在对具有高吞吐量的 EC2 实例进行基准测试时,请使用版本 2.x,因为版本 2.x 提供了多线程支持。尽管 3.x 版本也支持使用 -P 标志的并行流,但 3.x 版本是单线程的,并受单个 CPU 的限制。因此,3.x 版本需要并行运行多个进程,以便在较大的 EC2 实例上驱动必要的吞吐量。有关更多信息,请参阅 ESnet 网站上的 IPerf2/IPerf3

连接到您的 Linux 实例,然后运行以下命令以安装 iperf。

要在 RHEL 6 Linux 主机上安装 iperf,请运行以下命令:

# yum -y install  https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm  && yum -y install iperf

要在 RHEL 7 Linux 主机上安装 iperf,请运行以下命令:

# yum -y install  https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm  && yum -y install iperf

要在 Debian/Ubuntu 主机上安装 iperf,请运行以下命令:

# apt-get install -y iperf

要在 CentOS 6/7 主机上安装 iperf,请运行以下命令:

# yum -y install epel-release && yum -y install iperf

测试两个实例的 TCP 网络性能

默认情况下,iperf 在测试 TCP 性能时通过端口 5001 进行通信。不过,可以使用 -p 开关配置该端口。请确保将安全组配置为允许通过 iperf 使用的端口进行通信。

1.    将一个实例配置为服务器以侦听默认端口,或使用 -p 开关指定备用侦听器端口。将 5001 替换为您使用的端口(如果不同)。

$ sudo iperf -s [-p 5001]

2.    使用所需参数,将第二个实例配置为客户端,对服务器运行测试。例如 ,下面的命令将针对具有 40 个并行连接的指定服务器实例启动 TCP 测试:

# iperf -c 172.31.1.152 --parallel 40 -i 1 -t 2

注意:要使用 iperf(版本 2)进行双向测试,请在客户端一侧使用 -r 选项。

使用这些指定的 iperf 参数,输出将显示每个客户端流的间隔、每个客户端流传输的数据以及每个客户端流使用的带宽。以下 iperf 输出显示了两个 c5n.18xlarge EC2 Linux 实例的测试结果。在所有连接之间传输的总带宽为 92.2 Gb/秒:

------------------------------------------------------------------------------------
Client connecting to 172.31.1.152, TCP port 5001
TCP window size: 715 KByte (default)
------------------------------------------------------------------------------------
[ 39] local 172.31.8.116 port 54666 connected with 172.31.1.152 port 5001
[ 41] local 172.31.8.116 port 54670 connected with 172.31.1.152 port 5001
[ 33] local 172.31.8.116 port 54660 connected with 172.31.1.152 port 5001
[ 42] local 172.31.8.116 port 54672 connected with 172.31.1.152 port 5001
[ 38] local 172.31.8.116 port 54664 connected with 172.31.1.152 port 5001
[ 5] local 172.31.8.116 port 54598 connected with 172.31.1.152 port 5001
...
[SUM] 0.0- 2.0 sec 21.5 GBytes 92.2 Gbits/sec

测试两个实例之间的 UDP 网络性能

默认情况下,iperf 在测试 UDP 性能时通过端口 5001 进行通信。不过,您使用的端口可使用 -p 开关进行配置。请确保将安全组配置为允许通过 iperf 使用的端口进行通信。

注意:除非您指定了不同的带宽,否则 UDP 的默认值为 1Mbps。

1.    将一个实例配置为服务器以侦听默认 UDP 端口,或使用 -p 开关指定备用侦听器端口。将 5001 替换为您使用的端口(如果不同)。

$ sudo iperf -s -u [-p 5001]

2.    将第二个实例配置为客户端,然后使用所需参数对服务器运行测试。以下示例针对 -b 参数设置为 5g 的指定服务器实例启动 UDP 测试。

-b 参数将带宽从 UDP 默认值的每秒 1 Mb 更改为 5g。5g 是 c5n18xlarge 实例可为 VPC 内的单个传输流提供的最高网络性能。有关详细信息,请参阅提供 100 Gpbs 网络的新 C5n 实例

注意:UDP 是无连接的,不具备 TCP 所以使用的拥塞控制算法。使用 iperf 进行测试时,通过 UDP 获得的带宽可能低于通过 TCIP 获得的带宽

# iperf -c 172.31.1.152 -u -b 5g

输出显示了间隔(时间)、传输的数据量、实现的带宽、抖动(数据报周期性到达的时间偏差)以及丢失/总 UDP 数据报数:

------------------------------------------------------------------------------------
Client connecting to 172.31.1.152, UDP port 5001
Sending 1470 byte datagrams, IPG target: 2.35 us (kalman adjust)
UDP buffer size: 208 KByte (default)
------------------------------------------------------------------------------------
[ 41] local 172.31.8.116 port 49244 connected with 172.31.1.152 port 5001
[ 39] local 172.31.8.116 port 44429 connected with 172.31.1.152 port 5001
[ 40] local 172.31.8.116 port 43990 connected with 172.31.1.152 port 5001
[ 5] local 172.31.8.116 port 58342 connected with 172.31.1.152 port 5001
[ 32] local 172.31.8.116 port 34897 connected with 172.31.1.152 port 5001
[ 43] local 172.31.8.116 port 38864 connected with 172.31.1.152 port 5001
...
[SUM] 0.0-10.0 sec 106 GBytes 90.7 Gbits/sec
[SUM] Sent 77152959 datagrams
...
[ 19] Server Report:
[ 19] 0.0-10.2 sec 1.36 GBytes 1.14 Gbits/sec 15.614 ms 307228/1303368 (24%)
[ 19] 0.00-10.25 sec 18 datagrams received out-of-order
[ 17] Server Report:
[ 17] 0.0-10.2 sec 1.85 GBytes 1.55 Gbits/sec 15.423 ms 1155619/2510063 (46%)
[ 17] 0.00-10.25 sec 31 datagrams received out-of-order