内核pktgen使用

内核pktgen使用

什么是pktgen

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

一旦加载pktgen模块后,会自动为每一个CPU创建一个内核线程[1](#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. 注意:一个设备只能属于一个线程。 ↩︎
相关推荐
无己心18 小时前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u0103055277 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u0103055277 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝8 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u0103055279 天前
Java图像处理实战指南
人工智能·1024程序员节
u0103055279 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u01030552711 天前
Java实用类应用精讲
人工智能·1024程序员节
u01030552712 天前
Java I/O核心操作实战
人工智能·1024程序员节
u01030552713 天前
ArrayList操作详解与实战应用
人工智能·1024程序员节
u01030552714 天前
Java模块化编程实战指南
人工智能·笔记·1024程序员节