网络性能测试方法

网络PPS(每秒传输数据包数)、网络带宽(数据传输速度)和网络时延(数据从发送端发出到接收端接收到所需的时间)是衡量云服务器网络性能的重要指标,测试网络性能可以帮助您评估网络的稳定性、延迟和吞吐量,从而为您提供更好的用户体验和应用程序性能。本文为您介绍如何使用Netperf、sockperf等工具测试ECS实例的网络PPS、网络带宽和网络时延,您可以根据测试结果评估ECS实例的网络性能。

重要
  • 强烈建议您在新购买的无数据的ECS实例上使用工具测试网络性能,避免造成数据丢失。

  • 实例规格指标均在测试数据环境下验证获得。在真实场景中,受实例负载、组网模型等其他因素的影响,实例的性能表现可能存在差异,请您以实际情况为准。

准备测试环境

环境要求

  • 准备测试网络PPS、带宽和时延等不同测试场景的ECS实例。创建实例的操作,请参见自定义购买实例

    重要

    在测试网络性能时,强烈建议您使用相同规格的实例来确保测试结果的准确性和可比性,避免不同实例规格的vCPU核数、内存大小、网络带宽等其他因素对测试结果产生影响。

  • 在同一测试场景下,所有ECS实例必须属于同一个VPC、同一台交换机和同一个安全组。

环境示例

本文测试网络性能使用的测试机(ECS实例)和辅助测试机(ECS实例)的实例规格及数量如下所示。在实际测试过程中,请您根据实际环境选择两台机器进行测试。

  • 测试ECS实例的网络PPS(仅适用于Linux)

    说明

    由于目前Windows没有较好的网络PPS测试工具,所以暂不提供Windows的网络PPS测试方法。

    网络PPS小于600

    测试示例

    测试机

    辅助测试机

    实例规格

    ecs.g7.large

    ecs.g7.large

    镜像

    Alibaba Cloud Linux 3

    Alibaba Cloud Linux 3

    实例数量

    1

    1

    网络

    分配公网IP地址

    网络PPS大于600万小于2000

    测试示例

    测试机

    辅助测试机

    实例规格

    ecs.g7.16xlarge

    ecs.g7.16xlarge

    镜像

    Alibaba Cloud Linux 3

    Alibaba Cloud Linux 3

    实例数量

    1

    3

    网络

    分配公网IP地址

    网络PPS大于2000

    测试示例

    测试机

    辅助测试机

    实例规格

    ecs.g7.32xlarge

    ecs.g7.32xlarge

    镜像

    Alibaba Cloud Linux 3

    Alibaba Cloud Linux 3

    实例数量

    1

    3

    网络

    分配公网IP地址

  • 测试ECS实例的网络带宽和网络时延

    Linux实例

    测试示例

    测试机

    辅助测试机

    实例规格

    ecs.g7.large

    ecs.g7.large

    镜像

    Alibaba Cloud Linux 3

    Alibaba Cloud Linux 3

    实例数量

    1

    1

    网络

    分配公网IP地址

    Windows实例

    测试示例

    测试机

    辅助测试机

    实例规格

    ecs.g7.large

    ecs.g7.large

    镜像

    Windows Server 2022

    Windows Server 2022

    实例数量

    1

    1

    网络

    分配公网IP地址

测试网络性能

测试网络PPS(仅适用于Linux)

说明

由于目前Windows没有较好的PPS测试工具,所以暂不提供Windows的网络PPS测试方法。

网络PPS小于600

  1. 分别远程连接测试机和辅助测试机。

  2. 分别在测试机和辅助测试机上执行以下命令,下载Netperf。

    wget https://benchmark-packages.oss-cn-qingdao.aliyuncs.com/netperf-2.7.0.tar.gz
  3. 分别在测试机和辅助测试机上执行以下命令,安装Netperfsar监控工具。

    1. 执行以下命令,解压Netperf包。

      sudo yum install -y gcc autoconf automake libtool sysstat
      tar -zxvf netperf-2.7.0.tar.gz
    2. 执行以下命令,查询gcc版本号。

      gcc -v 2>&1
    3. 若测试机和辅助测试机安装的gcc版本高于10版本,则您需要继续执行下述操作,以确保gcc可以正常编译。否则,请忽略此步骤。

      1. 执行以下命令,修改nettest_omni.c文件。

        cd netperf
        vim src/nettest_omni.c
      2. i键进入编辑模式,手动删除nettest_omni.c文件中的声明变量内容。

        声明变量内容如下所示:

        /* different options for the sockets        */
        
        int
          loc_nodelay,    /* don't/do use NODELAY  locally    */
          rem_nodelay,    /* don't/do use NODELAY remotely  */
          loc_sndavoid,    /* avoid send copies locally    */
          loc_rcvavoid,    /* avoid recv copies locally    */
          rem_sndavoid,    /* avoid send copies remotely    */
          rem_rcvavoid;   /* avoid recv_copies remotely    */
      3. 修改完成后按Esc键,输入:wq后按下回车键,保存并退出。

    4. 执行以下命令,安装Netperfsar监控工具。

      cd netperf
      sudo ./configure
      sudo make && sudo make install
  4. 在测试机上执行以下命令,启动64netserver服务。

    #!/bin/bash
    for j in `seq 64`; do
        netserver -p $[16000+j] > server_$[16000+j].netperf > /dev/null 2>&1  &
    done
  5. 在测试机上执行以下命令,查询测试机的私网IP地址。

    ifconfig || ip addr

    image.png

  6. 在辅助测试机上执行以下命令,向测试机输入流量。

    #!/bin/bash
    server_ip=<测试机私网IP地址>
    for j in `seq 64`; do
        port=$[16000+j]
        netperf -H ${server_ip} -l ${run_time:-300} -t UDP_STREAM  -p $port  -- -m 1 -D > /dev/null 2>&1 &
    done

    <测试机私网IP地址>需替换为上一步查询的实际测试机的私网IP地址,示例如下图所示。

    image.png

  7. 在测试机上执行以下命令,测试网络PPS。

    sar -n DEV 1

    在测试结果中查看rxpck/s列的数据值,rxpck/s表示该测试机每秒钟接收的数据包总数。如下图所示,示例中测试机每秒钟接收到的数据包平均数约为94万。

    image.png

网络PPS大于600万小于2000

  1. 分别远程连接测试机和辅助测试机。

  2. 分别在3台辅助测试机和1台测试机上执行以下命令,安装sockperf。

    sudo yum install -y autoconf automake libtool gcc-c++
    cd /opt
    sudo wget https://github.com/Mellanox/sockperf/archive/refs/tags/3.8.tar.gz
    sudo tar -zxf 3.8.tar.gz
    cd sockperf-3.8/
    sudo ./autogen.sh
    sudo ./configure
    sudo make -j `cat /proc/cpuinfo| grep process | wc -l`
    sudo make install
  3. 在测试机上执行以下命令,查询测试机的私网IP地址。

    ifconfig || ip addr

    image.png

  4. 分别在3台辅助测试机上执行以下命令,向测试机输入流量。

    server_ip="<测试机私网IP地址>"
    threads=64
    msg_size=14
    run_time=60
    
    basePort=6666
    for((i=0;i<$threads;++i));do
        nohup sockperf tp -i $server_ip --pps max -m ${msg_size} -t ${run_time} --port $[${basePort}+${i}] 2>&1 &
    done

    其中<测试机私网IP地址>是实际测试机的私网IP地址,run_time是输入流量的时间,请您根据实际情况修改。

  5. 分别在3台辅助测试机和1台测试机上执行以下命令,测试网络流量。

    sar -n DEV 1

    在测试机上查看rxpck/s列的数据值,rxpck/s表示该测试机每秒钟接收到的数据包。如下图所示,示例中测试机每秒钟接收到的数据包数约为1200万。接收数据包

网络PPS大于2000

  1. 分别远程连接测试机和辅助测试机。

  2. 分别在3台辅助测试机和1台测试机上执行以下命令,安装sockperf。

    sudo yum install -y autoconf automake libtool gcc-c++
    cd /opt
    sudo wget https://github.com/Mellanox/sockperf/archive/refs/tags/3.8.tar.gz
    sudo tar -zxf 3.8.tar.gz
    cd sockperf-3.8/
    sudo ./autogen.sh
    sudo ./configure
    sudo make -j `cat /proc/cpuinfo| grep process | wc -l`
    sudo make install
  3. 在测试机上执行以下命令,绑定中断。

    在高PPS场景下,通过将中断绑定到特定的CPU核心,可以确保处理中断的CPU核心相对固定,减少上下文切换,提高处理效率。

    a=$(cat /proc/interrupts | grep virtio2-input | awk -F ':' '{print $1}')
    cpu=0
    for irq in $a; do
        echo $cpu >/proc/irq/$irq/smp_affinity_list
        let cpu+=2
    done
  4. 在测试机上执行以下命令,查询测试机的私网IP地址。

    ifconfig || ip addr

    image.png

  5. 分别在3台辅助测试机上执行以下命令,向测试机输入流量。

    server_ip="<测试机私网IP地址>"
    threads=64
    msg_size=14
    run_time=60
    
    basePort=6666
    for((i=0;i<$threads;++i));do
        nohup sockperf tp -i $server_ip --pps max -m ${msg_size} -t ${run_time} --port $[${basePort}+${i}] 2>&1 &
    done

    其中<测试机私网IP地址>是实际测试机的私网IP地址,run_time是输入流量的时间,请您根据实际情况修改。

  6. 分别在3台辅助测试机和1台测试机上执行以下命令,测试网络流量。

    sar -n DEV 1

    在测试机上查看rxpck/s列的数据值,rxpck/s表示该测试机每秒钟接收到的数据包。如下图所示,示例中测试机每秒钟接收到的数据包数约为2000万。2400万PPS

测试网络带宽

Linux实例

  1. 分别远程连接测试机和辅助测试机。

  2. 分别在测试机和辅助测试机上执行以下命令,下载Netperf。

    wget https://benchmark-packages.oss-cn-qingdao.aliyuncs.com/netperf-2.7.0.tar.gz
  3. 分别在测试机和辅助测试机上执行以下命令,安装Netperfsar监控工具。

    1. 执行以下命令,解压Netperf包。

      sudo yum install -y gcc autoconf automake libtool sysstat
      tar -zxvf netperf-2.7.0.tar.gz
    2. 执行以下命令,查询gcc版本号。

      gcc -v 2>&1
    3. 若测试机和辅助测试机安装的gcc版本高于10版本,则您需要继续执行下述操作,以确保gcc可以正常编译。否则,请忽略此步骤。

      1. 执行以下命令,修改nettest_omni.c文件。

        cd netperf
        vim src/nettest_omni.c
      2. i键进入编辑模式,手动删除nettest_omni.c文件中的声明变量内容。

        声明变量内容如下所示:

        /* different options for the sockets        */
        
        int
          loc_nodelay,    /* don't/do use NODELAY  locally    */
          rem_nodelay,    /* don't/do use NODELAY remotely  */
          loc_sndavoid,    /* avoid send copies locally    */
          loc_rcvavoid,    /* avoid recv copies locally    */
          rem_sndavoid,    /* avoid send copies remotely    */
          rem_rcvavoid;   /* avoid recv_copies remotely    */
      3. 修改完成后按Esc键,输入:wq后按下回车键,保存并退出。

    4. 执行以下命令,安装Netperfsar监控工具。

      cd netperf
      sudo ./configure
      sudo make && sudo make install
  4. 在测试机上执行以下命令,启动64netserver服务。

    #!/bin/bash
    for j in `seq 64`; do
        netserver -p $[16000+j] > server_$[16000+j].netperf > /dev/null 2>&1  &
    done
  5. 在测试机上执行以下命令,查询测试机的私网IP地址。

    ifconfig || ip addr

    image.png

  6. 在辅助测试机上执行以下命令,向测试机输入流量。

    #!/bin/bash
    server_ip=<测试机私网IP地址>
    for j in `seq 64`; do
        port=$[16000+j]
        netperf -H ${server_ip} -l ${run_time:-300} -t TCP_STREAM -p $port -- -D > /dev/null 2>&1 & 
    done

    <测试机私网IP地址>需替换为上一步查询的实际测试机的私网IP地址,示例如下图所示。

    image.png

  7. 在测试机上执行以下命令,测试网络带宽。

    sar -n DEV 1

    在测试结果中查看rxkB/s列的数据值,rxkB/s表示该测试机每秒钟接收的数据包的大小,单位为KB/s(千字节/每秒)。1字节等于8比特,若要计算对应的带宽值,则可将rxkB/s列对应的数值乘以8,从而将其转换为Kbps(千比特/每秒)。

    示例如下图所示。image.png

Windows实例

  1. 分别远程连接测试机和辅助测试机。

    具体操作,请参见使用Workbench工具以RDP协议登录Windows实例

  2. 分别在测试机和辅助测试机中安装测试工具并关闭防火墙。

    1. 下载ntttcp.exe工具,并获取存放路径。

    2. 打开运行对话框,输入powershell进入PowerShell命令行。

    3. 运行以下命令,关闭防火墙,避免防火墙可能阻止两台机器的连接。

      Set-NetFirewallProfile -Profile * -Enabled:false

      或者增加入方向规则以允许ntttcp.exe数据包通过防火墙。

      $ntttcpPath = "<ntttcp.exe实际路径>"
      New-NetFirewallRule -DisplayName ntttcp -Protocol Any -Direction Inbound -Action Allow -Enabled True -Profile Any -Program $ntttcpPath
      说明

      您需要根据实际环境替换测试机的<ntttcp.exe实际路径>

  3. 在测试机中运行以下命令,设置网卡RSS功能。

    RSS(Receive Side Scaling)网络技术旨在通过将数据包分布到多个CPU核心上的接收队列来提高网络性能和效率,从而实现网络处理的并行化。以下命令表示:

    • 如果测试机的CPU数量不超过16,将RSS接收队列的数量设置为与CPU数量相等,这样可以确保每个CPU核心都有独立的接收队列来处理网络流量。

    • 如果测试机的CPU数量超过16,关闭RSS功能。因为很多网卡限制了RSS队列的最大数量为16,如果继续使用RSS可能导致资源分配不均或管理复杂性增加。

    $cpuNum = (Get-CimInstance -ClassName Win32_Processor).NumberOfLogicalProcessors
    if ($cpuNum -le 16) {
      Set-NetAdapterRss -Name <测试机网络适配器的名称> -NumberOfReceiveQueues $cpuNum
    } else {
      Disable-NetAdapterRss -Name <测试机网络适配器的名称>
    }
    说明
    • 您需要根据环境替换<测试机网络适配器的名称>(可通过Get-NetAdapter | Select-Object Name命令获取)。

    • 修改网卡的RSS配置通常需要重启网卡服务,可能会导致当前通过该网卡的网络连接暂时中断,请您在连接恢复后再进行后续操作。

  4. 在测试机中执行以下命令,准备接收数据。

    $serverIp = (Get-NetIPConfiguration -InterfaceAlias <测试机网络适配器的名称>).IPv4Address.IPAddress
    $cpuNum = (Get-CimInstance -ClassName Win32_Processor).NumberOfLogicalProcessors
    $threadNum = $cpuNum
    & <测试机ntttcp.exe实际路径> -r -m $threadNum,*,$serverIp -t 300
    说明

    您需要根据环境替换<测试机网络适配器的名称><测试机ntttcp.exe实际路径>

  5. 在辅助测试机中执行以下命令,发送数据。

    $serverIp = "<测试机私网IP地址>"
    $threadNum = "<测试机threadNum>"
    <辅助测试机ntttcp.exe实际路径> -s -m $threadNum,*,$serverIp -t 100
    说明

    您需要根据环境替换<测试机私网IP地址>(可通过ipconfig命令获取)、<测试机threadNum>(可通过$cpuNum命令获取)和<辅助测试机ntttcp.exe实际路径>

  6. 在测试机中查看测试的网络带宽。

    测试示例如下图所示,Throughput(MB/s)值表示网络带宽(数据传输速度)。

    image

测试网络时延

Linux实例

  1. 分别远程连接测试机和辅助测试机。

  2. 分别在测试机和辅助测试机上执行以下命令,安装sockperf

    sudo yum install -y autoconf automake libtool gcc-c++
    cd /opt
    sudo wget https://github.com/Mellanox/sockperf/archive/refs/tags/3.8.tar.gz
    sudo tar -zxf 3.8.tar.gz
    cd sockperf-3.8/
    sudo ./autogen.sh
    sudo ./configure
    sudo make -j `cat /proc/cpuinfo| grep process | wc -l`
    sudo make install
  3. 在测试机上执行以下命令,查询测试机的私网IP地址。

    ifconfig || ip addr

    image.png

  4. 在测试机上执行以下命令,启动服务。

    sockperf sr --tcp --daemonize
  5. 在辅助测试机上执行以下命令,向测试机输入流量。

    sockperf pp -i <测试机私网IP地址> --tcp -t 30 -m 14 --full-log=result.json

    <测试机私网IP地址>需替换为上一步查询的实际测试机的私网IP地址。

  6. 在测试机中查看测试的网络时延。

    测试示例如下图所示:

    • avg-latency开头的结果数据表示平均时延,单位为us。

    • percentile 99.000开头的结果数据表示99分位时延,单位为μs。

    image.png

Windows实例

  1. 分别远程连接测试机和辅助测试机。

    具体操作,请参见使用Workbench工具以RDP协议登录Windows实例

  2. 分别在测试机和辅助测试机中安装测试工具并关闭防火墙。

    1. 下载latte.exe工具,并获取存放路径。

    2. 打开运行对话框,输入powershell进入PowerShell命令行。

    3. 运行以下命令,关闭防火墙,避免防火墙可能阻止两台机器的连接。

      Set-NetFirewallProfile -Profile * -Enabled:false

      或者增加入方向规则以允许latte.exe数据包通过防火墙。

      $lattePath = "<latte.exe实际路径>"
      New-NetFirewallRule -DisplayName Latte -Protocol Any -Direction Inbound -Action Allow -Enabled True -Profile Any -Program $lattePath
      说明

      您需要根据实际环境替换测试机的<latte.exe实际路径>

  3. 在测试机中执行以下命令,准备接收数据。

    $serverIp = (Get-NetIPConfiguration | Where-Object {$_.InterfaceAlias -eq '<测试机网络适配器的名称>'} | Select-Object -ExpandProperty IPv4Address).IPAddress
    $port = <通信端口>
    & "<测试机latte.exe实际路径>" -a "$serverIp`:$port" -i 65535
    说明
    • 您需要根据环境替换<测试机网络适配器的名称>(可通过Get-NetAdapter | Select-Object Name命令获取)和<测试机latte.exe实际路径>

    • <通信端口>由您自定义,但是必须确保测试机和辅助测试机两端的端口号一致。

  4. 在辅助测试机中执行以下命令,发送数据。

    $serverIp = "<测试机私网IP地址>"
    $port = <通信端口>
    & "<辅助测试机latte.exe实际路径>" -c -a "${serverIp}:$port" -i 65535
    说明
    • 您需要根据环境替换<测试机私网IP地址>(可通过ipconfig命令获取)、<辅助测试机latte.exe实际路径>

    • <通信端口>由您自定义,但是必须确保测试机和辅助测试机两端的端口号一致。

  5. 在测试机中查看测试的网络时延。

    测试示例如下图所示,Latency(usec)值表示数据传输的平均时延,单位为us。

    image