版权声明:本文为神州灵云作者的原创文章,未经神州灵云允许不得转载。
本文作者: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所有参数列表

四、实际应用
测试场景:两台服务器(可以是虚拟机),一台用来发数据,另一台用来收数据
基本使用方法见上述内容,这里主要介绍脚本和数据包
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数据包,打开后,内容如下:

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

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

被折叠的 条评论
为什么被折叠?



