引言
一直在寻找一个可以发送高吞吐量的工具,终于发现了pktgen这个宝贝。
它是基于linux内核层的高性能网络测试工具,在虚拟机上测试(本项目中使用虚拟机为ubuntu18版本),发现报文吞吐量可达750Mbps,这还只是应用在单核上。如果用多核,性能应该可以更高。
以下为操作步骤。
加载pktgen模块
使用以下命令加载pktgen模块:
#modprobe pktgen
加载pktgen内核模块后,会在每个CPU上启动一个内核线程,内核线程的名字从kpktgend_0开始依次增加,如下:
#cd /proc/net/pktgen/
#ls
kpktgend_0 pgctrl
kpktgend_0表示只有1个cpu。
kpktgend_x是对应的内核线程的信息。
pgctl用来控制pktgen的开始和关闭。
将网卡配置到内核线程的发送字段
首先,查看未添加网卡前的情况:
#cat kpktgend_0
Running:
Stopped:
Result: NA
查看虚拟机网卡信息:
# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.159.137 netmask 255.255.255.0 broadcast 192.168.159.255
inet6 fe80::3e85:d37c:8bc2:b054 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:5d:7e:c3 txqueuelen 1000 (Ethernet)
RX packets 1059 bytes 739186 (739.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 512 bytes 56059 (56.0 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
表示虚拟机有一个网卡ens33。
将该网卡添加到内核线程,如下:
# echo "add_device ens33" > /proc/net/pktgen/kpktgend_0
# cat kpktgend_0
Running:
Stopped: ens33
Result: OK: add_device=ens33
此时目录下会增加新文件ens33,如下:
root@ubuntu:/proc/net/pktgen# ls
ens33 kpktgend_0 pgctrl
配置参数
# echo count 999 > ens33 //发送数据包的个数,0表示一直发送
# echo clone_skb 0 > ens33 //表示复制多少数据包,clone_skb=1000,克隆1000报文;clone_skb=0表示不克隆,就是一直发送同一个报文。
# echo pkt_size 998 > ens33 //包的长度
# echo dst 192.168.1.100 > ens33 //目的ip
# echo dst_mac 11:22:33:44:55:66 > ens33 //目的mac
配置完成,可以查看信息(省略了未更改的内容),如下:
# cat ens33
Params: count 999 min_pkt_size: 998 max_pkt_size: 998
frags: 0 delay: 0 clone_skb: 0 ifname: ens33
src_mac: 00:0c:29:5d:7e:c3 dst_mac: 11:22:33:44:55:66
......
Current:
cur_saddr: 192.168.1.10 cur_daddr: 192.168.1.10
......
启动发送
# echo start>pgctrl
通过命令查看,如下:
# cat ens33
......
Result: OK: 18359(c15517+d2842) usec, 999 (998byte,0frags)
54413pps 434Mb/sec (434433392bps) errors: 0
可以看到结果,发送的包数、帧长、平均流量。
使用wireshark抓包分析流量
注意:由于是对虚拟网卡抓包,所以不要使用实际物理网卡。默认情况下,选择VMnet8即可。如果更改了网卡模式,修改wireshark抓包的网卡设置。
如果是一直发送,即把count设置为0,如下:
# echo count 999 > ens33 //发送数据包的个数,0表示一直发送
通过抓包分析,可以看到能达到750Mbps,如下:
这个效果,挺不错的。
停止发送
# echo stop>pgctrl
总结
使用pktgen,能够高效方便地发送测试流量,不用自己再费劲巴拉写代码了,而且linux系统基本都具备,真是一个非常不错的工具!