Linux内核pktgen使用

本文最后更新于:2023年9月21日 下午

内核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

内核在执行一下命令后:

1
$ sudo modprobe pktgen

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

使用pktgen发包

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

image-20230915083323445

添加设备

1
$ echo "add_device ens33" > /proc/net/pktgen/kpktgend_0

image-20230915091151661

设置报文

  • 部分配置
1
2
3
$ 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

image-20230915091238685

  • 查看配置结果
1
cat /proc/net/pktgen/ens33

image-20230915091552982

发送报文

1
$ echo "start" > /proc/net/pktgen/pgctrl

查看统计信息

1
$ cat /proc/net/pktgen/ens33

image-20230915091751564

配置命令

控制命令

名称 含义
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脚本

脚本实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/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

内核pktgen脚本

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

image-20230915105901218

脚本使用

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

image-20230915110658031

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

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

image-20230915111012837

其他pktgen命令

查看版本

1
2
$ cat pgctrl
Packet Generator for packet performance testing. Version: 2.75

查看kpktgend进程

1
2
3
4
5
6
7
8
9
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)

https://mp.weixin.qq.com/s/D7h2AnlrDrEGU_eGmWGXcA

  1. 注意:一个设备只能属于一个线程。


Linux内核pktgen使用
http://example.com/2023/09/21/Linux内核pktgen使用/
作者
Eddy
发布于
2023年9月21日
许可协议