pktgen自动化测试网卡速率和包率

本文介绍了pktgen,一个高性能的Linux内核网络测试工具,用于测试网卡速率和包率。通过加载pktgen内核模块,绑定网络接口并使用脚本配置,实现数据包的发送和接收,以评估网络性能。同时,文中提供了自动化测试脚本示例,展示如何自定义数据包大小以测试网卡的最大速度。

版权声明:本文为神州灵云作者的原创文章,未经神州灵云允许不得转载。

本文作者:Lewis

一、简介
1、pktgen是一个位于linux内核层的高性能网络测试工具,他是一个内核模块,所以不是软件,因此不能通过在命令行使用pktgen的方式运行
2、支持多线程,能够产生随机mac地址、IP地址、UDP端口号的数据包
3、发送数据速率甚至可以大于10GBit/s
4、pktgen用到了向/proc文件系统写入数据的功能

二、基本使用方法
系统默认pktgen不是自动加载进内核,需要手动pktgen加入内核

1、加载pktgen入内核命令
[root@localhost ~]# modprobe pktgen

2、查看pktgen是否在内核
[root@localhost ~]# lsmod | grep pktgen
pktgen 53193 0

3、加载后,模块文件位置
/lib/modules/3.10.0-229.el7.x86_64/kernel/net/core/pktgen.ko

4、查看pktgen进程,机器有几个内核,就有几个进程

[root@localhost core]# ps aux | grep pktgen 
root      1935  0.0  0.0 112708   976 pts/0    R+   14:22   0:00 grep --color=auto pktgen 
root     14490  0.0  0.0      0     0 ?        S    11:23   0:02 [kpktgend_0] 
root     14491  0.0  0.0      0     0 ?        S    11:23   0:00 [kpktgend_1] 
root     14492  0.0  0.0      0     0 ?        S    11:23   0:00 [kpktgend_2] 
root     14493  0.0  0.0      0     0 ?        S    11:23   0:01 [kpktgend_3]
 root     14494  0.0  0.0      0     0 ?        S    11:23   0:01 [kpktgend_4] 
root     14495  0.0  0.0      0     0 ?        S    11:23   0:01 [kpktgend_5] 
root     14496  0.0  0.0      0     0 ?        S    11:23   0:01 [kpktgend_6] 
root     14497  0.0  0.0      0     0 ?        S    11:23   0:02 [kpktgend_7]

5、查看Linux上的pktgen

[root@localhost ~]# cd /proc/net/pktgen/ 
[root@localhost pktgen]# ll 
total 0 
-rw------- 1 root root 0 Jan 25 14:44 kpktgend_0 
-rw------- 1 root root 0 Jan 25 14:44 kpktgend_1 
-rw------- 1 root root 0 Jan 25 14:44 kpktgend_2 
-rw------- 1 root root 0 Jan 25 14:44 kpktgend_3 
-rw------- 1 root root 0 Jan 25 14:44 kpktgend_4 
-rw------- 1 root root 0 Jan 25 14:44 kpktgend_5 
-rw------- 1 root root 0 Jan 25 14:44 kpktgend_6 
-rw------- 1 root root 0 Jan 25 14:44 kpktgend_7 
-rw------- 1 root root 0 Jan 25 14:44 pgctrl

6、pktgen需要脚本来进行驱动
#/proc接口配置

function pgset() {     
	local result     
	echo $1 > $PGDEV      
	result=`cat $PGDEV | fgrep "Result: OK:"`    
	 if [ "$result" = "" ]; then          
		cat $PGDEV | fgrep Result:    
		 fi
 } 
 function pg() {     
	echo inject > $PGDEV     
	cat $PGDEV 
}  		

//绑定接口ens161,到线程0
PGDEV=/proc/net/pktgen/kpktgend_0 //给环境变量PGDEV赋值 pgset "rem_device_all" //删除绑定在所有进程下的接口
pgset "add_device eth0" //把ens161接口绑定在线程0下,要使用实际的网卡name

7、执行脚本后,在/proc/net/pktgen/下会多出网卡接口

[root@localhost pktgen]# ll 
total 0 
-rw------- 1 root root 0 Jan 25 14:54 eth1 
-rw------- 1 root root 0 Jan 25 14:54 kpktgend_0 
-rw------- 1 root root 0 Jan 25 14:54 kpktgend_1 
-rw------- 1 root root 0 Jan 25 14:54 kpktgend_2 
-rw------- 1 root root 0 Jan 25 14:54 kpktgend_3 
-rw------- 1 root root 0 Jan 25 14:54 kpktgend_4 
-rw------- 1 root root 0 Jan 25 14:54 kpktgend_5 
-rw------- 1 root root 0 Jan 25 14:54 kpktgend_6 
-rw------- 1 root root 0 Jan 25 14:54 kpktgend_7 
-rw------- 1 root root 0 Jan 25 14:54 pgctrl

三、pktgen所有参数列表

pktgen所有参数列表.jpg

四、实际应用
测试场景:两台服务器(可以是虚拟机),一台用来发数据,另一台用来收数据

基本使用方法见上述内容,这里主要介绍脚本和数据包

1、基础收发包测试
#省略函数内容,见上述内容

#省略接口绑定,见上述内容

PGDEV=/proc/net/pktgen/eno16780032 //重新给变量PGDEV赋值
pgset "dst 172.16.4.197" //设置目的IP地址,该地址为接收服务器的IP地址,如果要对方真实收到的话,必须真实有效
pgset "src_min 10.0.0.1" //源IP地址不能指定单独一个,只能写范围,方便测试最大最小都写同一个,可以任意写,那必须要有这个字段
pgset "src_max 10.0.0.1"
pgset "src_mac D4:AE:52:7C:8D:92" //源MAC地址,必须要有,可以任意写一个
pgset "dst_mac 00:50:56:b0:24:4d" //设置目的MAC地址,该地址为接收服务器的MAC地址,如果要对方真实收到的话,必须真实有效
pgset "count 0" //只能数据包个数,0表示一直发送,如果不写着字段,是不会发包的

PGDEV=/proc/net/pktgen/pgctrl //重新给变量PGDEV赋值
pgset "start"
echo "done

用另一台服务器,tcpdum -w那下原始pcap数据包,打开后,内容如下:
pcap数据包.jpg

2、测试网卡性能
让某一块网卡尽最大速度发包,包的大小为500M,然后看网卡性能
#省略函数内容,见上述内容
#省略接口绑定,见上述内容

PGDEV=/proc/net/pktgen/eno16780032 
pgset "dst 172.16.4.197" pgset "src_min 10.0.0.1" 
pgset "src_max 10.0.0.1" pgset "src_mac D4:AE:52:7C:8D:92" 
pgset "dst_mac 00:50:56:b0:24:4d" 
pgset "count 0" pgset "pkt_size 500"  //设置数据包的大小   
 PGDEV=/proc/net/pktgen/pgctrl 
pgset "start"  
echo "done"

查看网卡性能
[root@localhost ~]# cat /proc/net/pktgen/eno16780032

Params: count 0  min_pkt_size: 500  max_pkt_size: 500      
	frags: 0  delay: 0  clone_skb: 0  ifname: eno16780032      
	flows: 0 flowlen: 0      
	queue_map_min: 0  queue_map_max: 0      
	dst_min: 172.16.4.197  dst_max:         
		src_min: 10.0.0.1  src_max: 10.0.0.1      
	src_mac: d4:ae:52:7c:8d:92 dst_mac: 00:50:56:b0:24:4d      
	udp_src_min: 9  udp_src_max: 9  udp_dst_min: 9  udp_dst_max: 9      	src_mac_count: 0  dst_mac_count: 0      
	Flags: 
Current:      
	pkts-sofar: 24500512  errors: 0      
	started: 12633987030us  stopped: 12656139282us idle: 51432us      
	seq_num: 24500513  cur_dst_mac_offset: 0  cur_src_mac_offset: 0      
	cur_saddr: 10.0.0.1  cur_daddr: 172.16.4.197      
	cur_udp_dst: 9  cur_udp_src: 9      cur_queue_map: 0      
	flows: 0 
Result: OK: 22152252(c22100820+d51432) usec, 24500512 (500byte,0frags)   1106005pps 4424Mb/sec (4424020000bps) errors: 0

3、自动化测试脚本
自定义数据包大小,

#自动启动pktgen

if [[ `lsmod | grep pktgen` == "" ]];then    
   modprobe pktgen 
fi 
#如果不设置包大小默认是550M
if [[ $1 == "" ]];then    
   pktsize=550 else
   pktsize=$1
fi

#省略函数内容,见上述内容
#省略接口绑定,见上述内容

PGDEV=/proc/net/pktgen/eno16780032 
pgset "dst 172.16.4.197" 
pgset "src_min 10.0.0.1" 
pgset "src_max 10.0.0.1" 
pgset "src_mac D4:AE:52:7C:8D:92" 
pgset "dst_mac 00:50:56:b0:24:4d" 
pgset "count 0" pgset "pkt_size 500"  //设置数据包的大小  

PGDEV=/proc/net/pktgen/pgctrl 
echo "pkgsize:$pktsize" 
echo "Running... ctrl^C to stop" 
pgset "start" 
echo "done"

测试截图
[root@localhost ~]# ./pktgen.sh 1000 //自定义发包大小
pkgsize:1000
Running... ctrl^C to stop
^C

查看网卡参数
[root@localhost ~]# cat /proc/net/pktgen/eno16780032

Params: count 0  min_pkt_size: 500  max_pkt_size: 500      
	frags: 0  delay: 0  clone_skb: 0  ifname: eno16780032      
	flows: 0 flowlen: 0      
	queue_map_min: 0  queue_map_max: 0      
	dst_min: 172.16.4.197  dst_max:         
		src_min: 10.0.0.1  src_max: 10.0.0.1      
	src_mac: d4:ae:52:7c:8d:92 dst_mac: 00:50:56:b0:24:4d      
	udp_src_min: 9  udp_src_max: 9  udp_dst_min: 9  udp_dst_max: 9      	src_mac_count: 0  dst_mac_count: 0      
	Flags: 
Current:      
	pkts-sofar: 24500512  errors: 0      
	started: 12633987030us  stopped: 12656139282us idle: 51432us      
	seq_num: 24500513  cur_dst_mac_offset: 0  cur_src_mac_offset: 0      
	cur_saddr: 10.0.0.1  cur_daddr: 172.16.4.197      
	cur_udp_dst: 9  cur_udp_src: 9      cur_queue_map: 0      
	flows: 0 
Result: OK: 22152252(c22100820+d51432) usec, 24500512 (500byte,0frags) 
1347901pps 10783Mb/sec (4424020000bps) errors: 0

神州灵云公司官网(二维码).png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值