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

内核在执行一下命令后:

$ sudo modprobe pktgen

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

使用pktgen发包

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

在这里插入图片描述

添加设备

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

在这里插入图片描述

设置报文

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

在这里插入图片描述

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

在这里插入图片描述

发送报文

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

查看统计信息

$ 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脚本

脚本实例

#!/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的脚本例子,

在这里插入图片描述

脚本使用

./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命令

查看版本

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

查看kpktgend进程

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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值