计算通过互连的网络吞吐量

本教程介绍如何计算 Google Cloud 中以及使用 Cloud Interconnect 连接的本地或第三方云位置的网络吞吐量。本文档介绍如何分析结果,列出可能会影响网络性能的变量,并提供一些问题排查提示。

限制和注意事项

  • Cloud Interconnect 存在一些限制。如需了解详情,请参阅 Cloud Interconnect 配额
  • NIC 限制:Google Cloud 会考虑每个虚拟机 (VM) 实例的带宽,而不是每个网络接口 (NIC) 或 IP 地址的带宽。虚拟机的机器类型定义了其最大出站流量速率;不过,只能在特定情况下达到该速率。如需了解每种机器类型的 vCPU 数量,请参阅此表格
  • 路径中的其他设备(防火墙、带有小缓冲区的交换机和其他供应商的设备)及其限制适用。执行以下任务以缓解这些限制。

    • 收集有关防火墙和路径中的交换机的网络统计信息。
    • 对于 Cloud Interconnect 测试,请在本地主机和 Google 边缘设备之间绕过尽可能多的设备。
    • 识别并验证本地网络和 Google Cloud 虚拟机之间路径中的所有设备(如果它们可能是吞吐量问题的根源)。

测量网络吞吐量的工具概览

本教程演示了如何使用以下工具计算网络吞吐量:

  • iPerf3:一款网络测试工具,可以创建 TCP/UDP 数据流(单线程或多线程)并测量传输这些流量的网络的吞吐量。

    注意:建议仅对单 CPU 机器使用 iPerf3。

  • Netperf:类似于 iPerf3 的工具,但适用于在单个 CPU 上受 CPU 限制的多 CPU 实例的吞吐量测试。

  • tcpdump:一个命令行数据包分析器,用于捕获数据包详细信息和 TCP/IP 通信以进行更高级的问题排查。tcpdump 工具与其他工具(例如 Wireshark)兼容。

  • Netstat:命令行网络实用程序,用于显示传输控制协议(传入和传出)、路由表和多个网络接口(网络接口控制器或软件定义的网络接口)的网络连接,以及网络协议统计信息。

  • mtr:一个网络诊断工具,可执行 traceroute 和 ping 功能。它通过限制单个数据包可能经过的跃点数来探测路由路径上的路由器,并监听数据包过期的响应。

使用 iPerf3 测量吞吐量

按照此过程测量单个虚拟机实例的吞吐量。

选择大型机器类型

如需执行吞吐量测试,请使用大型机器类型,例如 n1-standard-8。此机器类型提供 16 Gbps 的出站流量吞吐量上限,因此每个虚拟机的出站流量吞吐量不会干扰测试。

安装工具

在 Linux 虚拟机实例上安装 iPerf3、mtr、netstat 和 tcpdump

对于基于 Debian 的发行版,请运行以下命令:

    sudo apt-get update
    sudo apt-get install iperf3 tcpdump mtr netstat

对于基于 Redhat 的发行版,请运行以下命令:

    yum update
    yum install iperf3 tcpdump mtr netstat

安装 netperf

对于基于 Debian 的发行版,请运行以下命令:

    sudo apt-get install git build-essential autoconf texinfo -y
    git clone https://github.com/HewlettPackard/netperf.git
    cd netperf
    ./autogen.sh
    ./configure --enable-histogram --enable-demo=yes
    make
    cp src/netserver ~/.local/bin
    cp src/netperf ~/.local/bin

对于基于 Redhat 的发行版,请运行以下命令:

    sudo yum install git build-essential autoconf texinfo -y
    git clone https://github.com/HewlettPackard/netperf.git
    cd netperf
    ./autogen.sh
    ./configure --enable-histogram --enable-demo=yes
    make
    cp src/netserver ~/.local/bin
    cp src/netperf ~/.local/bin

运行前提测试

  1. 确保 VLAN 连接大小配置正确。如需了解详情,请参阅修改 VLAN 连接
  2. 在连接的两端(每个终端)上,运行 tophtop 命令以监控 CPU 使用率。
  3. 在运行任何测试之前,请使用 netstat 命令收集网络统计信息。

    netstat -s >> netstat.log
    
  4. 在另一个终端中,在任何捕获之前使用 snaplen 参数值 128 运行 tcpdump 命令。

    在两个端点上运行此命令。

    sudo /usr/sbin/tcpdump -s 128 -i [DEVICE_INTERFACE] host [IP_ADDRESS of remote side] -w mycap.pcap
    
  5. 获取来源主机和目的地主机上的读写内存大小。

    $ sysctl net.ipv4.tcp_rmem
    $ sysctl net.ipv4.tcp_wmem
    $ sysctl net.core.rmem_max
    $ sysctl net.core.rmem_default
    $ net.core.wmem_max
    $ net.core.wmem_default
    $ uname -r
    $ cat /etc/os-release
    

运行 iperf3 测试

由于每个流的限制为 3 Gbps,建议您运行 iperf3 测试的多个并行流。建议您最少运行四次测试、最多运行十次测试,以补偿带宽限制并获取有用的结果。

  1. 在另一个终端中,在连接的一端(虚拟机或本地机器)运行 iperf3 服务器。多个数据流需要多个 iperf3 服务器。

  2. 运行带有 udp 标志的 iPerf3 工具以进行 Cloud Interconnect 测试。如果使用 UDP 达到了所需的吞吐量,则需要执行进一步问题排查步骤。

  3. 如需从命令行中运行多个 iperf3 服务器,请运行以下命令:

    $ iperf3 -s -p 5101&; iperf3 -s -t 30 -p 5102&; iperf3 -s  -p 5103 &
    
  4. 使用下面的 bash 脚本运行多个 iperf3 服务器:

    #!/bin/bash
    #start iperf3 server running in background
    
    for i in `seq 0 9`;
    do
            iperf3 -s  -B 10.0.100.35 -t 30 -u -p 521$i &
    done
    

iperf3 client 默认运行 10 秒,可能不足以让 TCP 达到最大吞吐量。将 DURATION 值设置为至少 30 秒,以取得更可靠的结果。

    iperf3 -c [server IP address] -P [THREADS] -t [DURATION]

用于运行多个 iperf3 UDP 流的 Bash 脚本

echo "UDP iperf test - 10 streams"
for i in `seq 0 9`;
do
       iperf3 -B 10.0.100.35 -c 192.168.50.3 --logfile ~/gcpvm_client-521$i.log -u -b 1G  -l 1390 -t10 -p 521$i    &

done

用于运行多个 iperf3 TCP 流的 Bash 脚本

echo "UDP iperf test - 10 streams"
for i in `seq 0 9`;
do
       iperf3 -B 10.0.100.35 -c 192.168.50.3 --logfile ~/gcpvm_client-521$i.log -b 1G  -l 1390 -t10 -p 521$i    &

done

iperf3 测试正在运行时,监控两台设备上的 CPU 负载。如果 CPU 负载接近 100%,则 CPU 是某个 iperf3 线程的瓶颈。在这种情况下,请使用 Netperf 工具,因为它支持多个 CPU。

如果您无法运行 Netperf,则可以同时在不同终端和不同端口上启动多个 iPerf3 服务器和客户端。

分析测试结果

执行以下步骤。

  1. 检查 iperf3 客户端结果以了解带宽和丢包情况。
  2. 检查 iperf3 服务器结果中是否存在任何无序数据包。
  3. 执行数据包捕获分析。运行以下命令,将 pcap 文件转换为文本文件。

    tcpdump -A -[PCAP-FILENAME].pcap > [TXT-FILENAME].txt
    
  4. 运行以下命令以获取数据包和无序数据包总数。

    grep -e "Total" -A1 pcap [TXT-FILENAME]
    

    输出如下所示:

    gcpvm-send-5210.txt:Total UDP packets: 874032
    gcpvm-send-5210.txt:Total out-of-order packets: 0, missing packets: 0
    gcpvm-send-5211.txt:Total UDP packets: 791218
    gcpvm-send-5211.txt:Total out-of-order packets: 0, missing packets: 0
    gcpvm-send-5212.txt:Total UDP packets: 961510
    gcpvm-send-5212.txt:Total out-of-order packets: 0, missing packets: 0
    gcpvm-send-5213.txt:Total UDP packets: 961517
    gcpvm-send-5213.txt:Total out-of-order packets: 0, missing packets: 0
    gcpvm-send-5214.txt:Total UDP packets: 961501
    gcpvm-send-5214.txt:Total out-of-order packets: 0, missing packets: 0
    gcpvm-send-5215.txt:Total UDP packets: 961521
    gcpvm-send-5215.txt:Total out-of-order packets: 0, missing packets: 0
    gcpvm-send-5216.txt:Total UDP packets: 889932
    gcpvm-send-5216.txt:Total out-of-order packets: 0, missing packets: 0
    gcpvm-send-5217.txt:Total UDP packets: 961483
    gcpvm-send-5217.txt:Total out-of-order packets: 0, missing packets: 0
    gcpvm-send-5218.txt:Total UDP packets: 961479
    gcpvm-send-5218.txt:Total out-of-order packets: 0, missing packets: 0
    gcpvm-send-5219.txt:Total UDP packets: 961518
    gcpvm-send-5219.txt:Total out-of-order packets: 0, missing packets: 0
    

    下面的分析显示性能测试期间的丢包率:

    $ grep -e "Total" -A1 onPrem-send-*.txt
    

    输出如下所示:

    "Total" -A1 onPrem-send-*.txt
    onPrem-send-5210.txt:Total UDP packets: 858698
    onPrem-send-5210.txt:Total out-of-order packets: 0, missing packets: 5408
    --
    onPrem-send-5211.txt:Total UDP packets: 857667
    onPrem-send-5211.txt:Total out-of-order packets: 0, missing packets: 4929
    --
    onPrem-send-5212.txt:Total UDP packets: 857126
    onPrem-send-5212.txt:Total out-of-order packets: 0, missing packets: 5349
    --
    onPrem-send-5213.txt:Total UDP packets: 857424
    onPrem-send-5213.txt:Total out-of-order packets: 0, missing packets: 5495
    --
    onPrem-send-5214.txt:Total UDP packets: 857139
    onPrem-send-5214.txt:Total out-of-order packets: 0, missing packets: 4692
    --
    onPrem-send-5215.txt:Total UDP packets: 857175
    onPrem-send-5215.txt:Total out-of-order packets: 0, missing packets: 4789
    --
    onPrem-send-5216.txt:Total UDP packets: 857104
    onPrem-send-5216.txt:Total out-of-order packets: 0, missing packets: 5196
    --
    onPrem-send-5217.txt:Total UDP packets: 857122
    onPrem-send-5217.txt:Total out-of-order packets: 0, missing packets: 5423
    --
    onPrem-send-5218.txt:Total UDP packets: 857383
    onPrem-send-5218.txt:Total out-of-order packets: 0, missing packets: 5283
    --
    onPrem-send-5219.txt:Total UDP packets: 857313
    onPrem-send-5219.txt:Total out-of-order packets: 0, missing packets: 4934
    
  5. 访问设备页面以检查端口吞吐量。

  6. 如果 netstat 输出显示读写错误,则可能需要调整 TCP/UDP 大量数据流。

  7. 如果存在无序数据包,则应在 VPN 网关中执行数据包捕获,以进行进一步的分析。如需详细了解如何在 VPN 网关中执行数据包捕获,请创建支持案例

  8. 如果 iperf3 UDP 测试实现了所需的吞吐量,则问题一定出在其他环节,并且可能需要调整 TCP。