使用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系统基本都具备,真是一个非常不错的工具!

相关推荐
叼烟扛炮1 小时前
Linux 学习笔记(五十九):epoll 的生死抉择——LT 与 ET 模式
linux·运维·服务器·网络·笔记·学习·php
David猪大卫8 小时前
【Linux修炼】环境变量、进程地址空间
linux·c语言·经验分享·笔记·学习·ubuntu·centos
叼烟扛炮9 小时前
Linux 学习笔记(五十六):IO 多路复用初探——select 的“三宗罪”
linux·服务器·数据库·笔记·学习·php
Ruiery9 小时前
Linux 6.6内核内存管理深度解析(十五):CMA 连续内存分配器
linux·运维·服务器
测试界的小码农10 小时前
【Linux 命令实战(01):认识 Linux 终端,从零掌握第一个命令】
linux·运维·服务器
布裘11 小时前
【银河麒麟】重启后时区丢失?排查发现 localtime 被业务程序替换成硬链接
linux·运维·网络
GeW13 小时前
高端化转型进入“补底层”阶段:Linux与数据库的再定位
linux
silent14 小时前
龙芯3B6000M运行Yolov8+FastApi
linux·loongarch·loongnix·龙芯
西西弗Sisyphus15 小时前
理解 Linux 动态库加载:LD_LIBRARY_PATH
linux
AR-26710-15 小时前
Linux Day31——实操启停服务改端口重启
linux·运维