pktgen工具使用及案例整理

(一)pktgen简介

pktgen是一个位于linux内核层高性能网络测试工具,由瑞士皇家理工大学的TSlab实验室的Robert Olsson开发的(现在应该不在皇家理工了),主要用来测试网络驱动与网卡设备,支持多线程,能够产生随机mac地址、IP地址、UDP端口号的数据包,pktgen 的作者使用多CPU处理器在不同的PCI总线(pci 、pcie等总线)上用千兆以太网卡做过测试(pktgen的表现依赖于CPU处理速率、内存延时、pci总线速率等硬件参数),发送数据速率甚至可以大于10GBit/s。可见是可以满足大多数的网卡等测试需求

pktgen的配置与统计信息查看都使用/proc文件系统完成,/proc文件系统是一种特殊的,有软件创建的文件系统,内核使用/proc文件系统向外界导出信息,外界也可以通过它配置内核态的一些进程的参数,如ps top uptime等linux发行版中的很多工具就是通过/proc实现的.在大多情况下,我们只用/proc读出数据(用于调试内核驱动等),而在pktgen中配置命令就用到了/proc的写入数据功能。

(二)pktgen工具命令说明

pktgen控制命令

pktgen命令参数参数说明
start 所有的线程开始发送
stop 停止

线程的控制命令

pktgen命令参数参数说明
add_device 添加某个端口到某个线程
rem_device_all 删除绑定在某个线程的所有端口
max_before_softirq 在最多发送多少个数据包后,执行do_softirq()

端口命令

pktgen命令参数参数说明
debug 调试
clone_skb 对每个skb进行多少个复制,0表示不复制。对于Dos等测试必须至零
clear_counters 清空计数器,一般程序自动清空
pkt_size 链路包的大小(前去CRC的值)
min_pkt_size 数据包最小值
max_pkt_size 数据包最大值
flags 包的分片数量
count 发送数据包的个数,0 表示一直发送
delay 发送两个数据包之间的延时
dst 目的IP
dst_min 目的IP的最小值
dst_max 目的IP的最大值
src_min 源IP最小值
src_max 源IP最大值
dst6 目的IPv6地址
src6 源IPv6地址
dstmac 目的mac
srcmac 源mac
src_mac_count 源mac的数量,从srcmac设置的mac开始轮询
dst_mac_count 目的mac的数量,从srcmac设置的mac开始轮询
udp_src_min 最小源udp端口号
udp_src_max 最大源udp端口号
udp_dst_min 最小目的udp端口号
udp_dst_max 最大目的udp端口号
flows 并发流的个数
flowlen 流的长度

Flags

Flags参数参数说明
IPSRC_RND
IPDST_RND TXSIZE_RND
UDPSRC_RND
UDPDST_RND
MACSRC_RND
MACDST_RND
PSRC_RND 源IP随机发送

(三)操作方法

从上面可以看出 pgctrl 控制 kpktgend_X 的启动停止发包, kpktgend_X 控制 ethX 使用网卡进行实际动作.
从 pktgen 加载之后, 使用 ps aux | grep pktgen 可以看到和 CPU 核心数相同的内核线程。
那么要让 pktgen 发包, 可以想象出来, 按照以下的步骤即可:

  1. 内核线程 kpktgend_X 关联网口 (操作 kpktgend_X)
  2. 配置网口发送参数 (操作 ehtX)
  3. 启动发送 (操作pgctl)

(四)pktgen一个使用案例

复制代码
#! /bin/sh
#modprobe pktgen
# 写虚拟文件系统的函数, 每次操作之前, 设置好要操作的设备 $PGDEV 为 pgctl/kpktgend_X/ehtX
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 eth0, eth2 respectivly.

# 移除线程中对应的所有网口, 再添加
PGDEV=/proc/net/pktgen/kpktgend_0
  echo "Removing all devices"
 pgset "rem_device_all" 
  echo "Adding eth0"
 pgset "add_device eth0" 
  echo "Setting max_before_softirq 10000"
 pgset "max_before_softirq 10000"


# device config
# ipg is inter packet gap. 0 means maximum speed.

CLONE_SKB="clone_skb 1000000"
# NIC adds 4 bytes CRC
PKT_SIZE="pkt_size 60"

# COUNT 0 means forever
#COUNT="count 0"
COUNT="count 10000000"
# ipg 参数在我实验的时候无效, 我从2.6.32的源码中也没有看到相关的设置, 可以将 ipg 相关的配置删掉
#IPG="ipg 0"

PGDEV=/proc/net/pktgen/eth0
  echo "Configuring $PGDEV"
 pgset "$COUNT"
 pgset "$CLONE_SKB"
 pgset "$PKT_SIZE"
 #pgset "$IPG"
 # 配置目标IP
 pgset "dst 192.168.2.254" 
 # 配置目标MAC
 pgset "dst_mac  00:04:32:08:a1:89"


# Time to run
PGDEV=/proc/net/pktgen/pgctrl
# 发送 start 给 pgctl, 让 pktgen 开始发包
 echo "Running... ctrl^C to stop"
 pgset "start" 
 echo "Done"

# Result can be vieved in /proc/net/pktgen/eth0
复制代码

 

posted @   ImreW  阅读(442)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2022-11-14 C和C++的区别
点击右上角即可分享
微信分享提示