网络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万
- 分别远程连接测试机和辅助测试机。 - 具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。 
- 分别在测试机和辅助测试机上执行以下命令,下载Netperf。 - wget https://benchmark-packages.oss-cn-qingdao.aliyuncs.com/netperf-2.7.0.tar.gz
- 分别在测试机和辅助测试机上执行以下命令,安装Netperf和sar监控工具。 - 执行以下命令,解压Netperf包。 - sudo yum install -y gcc autoconf automake libtool sysstat tar -zxvf netperf-2.7.0.tar.gz
- 执行以下命令,查询 - gcc版本号。- gcc -v 2>&1
- 若测试机和辅助测试机安装的 - gcc版本高于10版本,则您需要继续执行下述操作,以确保- gcc可以正常编译。否则,请忽略此步骤。- 执行以下命令,修改 - nettest_omni.c文件。- cd netperf vim src/nettest_omni.c
- 按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 */
- 修改完成后按Esc键,输入 - :wq后按下回车键,保存并退出。
 
- 执行以下命令,安装Netperf和sar监控工具。 - cd netperf sudo ./configure sudo make && sudo make install
 
- 在测试机上执行以下命令,启动64个netserver服务。 - #!/bin/bash for j in `seq 64`; do netserver -p $[16000+j] > server_$[16000+j].netperf > /dev/null 2>&1 & done
- 在测试机上执行以下命令,查询测试机的私网IP地址。 - ifconfig || ip addr 
- 在辅助测试机上执行以下命令,向测试机输入流量。 - #!/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地址,示例如下图所示。 
- 在测试机上执行以下命令,测试网络PPS。 - sar -n DEV 1- 在测试结果中查看 - rxpck/s列的数据值,- rxpck/s表示该测试机每秒钟接收的数据包总数。如下图所示,示例中测试机每秒钟接收到的数据包平均数约为94万。 
网络PPS大于600万小于2000万
- 分别远程连接测试机和辅助测试机。 - 具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。 
- 分别在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
- 在测试机上执行以下命令,查询测试机的私网IP地址。 - ifconfig || ip addr 
- 分别在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是输入流量的时间,请您根据实际情况修改。
- 分别在3台辅助测试机和1台测试机上执行以下命令,测试网络流量。 - sar -n DEV 1- 在测试机上查看 - rxpck/s列的数据值,- rxpck/s表示该测试机每秒钟接收到的数据包。如下图所示,示例中测试机每秒钟接收到的数据包数约为1200万。 
网络PPS大于2000万
- 分别远程连接测试机和辅助测试机。 - 具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。 
- 分别在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
- 在测试机上执行以下命令,绑定中断。 - 在高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
- 在测试机上执行以下命令,查询测试机的私网IP地址。 - ifconfig || ip addr 
- 分别在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是输入流量的时间,请您根据实际情况修改。
- 分别在3台辅助测试机和1台测试机上执行以下命令,测试网络流量。 - sar -n DEV 1- 在测试机上查看 - rxpck/s列的数据值,- rxpck/s表示该测试机每秒钟接收到的数据包。如下图所示,示例中测试机每秒钟接收到的数据包数约为2000万。 
测试网络带宽
Linux实例
- 分别远程连接测试机和辅助测试机。 - 具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。 
- 分别在测试机和辅助测试机上执行以下命令,下载Netperf。 - wget https://benchmark-packages.oss-cn-qingdao.aliyuncs.com/netperf-2.7.0.tar.gz
- 分别在测试机和辅助测试机上执行以下命令,安装Netperf和sar监控工具。 - 执行以下命令,解压Netperf包。 - sudo yum install -y gcc autoconf automake libtool sysstat tar -zxvf netperf-2.7.0.tar.gz
- 执行以下命令,查询 - gcc版本号。- gcc -v 2>&1
- 若测试机和辅助测试机安装的 - gcc版本高于10版本,则您需要继续执行下述操作,以确保- gcc可以正常编译。否则,请忽略此步骤。- 执行以下命令,修改 - nettest_omni.c文件。- cd netperf vim src/nettest_omni.c
- 按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 */
- 修改完成后按Esc键,输入 - :wq后按下回车键,保存并退出。
 
- 执行以下命令,安装Netperf和sar监控工具。 - cd netperf sudo ./configure sudo make && sudo make install
 
- 在测试机上执行以下命令,启动64个netserver服务。 - #!/bin/bash for j in `seq 64`; do netserver -p $[16000+j] > server_$[16000+j].netperf > /dev/null 2>&1 & done
- 在测试机上执行以下命令,查询测试机的私网IP地址。 - ifconfig || ip addr 
- 在辅助测试机上执行以下命令,向测试机输入流量。 - #!/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地址,示例如下图所示。 
- 在测试机上执行以下命令,测试网络带宽。 - sar -n DEV 1- 在测试结果中查看rxkB/s列的数据值,rxkB/s表示该测试机每秒钟接收的数据包的大小,单位为KB/s(千字节/每秒)。1字节等于8比特,若要计算对应的带宽值,则可将rxkB/s列对应的数值乘以8,从而将其转换为Kbps(千比特/每秒)。 - 示例如下图所示。  
Windows实例
- 分别远程连接测试机和辅助测试机。 - 具体操作,请参见使用Workbench工具以RDP协议登录Windows实例。 
- 分别在测试机和辅助测试机中安装测试工具并关闭防火墙。 - 下载ntttcp.exe工具,并获取存放路径。 
- 打开运行对话框,输入powershell进入PowerShell命令行。 
- 运行以下命令,关闭防火墙,避免防火墙可能阻止两台机器的连接。 - 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实际路径>。
 
- 在测试机中运行以下命令,设置网卡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配置通常需要重启网卡服务,可能会导致当前通过该网卡的网络连接暂时中断,请您在连接恢复后再进行后续操作。 
 
- 在测试机中执行以下命令,准备接收数据。 - $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实际路径>。
- 在辅助测试机中执行以下命令,发送数据。 - $serverIp = "<测试机私网IP地址>" $threadNum = "<测试机threadNum>" <辅助测试机ntttcp.exe实际路径> -s -m $threadNum,*,$serverIp -t 100说明- 您需要根据环境替换 - <测试机私网IP地址>(可通过- ipconfig命令获取)、- <测试机threadNum>(可通过- $cpuNum命令获取)和- <辅助测试机ntttcp.exe实际路径>。
- 在测试机中查看测试的网络带宽。 - 测试示例如下图所示, - Throughput(MB/s)值表示网络带宽(数据传输速度)。 
测试网络时延
Linux实例
- 分别远程连接测试机和辅助测试机。 - 具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。 
- 分别在测试机和辅助测试机上执行以下命令,安装 - 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
- 在测试机上执行以下命令,查询测试机的私网IP地址。 - ifconfig || ip addr 
- 在测试机上执行以下命令,启动服务。 - sockperf sr --tcp --daemonize
- 在辅助测试机上执行以下命令,向测试机输入流量。 - sockperf pp -i <测试机私网IP地址> --tcp -t 30 -m 14 --full-log=result.json- <测试机私网IP地址>需替换为上一步查询的实际测试机的私网IP地址。
- 在测试机中查看测试的网络时延。 - 测试示例如下图所示: - 以 - avg-latency开头的结果数据表示平均时延,单位为us。
- 以 - percentile 99.000开头的结果数据表示99分位时延,单位为μs。
  
Windows实例
- 分别远程连接测试机和辅助测试机。 - 具体操作,请参见使用Workbench工具以RDP协议登录Windows实例。 
- 分别在测试机和辅助测试机中安装测试工具并关闭防火墙。 - 下载latte.exe工具,并获取存放路径。 
- 打开运行对话框,输入powershell进入PowerShell命令行。 
- 运行以下命令,关闭防火墙,避免防火墙可能阻止两台机器的连接。 - 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实际路径>。
 
- 在测试机中执行以下命令,准备接收数据。 - $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实际路径>。
- <通信端口>由您自定义,但是必须确保测试机和辅助测试机两端的端口号一致。
 
- 在辅助测试机中执行以下命令,发送数据。 - $serverIp = "<测试机私网IP地址>" $port = <通信端口> & "<辅助测试机latte.exe实际路径>" -c -a "${serverIp}:$port" -i 65535说明- 您需要根据环境替换 - <测试机私网IP地址>(可通过- ipconfig命令获取)、- <辅助测试机latte.exe实际路径>。
- <通信端口>由您自定义,但是必须确保测试机和辅助测试机两端的端口号一致。
 
- 在测试机中查看测试的网络时延。 - 测试示例如下图所示, - Latency(usec)值表示数据传输的平均时延,单位为us。