本文介绍如何使用Netperf测试工具测试云服务器的网络性能。
Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输。Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。Netperf测试结果主要反应系统向其他系统发送数据的速度,以及其他系统接收数据的速度。更多信息请参考Netperf官网。
说明
本文的测试结果仅作为参考,不代表云服务器的真实最优性能。
测试时,参考通过向导购买实例,购买两台相同配置的Linux云服务器。云服务器A上安装Netperf的netserver作为服务器端,云服务器B上安装Netperf作为客户端。在不运行应用的情况下,云服务器B压测云服务器A(不指定数据包大小),测试云服务器A的网络TCP收带宽性能。网络压力持续时间为5分钟,取云服务器A收到压力50秒后持续200秒的带宽平均值。
云服务器规划如下:
主机名称 | 内网IP地址 | 角色 |
---|---|---|
benchmark-1 | 192.168.xx.xx | Server |
benchmark-2 | 192.168.xx.xx | Client |
执行以下命令,在 两台 云服务器上分别安装Netperf工具。
wget https://codeload.github.com/HewlettPackard/netperf/tar.gz/netperf-2.7.0 tar -xzvf netperf-2.7.0 yum install gcc sysstat -y cd ./netperf-netperf-2.7.0 ./configure make && make install
执行以下命令,验证安装状态。如果返回使用帮助即证明安装成功。
netperf -p
参数说明:
参数 | 说明 |
---|---|
-p | 要监听的端口号。 |
-H | 接收端的IP地址。 |
-t | 发包协议类型。 |
-l | 测试时长。 |
-m | 数据包大小,带宽建议“1440”,收发包建议“1”。 |
在Sever端启动netserver进程,监听 12000 端口。netserver -p 12000
在Client端执行以下命令,命令中IP地址为Client端的内网IP地址。netperf -H 192.168.xx.xx -p 12000 -t TCP_STREAM -l 300 -- -m 1440 &
在Sever端使用sar工具查看结果。sar -n DEV 1 200
bps结果为rxkB/s的数值,单位换算:kB/s * 8/1000= Mbps
说明
如需测试三代实例的TCP cps,您可以在测试前,参考TCP cps性能优化进行性能优化,以获取更优的cps。
在Sever端启动netserver进程,监听 12000 端口。netserver -p 12000
在Client端执行以下命令,命令中IP地址为Client端的内网IP地址。netperf -H 192.168.xx.xx -p 12000 -t TCP_CRR -l 300 &
在Sever端使用sar工具查看结果。sar -n DEV 1
cps结果为 (rxpck/s的数值) /5。
在Sever端启动netserver进程,监听 12000 端口。netserver -p 12000
在Client端执行以下命令,命令中IP地址为Client端的内网IP地址。netperf -H 192.168.xx.xx -p 12000 -t UDP_STREAM -l 300 -- -m 1 &
在Sever端使用sar工具查看结果。sar -n DEV 1 200
pps结果为rxpck/s的数值。
三代实例的TCP cps性能可能会受到以下因素影响,您可以参考下文优化云服务器配置以获得最佳的性能体验。
关闭eth0的xps(仅三代实例涉及)
在两台实例上依次执行如下命令,关闭eth0的xps。
cd /sys/class/net/eth0/queues/ for i in `ls | grep tx` ; do cat $i/xps_cpus; done; #查看当前xps配置 for i in `ls | grep tx` ; do echo "00000000" > $i/xps_cpus; done; #关闭tx xps;0的位数与当前xps_cpus一致
本文以ecs.g3a.8xlarge(32C)为例,如下图所示。
中断绑核(仅三代AMD实例涉及)
在两台实例上执行如下命令,对eth0进行中断绑核。
#查看eth0设备队列个数 queue_num=$(ethtool -l eth0 | grep "Combined" | head -n 1 | awk '{print $2}') #将中断绑到CPU 0-$queue_num-1上 cat /proc/interrupts | grep virtio | grep input | cut -d: -f1 | while read i; do echo -n "irq $i bind cpu: "; echo $((($i / 2) % $queue_num)) > /proc/irq/$i/smp_affinity_list; cat /proc/irq/$i/smp_affinity_list; done | sort -n -t ' ' -k2 cat /proc/interrupts | grep virtio | grep output | cut -d: -f1 | while read i; do echo -n "irq $i bind cpu: "; echo $((($i / 2) % $queue_num)) > /proc/irq/$i/smp_affinity_list; cat /proc/irq/$i/smp_affinity_list; done | sort -n -t ' ' -k2
Netperf绑核测试。
在Server端启动多个netserver进程监听端口,例如启动1024个进程。
queue_num=$(ethtool -l eth0 | grep "Combined" | head -n 1 | awk '{print $2}') for ((i = 0 ; i < 1024; i++)); do taskset -c $(($i % $queue_num)) netserver -p $(($i + 12865)) & done
在Client端执行以下命令,命令中IP地址为Server端的内网IP地址。
queue_num=$(ethtool -l eth0 | grep "Combined" | head -n 1 | awk '{print $2}') for ((i = 0 ; i < 512; i++)); do taskset -c $(($i % queue_num)) netperf -H 192.168.xx.xx -p $(($i + 12865)) -t TCP_CRR -l 120 & done