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

4 分钟阅读
0

我尝试测量同一个 Amazon Virtual Private Cloud(Amazon VPC)中 Amazon Elastic Compute Cloud(Amazon EC2)Linux 实例之间的网络带宽。

简短描述

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

  • **EC2 实例物理上的近距离性:**同一可用区中的实例在地理位置上彼此最接近。在以下场景中,实例彼此之间的距离会逐渐变远:
    同一 AWS 区域中不同可用区域中的实例
    同一大洲不同地区的实例
    不同大洲不同地区的实例
  • **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 提供全二分带宽和低延迟。HPC 允许支持高达 100-gigabit 的网络速度,具体取决于实例类型。若要查看每种实例类型的网络性能,请参阅 Amazon Linux AMI 实例类型矩阵。有关详细信息,请参阅在置放群组中启动实例
  • 该实例使用网络 I/O 积分机制来分配网络带宽:通用实例 - 网络性能中,网络性能列中带 符号的实例可以达到指定的最高网络性能。但是,这些实例使用网络 I/O 积分机制根据平均带宽利用率为实例分配带宽。因此,这些实例的网络性能会有所不同。

由于这些因素,您可能会在不同的云环境中体验极大的网络性能差异。最佳做法是定期评估环境的网络性能并制定基准,以提高应用程序的性能。测试网络性能可以提供宝贵的见解,从而确定最适合您需求的 EC2 实例类型、大小和配置。您可以在所选实例的任意组合上进行网络性能测试。

若要了解更多信息,请打开 AWS 支持案例,并询问您感兴趣的特定实例类型的其他网络性能规范。

解决方法

在开始基准测试之前,启动并配置您的 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/archive/epel/6/x86_64/epel-release-6-8.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

Amazon Linux 2023

由于 Amazon Linux 2023(AL2023)不支持 EPEL,因此您无法通过 EPEL 存储库下载 iperf 实用程序。有关详细信息,请参阅 Extra Packages for Enterprise Linux(EPEL)

但是,你可以手动下载并安装适用于 AL2023 的 iperf:

  1. 安装开发工具和 git:

    sudo yum groupinstall "Development Tools"sudo yum install git
  2. 克隆 iperf 代码:

    cd /usr/local/sudo git clone https://git.code.sf.net/p/iperf2/code iperf2-code
  3. 创建并安装软件包:

    cd /usr/local/iperf2-codesudo ./configure
    sudo make
    sudo make install

测试实例之间的 TCP 网络性能

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

  1. 将一个实例配置为服务器以在默认端口上进行侦听,或者使用 -p 开关指定备用侦听器端口。如有不同,请将 5001 替换为您的端口:

    $ sudo iperf -s \[-p 5001\]
  2. 将第二个实例配置为客户端,然后使用所需参数对服务器运行测试。例如,以下命令对具有 40 个并行连接的指定服务器实例启动 TCP 测试:

    $ iperf -c 172.31.30.41 --parallel 40 -i 1 -t 2

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

输出使用这些参数来显示每个客户端流的时间间隔、每个客户端流传输的数据以及每个客户端流使用的带宽。以下 iperf 输出显示了在集群置放群组中启动的两个 c5n.18xlarge EC2 Linux 实例的测试结果。所有连接的总传输带宽为 97.6 Gbits/秒:

------------------------------------------------------------------------------------
Client connecting to 172.31.30.41, TCP port 5001
TCP window size:  975 KByte (default)
------------------------------------------------------------------------------------
[  8] local 172.31.20.27 port 49498 connected with 172.31.30.41 port 5001
[ 38] local 172.31.20.27 port 49560 connected with 172.31.30.41 port 5001
[ 33] local 172.31.20.27 port 49548 connected with 172.31.30.41 port 5001
[ 40] local 172.31.20.27 port 49558 connected with 172.31.30.41 port 5001
[ 36] local 172.31.20.27 port 49554 connected with 172.31.30.41 port 5001
[ 39] local 172.31.20.27 port 49562 connected with 172.31.30.41 port 5001
...
[SUM]  0.0- 2.0 sec  22.8 GBytes  97.6 Gbits/sec

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

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

**注意:**除非您指定不同的带宽,否则 UDP 的默认值为每秒 1 Mbit。

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

    $ sudo iperf -s -u \[-p 5001\]
  2. 将第二个实例配置为客户端,之后使用所需参数对接收器进行测试。以下示例针对 -b 参数设置为 5g 的指定服务器实例启动 UDP 测试。-b 参数将带宽从 UDP 的默认值每秒 1 Mbit 更改为 5g。5g 是 c5n18xlarge 实例可以为 VPC 内的单个流量提供的最大网络性能
    **注意:**UDP 是无连接的,没有 TCP 所拥有的拥塞控制算法。使用 iperf 进行测试时,使用 UDP 获得的带宽可能低于使用 TCIP 获得的带宽。

    \# iperf -c 172.31.1.152 -u -b 5g

以下是 UDP 测试的输出示例:

$ iperf -c 172.31.30.41 -u -b 5g
------------------------------------------------------------------------------------
Client connecting to 172.31.30.41, UDP port 5001
Sending 1470 byte datagrams, IPG target: 2.35 us (kalman adjust)
UDP buffer size:  208 KByte (default)
------------------------------------------------------------------------------------
[  3] local 172.31.20.27 port 39022 connected with 172.31.30.41 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3] 0.0-10.0 sec  5.82 GBytes  5.00 Gbits/sec
[  3] Sent 4251700 datagrams
[  3] Server Report:
[  3] 0.0-10.0 sec  5.82 GBytes  5.00 Gbits/sec   0.003 ms 1911/4251700 (0.045%)
[  3] 0.00-10.00 sec  1 datagrams received out-of-order

此输出显示以下值:

  • 间隔(时间)
  • 传输的数据量
  • 实现的带宽
  • 抖动(数据图定期到达的时间偏差)
  • UDP 数据报的丢失和总数

相关信息

[在 ESNet 网站上使用 iperf3 进行](https://fasterdata.es.net/performance-testing/network-troubleshooting-tools/iperf/disk-testing-using-iperf/)磁盘测试

在 ESNet 网站上进行网络调整

ESNet 网站上的吞吐量工具比较

SourceForge 网站上的 iperf2

AWS 官方
AWS 官方已更新 2 年前