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

相关推荐
U***746920 小时前
Linux(CentOS)安装 MySQL
linux·mysql·centos
3***g20520 小时前
Linux系统离线部署MySQL详细教程(带每步骤图文教程)
linux·mysql·adb
Dovis(誓平步青云)21 小时前
《内核视角下的 Linux 锁与普通生产消费模型:同步原语设计与性能优化思路》
linux·运维·性能优化
xu_yule21 小时前
Linux_13(多线程)页表详解+轻量级进程+pthread_create
linux·运维·服务器
江湖有缘1 天前
Linux系统之htop命令基本使用
linux·运维·服务器
CodeByV1 天前
【Linux】基础 IO 深度解析:文件、描述符与缓冲区
linux
xu_yule1 天前
Linux_12(进程信号)内核态和用户态+处理信号+不可重入函数+volatile
linux·运维·服务器
虾..1 天前
Linux 环境变量&&进程优先级
linux·运维·服务器
i***t9191 天前
Linux下MySQL的简单使用
linux·mysql·adb
偶像你挑的噻1 天前
11-Linux驱动开发-I2C子系统–mpu6050简单数据透传驱动
linux·驱动开发·stm32·嵌入式硬件