网络性能测试方法

网络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. 分别在测试机和辅助测试机上执行以下命令,安装Netperf和sar监控工具。

    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. 执行以下命令,安装Netperf和sar监控工具。

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

    #!/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. 分别在测试机和辅助测试机上执行以下命令,安装Netperf和sar监控工具。

    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. 执行以下命令,安装Netperf和sar监控工具。

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

    #!/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)。与带宽(kbps)转换关系为:带宽(kbps)= 千字节数(rxkB/s)* 8。

    示例如下图所示。image.png

Windows实例

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

    具体操作,请参见通过密码或密钥认证登录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. 分别远程连接测试机和辅助测试机。

    具体操作,请参见通过密码或密钥认证登录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