前言
之前的《三层网络pps极限值测试》译文说道如何通过优化网络协议栈来提高网卡处理包的能力。如果没有看过的可以去看下之前的译文:https://download.csdn.net/download/minxihou/10838692
该篇译文中提及到的代码也已经编译好上传到了资源库中,有想玩玩的可以下载下来试一试。下载地址如下:
https://download.csdn.net/download/minxihou/10838692
这一篇主要说一下这个小程序该怎么用。udpbenchpps的解压包解压下来之后是一个tgz格式的压缩包。里面主要有两个小程序一个是start_client.sh,另外一个是start_server.sh。两个脚本只需要直接运行即可。这里主要讲下其余脚本的用处和测试之前怎么调试。
脚本结构
start_server.sh脚本在运行是会检查系统中是否会安装iptraf的软件包,该软件包是centos系统yum源带的网络监测工具。start_server.sh安装完iptraf软件包之后,会调用udpreceiver1程序,并监听本机4321端口收到的UDP包。这里为了提高收包能力,将udpreceiver1程序运行的线程进行了4核绑定。(这里需要注意如果想要测试虚拟网络环境的三层网络极限,那么虚机至少需要4核。)
start_client.sh脚本运行时会首先调用getpps.sh的脚本,该脚本主要用于监控发端端网卡的发包数量。之后会调用udpsender程序来对目标server端的机器进行发包。udpsender程序接收一个参数(IP:端口)。此IP为server端的IP地址,端口为server端udpreceiver1程序设定的端口。
getpps.sh脚本主要用于统计client端发包网卡的发包个数。这就意味着client端和server端至少有一个网卡处于网络可达。
测试模型
脚本的运行是以server和client的形式运行的。也就意味着测试时必须要起一个server端用于接收client发送的包。由于程序本身存在的缺陷一般单个client端并不能将server收包端压力压到线速,这时候需要通过起复数个client端来提升server端的收包能力。直到增加client端时server端收包无法再有明显提升。通过对比pktgen的测试结果这里可以得到一个大致的结论就是:一般client端在3-5个时,server能达到当前网络环境下的线速值。下图解释了想要测试client端到server端的网络环境测试模型。
实际测试
这里以单client和单server来演示如何使用。
准备了两台虚拟机vm2作为client端,vm1作为server端,配置如下:
vm1,vm2的虚机CPU内核和内存为4核8G。
vm1网络信息:
#ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.111.141 netmask 255.255.255.0 broadcast 192.168.111.255
inet6 fe80::f816:3eff:fe7b:43bb prefixlen 64 scopeid 0x20<link>
ether fa:16:3e:7b:43:bb txqueuelen 1000 (Ethernet)
RX packets 7735 bytes 1196414 (1.1 MiB)
RX errors 0 dropped 1 overruns 0 frame 0
TX packets 301807093 bytes 22333760792 (20.7 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
vm2网络信息:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.111.139 netmask 255.255.255.0 broadcast 192.168.111.255
inet6 fe80::f816:3eff:febe:46d3 prefixlen 64 scopeid 0x20<link>
ether fa:16:3e:be:46:d3 txqueuelen 1000 (Ethernet)
RX packets 5641 bytes 984696 (961.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 179813137 bytes 13306250672 (12.3 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
配置VM2的start_client.sh和getapp.sh脚本参数:
start_client.sh修改IP为server端的IP地址,如果client端和server端4321端口没有被占用则可以保持默认端口即可。
# vim start_client.sh
#!/bin/bash
/bin/bash ./getpps.sh &
taskset -c 1 ./udpsender 192.168.111.141:4321
配置VM2的getpps.sh脚本,使其监听eth0网卡的发包个数,gepps.sh默认输出10S内的发包平均值,如果对默认输出的时间间隔没有要求则无需修改"INTERVAL"参数。注意如果要修改INTERVAL参数,则TPS和RPS后面除的10也要修改成你相对应INTERVAL的间隔数。这里我们只修改R1,T1,R2,T2所检测的网卡,改成eth0。
#!/bin/bash
INTERVAL="10" # update interval in seconds
while true
do
R1=`cat /sys/class/net/eth0/statistics/rx_packets`
T1=`cat /sys/class/net/eth0/statistics/tx_packets`
sleep $INTERVAL
R2=`cat /sys/class/net/eth0/statistics/rx_packets`
T2=`cat /sys/class/net/eth0/statistics/tx_packets`
TXPPS=`expr $T2 - $T1`
RXPPS=`expr $R2 - $R1`
#
TPS=`expr $TXPPS / 10`
RPS=`expr $RXPPS / 10`
echo "TX: $TPS pps RX: $RPS pps"
echo "TX: $TPS pps RX: $RPS pps" >> /tmp/pps.log
done
配置VM1的start_server.sh脚本,这里如果不要求修改端口则可以保持默认端口即可。
# vim udpbenchpps/start_server.sh
#!/bin/bash
yum install iptraf -y
taskset -c 1,2,3,4 ./udpreceiver1 0.0.0.0:4321 4 1
之后在server端和client端分别执行start_server.sh,start_client.sh脚本。(注意这里一定需要进入到udpbenchpps解压目录下执行,否则执行会报错无法找到udpsender,udpreceiver1程序)。
VM2client发包端结果如下:
VM1server端收包结果如下:
note:在运行该脚本之前请先确保server端和client端防火墙对应端口已经开放。