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

上次更新时间:2020 年 9 月 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 实例类型矩阵。有关更多信息,请参阅在置放群组中启动实例
  • 该实例是突发性能实例(T3、T3a 和 T2 实例)。 当突发实例性能低于其网络吞吐量性能基线时,将产生 CPU 积分。这些积分可使突发性能实例临时爆增到其网络吞吐量基线之上。有关更多信息,请参阅可突增性能实例

由于前述因素,不同云环境之间的网络性能可能有显著的差异。一项最佳实践是定期评估环境的网络性能并确立基线,从而提高应用程序的性能。测试网络性能可提供宝贵意见,从而确定最适合您的需求的 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.    将第二个实例配置为客户端,使用所需参数,对服务器运行测试。例如,下面的命令会使用两个并行连接对指定服务器实例启动 TCP 测试:

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

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

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

------------------------------------------------------------
Client connecting to 172.31.1.152, TCP port 5001
TCP window size: 4.00 MByte (default)
------------------------------------------------------------
[ 3] local 172.31.8.116 port 43582 connected with 172.31.1.152 port 5001
[ 4] local 172.31.8.116 port 43584 connected with 172.31.1.152 port 5001
[ ID] Interval Transfer Bandwidth
[ 4] 0.0- 1.0 sec 597 MBytes 5.01 Gbits/sec
[ 3] 0.0- 1.0 sec 598 MBytes 5.02 Gbits/sec
[SUM] 0.0- 1.0 sec 1.17 GBytes 10.0 Gbits/sec
[ 3] 1.0- 2.0 sec 597 MBytes 5.01 Gbits/sec
[ 3] 0.0- 2.0 sec 1.17 GBytes 5.01 Gbits/sec
[ 4] 1.0- 2.0 sec 596 MBytes 5.00 Gbits/sec
[SUM] 1.0- 2.0 sec 1.16 GBytes 10.0 Gbits/sec
[ 4] 0.0- 2.0 sec 1.17 GBytes 5.00 Gbits/sec
[SUM] 0.0- 2.0 sec 2.33 GBytes 10.0 Gbits/sec

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

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

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

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

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

2.    将第二个实例配置为客户端,然后使用所需参数对服务器运行测试。例如,以下命令启动对指定服务器实例的 UDP 测试,其中 -b 的参数设置为 5g,这是 c5n18xlarge 实例可以提供的最高网络性能。

#iperf -c 172.31.1.152 -u -b 5g

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

Output:
------------------------------------------------------------
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)
------------------------------------------------------------
[ 3] local 172.31.8.116 port 38942 connected with 172.31.1.152 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 5.70 GBytes 4.90 Gbits/sec
[ 3] Sent 4163756 datagrams
[ 3] Server Report:
[ 3] 0.0-10.0 sec 5.68 GBytes 4.88 Gbits/sec 0.002 ms 14124/4163756 (0.34%)