使用pktgen进行高吞吐发包

引言

一直在寻找一个可以发送高吞吐量的工具,终于发现了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系统基本都具备,真是一个非常不错的工具!

相关推荐
orion5720 小时前
Missing Semester Class1:course overview and introduction of shell
linux
用户120487221611 天前
Linux驱动编译与加载
linux·嵌入式
用户805533698031 天前
Input 子系统架构:Core、Handler、Driver 三层是怎么协作的
linux·嵌入式
用户805533698031 天前
RK-Forge外设系列开篇 - 把板子从「能启动」变成「能用」:Ethernet/SPI/MMC 三个纯接线外设
linux·github·嵌入式
七歌杜金房2 天前
我终于又有了自己的 Linux 电脑
linux·debian·mac
tntxia3 天前
linux curl命令详解_curl详解
linux
扛枪的书生3 天前
Linux 网络管理器用法速查
linux
顺风尿一寸3 天前
Java Socket 内核之旅:从 SocketChannel.read() 到 tcp_recvmsg 与 epoll 的完整调用链路
linux
XIAOHEZIcode3 天前
Ubuntu 终端美化全栈指南:Bash 到 Kitty 踩坑实录
linux·ubuntu·命令行
唐青枫3 天前
别再只会用 cron:Linux systemd Timer 定时任务实战详解
linux