内核pktgen使用

内核pktgen使用

什么是pktgen

pktgen 是一款 Linux 发包工具,可在内核高速发包。由于pktgen是内核内置的,使用内核空间,所以它可以达到高带宽、高发包速率,以此更好地测试路由器、交换机和其他网络设备。

一旦加载pktgen模块后,会自动为每一个CPU创建一个内核线程^1^,并将该线程绑定在对应的CPU上。与此同时,在/proc/net/pktgen/目录下,为每一个线程创建一个kpktgend_X文件(其中的X为CPU编号),用来控制和监控这些线程,以及一个pgctrl文件,用来控制pktgen程序。当卸载pktgen模块时,/proc/net/pktgen文件夹会被自动删除。

同时,当将某个网卡绑定在某个线程时,也会在/proc/net/pktgen/目录下自动创建以该网卡名称为名的文件,用于记录此网卡设备的配置信息和运行信息。

测试程序可以配置成一直运行,或者在发送固定数量的包之后结束。也可以使用快捷键Ctrl+C终止运行。

使能 pktgen

使用pktgen需要在内核配置文件开启CONFIG_NET_PKTGEN

内核在执行一下命令后:

bash 复制代码
$ sudo modprobe pktgen

会在文件夹/proc/net/下创建一个pktgen文件夹

使用pktgen发包

在加载pktgen之后会在proc/net/pktgen下创建出如下几个文件:

添加设备

bash 复制代码
$ echo "add_device ens33" > /proc/net/pktgen/kpktgend_0

设置报文

  • 部分配置
bash 复制代码
$ echo "pkt_size 64" > /proc/net/pktgen/etn
$ echo "count 1000000" > /proc/net/pktgen/eth3
$ echo "dst_mac aa:bb:cc:dd:ee:ff" > /proc/net/pktgen/eth3
  • 查看配置结果
bash 复制代码
cat /proc/net/pktgen/ens33

发送报文

bash 复制代码
$ echo "start" > /proc/net/pktgen/pgctrl

查看统计信息

bash 复制代码
$ cat /proc/net/pktgen/ens33

配置命令

控制命令

名称 含义
start 所有的线程开始发送
stop 停止

线程命令

名称 含义
add_device 添加某个端口到某个线程
rem_device_all 删除绑定在某个线程的所有端口
max_before_softirq 在最多发送多少个数据包后执行do_softirq()

端口命令

名称 含义
count 发送数据包的个数,0 表示一直发送
clone_skb 对每个skb进行多少个复制,0表示不复制。对于Dos等测试必须至零
debug 调试
frags 数据包的片段数量
delay 发送两个数据包之间的延时
src_mac_count 源mac的数量,从src mac设置的mac开始轮询
dst_mac_count 目的mac的数量,从dst mac设置的mac开始轮询
pkt_size 链路包的大小(前去CRC的值)
min_pkt_size 数据包最小值
max_pkt_size 数据包最大值
udp_src_min 最小源udp端口号
udp_src_max 最大源udp端口号
udp_dst_min 最小目的udp端口号
udp_dst_max 最大目的udp端口号
flag IPSRC_RND TXSIZE_RND IPDST_RND UDPSRC_RND UDPDST_RND MACSRC_RND MACDST_RND PSRC_RND 源IP随机发送
dst_min 目的IP的最小值
dst_max 目的IP的最大值
src_min 源IP最小值
src_max 源IP最大值
dst_mac 目的mac
src_mac 源mac
clear_counters 清空计数器,一般程序自动清空
dst6 目的IPv6地址
src6 源IPv6地址
flows 并发流的个数
flowlen 流的长度

pktgen脚本

脚本实例

bash 复制代码
#!/bin/bash
#modprobe pktgen

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
}

# Config Start Here -----------------------------------------------------------
# thread config
# Each CPU has own thread. Two CPU exammple. We add ens33 respectivly.

for i in {0..3}; do
    PGDEV=/proc/net/pktgen/kpktgend_$i
    echo "Removing all devices"
    pgset "rem_device_all"
done

PGDEV=/proc/net/pktgen/kpktgend_2
echo "Adding ens33"
pgset "add_device ens33"
echo "Setting max_before_softirq 10000"
pgset "max_before_softirq 100000"

# device config
# 改为0可以加速
CLONE_SKB="clone_skb 1000000"

# NIC adds 4 bytes CRC
# 一般值越大,可以达到的throughput越大
PKT_SIZE="pkt_size 1500"
# COUNT 0 means forever
#COUNT="count 0"
COUNT="count 1000000"

# ipg is inter packet gap. 0 means maximum speed. 有些设备不支持
IPG="ipg 0"
PGDEV=/proc/net/pktgen/ens33
echo "Configuring $PGDEV"
pgset "$COUNT"
pgset "$CLONE_SKB"
pgset "$PKT_SIZE"

#pgset "$IPG"
#pgset "dst 192.168.253.23"
# 配置发送的源mac
pgset "src_mac 00:05:9a:5c:7a:00"
# 配置接收的目的mac
pgset "dst_mac 0a:00:27:8a:00:07"

# Time to run

PGDEV=/proc/net/pktgen/pgctrl
echo "Running... ctrl^C to stop"
pgset "start"
echo "Done"

# Result can be vieved in /proc/net/pktgen/ens33

执行结果

内核pktgen脚本

在仓库torvalds/linux/samples/pktgen中提供了多个pktgen的脚本例子,

脚本使用

bash 复制代码
./pktgen_sample01_simple.sh -i ens33 -d 127.0.0.1 -t 1 -n 1000 -m 00:15:5d:4b:19:b1 -s 100000

测试网络PPS性能指标,判断是否丢包

客户端安装pktgen来发包,接收端通过sar命令(linux系统)来查看端口统计信息,通过对比收发两端的速率来判断是否有丢包。

其他pktgen命令

查看版本

bash 复制代码
$ cat pgctrl
Packet Generator for packet performance testing. Version: 2.75

查看kpktgend进程

bash 复制代码
ps -A | grep pkt
   5614 ?        00:00:03 kpktgend_0
   5615 ?        00:00:03 kpktgend_1
   5616 ?        00:00:02 kpktgend_2
   5618 ?        00:00:02 kpktgend_3
   5619 ?        00:00:02 kpktgend_0
   5620 ?        00:00:02 kpktgend_1
   5621 ?        00:00:02 kpktgend_2
   5622 ?        00:00:02 kpktgend_3

参考

pktgen | 孙勇峰的部落格 (sunyongfeng.com)

pktgen------the packet generator within linux kernel-CSDN博客

kernel.org/doc/Documentation/networking/pktgen.txt

networking:pktgen Wiki (linuxfoundation.org)

pktgen使用指南 - mrwuzs - 博客园 (cnblogs.com)

pktgen使用详细教程 - 可酷可乐 - 博客园 (cnblogs.com)

pktgen: A packet traffic generator in kernel space for testing network throughput. -- Julio Faracco (wordpress.com)

利用pktgen发包工具做性能测试_pktgen prbs_S100400507的博客-CSDN博客

network-testing/pktgen at master · netoptimizer/network-testing (github.com) pktgen测试脚本。

pktgen的使用 (jialeicui.github.io)

使用pktgen测试网络带宽


😏

🏍

👽


  1. 注意:一个设备只能属于一个线程。 ↩︎
相关推荐
明明真系叻1 小时前
第二十六周机器学习笔记:PINN求正反解求PDE文献阅读——正问题
人工智能·笔记·深度学习·机器学习·1024程序员节
希忘auto3 天前
详解Redis的常用命令
redis·1024程序员节
yaosheng_VALVE3 天前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节
dami_king3 天前
SSH特性|组成|SSH是什么?
运维·ssh·1024程序员节
一个通信老学姐8 天前
专业125+总分400+南京理工大学818考研经验南理工电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节
sheng12345678rui8 天前
mfc140.dll文件缺失的修复方法分享,全面分析mfc140.dll的几种解决方法
游戏·电脑·dll文件·dll修复工具·1024程序员节
huipeng9269 天前
第十章 类和对象(二)
java·开发语言·学习·1024程序员节
earthzhang202110 天前
《深入浅出HTTPS》读书笔记(19):密钥
开发语言·网络协议·算法·https·1024程序员节
爱吃生蚝的于勒10 天前
计算机基础 原码反码补码问题
经验分享·笔记·计算机网络·其他·1024程序员节
earthzhang202110 天前
《深入浅出HTTPS》读书笔记(20):口令和PEB算法
开发语言·网络协议·算法·https·1024程序员节