udpbenchpps使用说明

版权声明:本文为博主原创文章,未经博主允许不得转载。Bob Hou: http://blog.csdn.net/minxihou https://blog.csdn.net/minxihou/article/details/85021615

前言

之前的《三层网络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端防火墙对应端口已经开放。

展开阅读全文

没有更多推荐了,返回首页