pktgen网络测试工具介绍

2023-11-06

pktgen是一款网络测试工具,可以用于压力测试、性能测试、负载均衡测试等方面。它使用Lua脚本来生成和发送数据包,并且支持多线程处理。

pktgen可以在Linux系统上运行,支持多种协议和数据包类型,如TCP、UDP、ICMP、ARP等。用户可以通过命令行或者图形界面来控制pktgen的运行。

pktgen还提供了详细的统计信息和日志记录功能,可以帮助用户更好地分析测试结果。同时,pktgen的开源性和社区支持也使得它成为了一个非常受欢迎的网络测试工具。

网上有很多讲解pktgen的文章,但总是不够全面细致,看完之后自己还是不会写pktgen测试脚本,为此本文对pktgen进行详细的阐述,让大家看完本文后能够自己动手写pktgen shell.

  1.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的写入数据功能。

  2.使用pktgen进行发包实验

 现在版本的linux发行版大多加入了pktgen,使用以下命令加载pktgen模块:

1

#modprobe pktgen

  然后你将在你的电脑的/proc/net/pktgen看到以下文件:

1

kpktgend_0  kpktgend_1  kpktgend_2  kpktgend_3  pgctrl

  其中kpktgen_*的多少是根据你的CPU的个数决定的,如我的机子的CPU数目为4,则有四个此文件。

  通过命令cat /proc/net/pktgen/pgctrl可以查看pktgen的版本等信息:

1

#cat /proc/net/pktgen/pgctrl<br>Packet Generator for packet performance testing. Version: 2.74

  2.1使用pktgen一些需要注意的地方

  1)中断亲和力

  当使用某个线程(kpktgend_x)通过某个端口(ethx)发送(接受)数据时,我们应该把这个端口所对应的中断绑定到某一个CPU上,从而防止CPU的变动(操作系统引起的)导致CPU缓存的丢失。具体做法如下

  首先,通过以下命令查看ethx所对应的中断,在这里我们以eth3为例


# cat /proc/interrupts | grep eth3

47: 45836 0 0 0 PCI-MSI-edge eth3-TxRx-0
48: 45836 0 0 0 PCI-MSI-edge eth3-TxRx-1
49: 45836 0 0 0 PCI-MSI-edge eth3-TxRx-2
50: 45836 0 0 0 PCI-MSI-edge eth3-TxRx-3
51: 0 0 0 0 PCI-MSI-edge eth3:lsc

 由上可以看出eth3使用了五个中断号,为47-51,我们在这里将其都绑定在CPU0上

echo 1 > /proc/irq/47/smp_affinity

echo 1 > /proc/irq/48/smp_affinity

echo 1 > /proc/irq/49/smp_affinity

echo 1 > /proc/irq/50/smp_affinity

echo 1 > /proc/irq/51/smp_affinity

在文件 /proc/irq/51/smp_affinity里面,使用的是16进制数,从低位到高位分别表示CPU0-->CPUn,1表示绑定,0表示不绑定。1就是0001,表示只绑定cpu0,如果是5,就是0101,表示绑定cpu0和cpu2

当然若你分开绑定的话,在大数据流的时候可以均摊CPU的负担,可能对最高性能有所提升,具体就不清楚了,这个应该还和Intel网卡的多队列相关了,有关分析有待进一步实验。

Robert测试结果说明,正确的中断亲和力绑定,对发送速率有60%的提升。

  2)clone_skb:限制内存的分配(clone_skb应该只是复制skb的结构体,不复制数据区)

    此部分还没有看懂,应该是跟cpu高速缓存相关,先放着,不懂并不影响后面的实验。

  3)延时:减小发送速率

    在发送一个数据包后延时一会,延时的单位是ns级,从而达到减小发送速率的目的。若延时时间大于发送时间,应该是可以通过此功能达到每秒发送特定数据包个数的效果,即安特定的频率发送数据包。

  2.2搭建实验环境

 1)实验拓扑如下

1

2

3

4

5

6

7

8

9

10

11

12

13

1

+-----------+           +-----------+

2

| Host1     |           |  Host2     |

3

|       eth1 +-----------+nf0       |

4

|           |           |           |

5

|           |           |           |

6

7

+-----------+           +-----------+

  首先我们看下一个简单代码,对pktgen的shell 控制有个直观感受,你可以先试着看看此代码,也可以直接跳过,先看看下面的内容,然后再回过来看此代码

#!/bin/sh
# pktgen.conf -- Sample configuration for send on two devices on a UP system

#modprobe pktgen

if [[ `lsmod | grep pktgen` == "" ]];then
   modprobe pktgen
fi

if [[ $1 == "" ]];then
   pktsize=550
else
   pktsize=$1
fi

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
}

# On UP systems only one thread exists -- so just add devices
# We use eth1, eth1

echo "Adding devices to run".

PGDEV=/proc/net/pktgen/kpktgend_0
pgset "rem_device_all"
pgset "add_device eth1"
pgset "max_before_softirq 1"

# Configure the individual devices
echo "Configuring devices"

PGDEV=/proc/net/pktgen/eth1

pgset "clone_skb 1000"
pgset "pkt_size $pktsize"
pgset "src_mac 00:1B:21:90:4B:E4"
pgset "flag IPSRC_RND"
pgset "src_min 10.0.0.2"
pgset "src_max 10.0.0.255"
pgset "dst 10.0.0.1"
pgset "dst_mac  00:4E:46:31:30:00"
pgset "count 0"

# Time to run

PGDEV=/proc/net/pktgen/pgctrl
echo "pkgsize:$pktsize"
echo "Running... ctrl^C to stop"

pgset "start"

echo "Done"

 

  2)pktgen所有命令解释如下

pktgen命令

Pktgen控制命令

start

所有的线程开始发送

stop

停止

线程的控制命令

add_device

添加某个端口到某个线程

rem_device_all

删除绑定在某个线程的所有端口

max_before_softirq

在最多发送多少个数据包后,执行do_softirq()

端口命令

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

         最大值

src_min

源IP最小值

src_max

     最大值

dst6

目的IPv6地址

src6

源IPv6地址

dstmac

目的mac

srcmac

源mac

src_mac_count

源mac的数量,从srcmac设置的mac开始轮询

dst_mac_count

同上

udp_src_min

最小源udp端口号

udp_src_max

最大源udp端口号

udp_dst_min

最小目的udp端口号

udp_dst_max

最大目的udp端口号

flows

并发流的个数

flowlen

流的长度

Flags

IPSRC_RND

IPDST_RND

TXSIZE_RND

UDPSRC_RND

UDPDST_RND

MACSRC_RND

MACDST_RND

PSRC_RND 源IP随机发送

  

学习地址:Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家(免费订阅,永久学习)

【文章福利】需要更多DPDK/SPDK学习资料加群793599096(资料包括C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,大厂面试题 等)可以自行添加学习交流群点击这里噢~

3)配置实例

通过/proc接口配置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
}

  pktgen.conf-1 :在当CPU系统中将eth1 eth2 绑定到线程0,部分代码如下

PGDEV=/proc/net/pktgen/kpktgend_0
pgset "rem_device_all"
pgset "add_device eth1"
pgset "add_device eth2"

  pktgen.conf-2: eth1使用线程0 eth2使用线程1发送,部分代码如下

PGDEV=/proc/net/pktgen/kpktgend_0
pgset "rem_device_all"
pgset "add_device eth1"

PGDEV=/proc/net/pktgen/kpktgend_1
pgset "rem_device_all"
pgset "add_device eth2"

  pktgen.conf-3:在双cpu系统中 eth1 eth2都使用线程0发送,部分代码如下

PGDEV=/proc/net/pktgen/kpktgend_0
pgset "rem_device_all"
pgset "add_device eth1"
pgset  "add_device eth2"

PGDEV=/proc/net/pktgen/kpktgend_1
pgset "rem_device_all
PGDEV=/proc/net/pktgen/eth1
pgset "clone_skb 0"
pgset "flag IPDST_RND"
pgset "dst_min 10.0.0.0"
pgset "dst_max 10.255.255.255"

  pktgen.conf-5:用于路由流测试的脚本,同样注意 clone_skb 0

PGDEV=/proc/net/pktgen/eth1
pgset "clone_skb 0"
pgset "flag IPDST_RND"
pgset "dst_min 10.0.0.0"
pgset "dst_max 10.255.255.255"
#8k concurrent flows at 4 pkts
pgset "flows 8192"
pgset "flowlen 4"

  最后贴一个比较复杂的脚本:

#Script contributed by Grant Grundler
# <grundler@parisc-linux.org>
# Note! 10 devices
PGDEV=/proc/net/pktgen/kpktgend_0
pgset "rem_device_all"
pgset "add_device eth3"
pgset "add_device eth5"
pgset "add_device eth7"
pgset "add_device eth9"
pgset "add_device eth11"
pgset "max_before_softirq 10000"
PGDEV=/proc/net/pktgen/kpktgend_1
pgset "rem_device_all"
pgset "add_device eth2"
pgset "add_device eth4"
pgset "add_device eth6"
pgset "add_device eth8"
pgset "add_device eth10"
pgset "max_before_softirq 10000"
# Configure the individual devices
for i in 2 3 4 5 6 7 8 9 10 11
do
PGDEV=/proc/net/pktgen/eth$i
echo "Configuring $PGDEV"
pgset "clone_skb 500000"
pgset "min_pkt_size 60"
pgset "max_pkt_size 60"
pgset "dst 192.168.3.10$i"
pgset "dst_mac 01:02:03:04:05:0$i"
pgset "count 0"
done
echo "Running... CTRL-C to stop"
PGDEV=/proc/net/pktgen/pgctrl
pgset "start"
tail -2 /proc/net/pktgen/eth*
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pktgen网络测试工具介绍 的相关文章

  • 是否可以从 C++ 应用程序调用 C# 应用程序?

    我是一名编程学生 现在我已经上了两门 C 课程 这个学期我将参加我的第一门 C 课程 出于好奇 是否可以从 C 应用程序调用 C 应用程序 如果是的话 是否还可以检查运行该程序的计算机是否具有 NET框架 我只是很好奇 我想如果可能的话 这
  • 无法将 std::min 传递给函数,std::min 的副本有效

    Passing std min函数无法编译 我复制了 libcpp 声明std min进入我的源文件并且它可以工作 std 版本有什么问题 clang 和 gcc 也会发生同样的情况 在 Godbolt 上测试 https godbolt
  • IEnumerable 的 String.Join(string, string[]) 的类似物

    class String包含非常有用的方法 String Join string string 它从数组创建一个字符串 用给定的符号分隔数组的每个元素 但一般来说 它不会在最后一个元素之后添加分隔符 我将它用于 ASP NET 编码 以用
  • C free() 是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 malloc 和 free 如何工作 https stackoverflow com questions 1119134 how malloc and free work include
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 叮当错误?命名空间模板类的朋友

    以下代码在 clang 下无法编译 但在 gcc 和 VS 下可以编译 template
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • 在 C++11 中移出 stdpriority_queue 的元素

    最小的工作示例 include
  • 通过 C# Mailkit / Mimekit 发送电子邮件,但出现服务器证书错误

    Visual Studio 2015 中的 0 代码 1 我正在使用 Mailkit 最新版本 1 18 1 1 从我自己的电子邮件服务器发送电子邮件 2 电子邮件服务器具有不受信任的自签名证书 3 我在代码中添加了以下两行 以忽略服务器证
  • 使用 C# 中的 Google 地图 API 和 SSIS 包获取行驶距离

    更新 找到了谷歌距离矩阵并尝试相应地修改我的代码 我在这里收到无效参数错误 return new GeoLocation dstnc uri ToString catch return new GeoLocation 0 0 https 基
  • Xamarin - SignalR 挂在连接上

    我正在尝试将我的 Xamarin 应用程序连接到托管在 Azure 上的 SignalR 后端 我遇到的问题是每次我在 HubConnection 上调用 StartAsync 时 它都会挂起客户端并且请求永远不会完成 我尝试通过应用程序进
  • Resharper:IEnumerable 的可能多重枚举

    我正在使用新的 Resharper 版本 6 在我的代码中的几个地方 它给一些文本加了下划线 并警告我可能存在IEnumerable 可能的多重枚举 我理解这意味着什么 并在适当的情况下采纳了建议 但在某些情况下 我不确定这实际上是一个大问
  • 如何使用 CSI.exe 脚本参数

    当你运行csi exe 安装了 Visual Studio 2015 update 2 您将得到以下语法 Microsoft R Visual C Interactive Compiler version 1 2 0 51106 Copyr
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速进行阿尔法混合 https stackoverflow com questions 1102692 how to do alpha blend fast 对 2 个 RGBA 整数 颜色进行
  • 如何将 int 作为“void *”传递给线程启动函数?

    我最初有一个用于斐波那契变量数组的全局变量 但发现这是不允许的 我需要进行基本的多线程处理并处理竞争条件 但我无法在 pthread 创建中将 int 作为 void 参数提供 我尝试过使用常量指针 但没有成功 由于某些奇怪的原因 void
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可

随机推荐

  • 升级到Android Studio 3.2.1 ,报 org.gradle.internal.exceptions.LocationAwareException

    最近收到AS版本的推送就果断更新了 更新以后 打开自己最近的项目 报如下错误 No route to host connect failed Caused by org gradle internal exceptions Location
  • Python 我编码遇到的错误

    ValueError invalid literal for int with base 10 0 000 Traceback most recent call last File
  • Hadoop环境搭建(主机名、Ip地址、映射及网络配置)

    一 在安装的虚拟机上修改主机名地址 1 显示当前主机名命令 hostname 2 修改主机名命令 方法 输入 vi etc hostname 方法 输入 hostnamectl set hostname 进入后在编辑模式下 删除原来的主机名
  • java操作excel获取每列的信息并按照学号-姓名格式创建文件夹

    1 导入Maven依赖
  • 数据库连接工具类

    数据库连接 概述 一 jdbc 实验环境搭建 二 Druid连接数据库 实验环境搭建 三 Maven连接数据库 实验环境搭建 四 mybatis连接数据库 实验环境搭建 五 Spring连接数据库 六 SSM 概述 什么是JDBC Java
  • 前端实现Jest单元测试

    介绍 最近在学一些关于工程化的内容 里面正好提到了jest单元测试 首先简单理解一下什么是单元测试 举个例子 小明同学偶然发现海海同学做的组件库不错 想学习一下 于是就拉了代码 不过在看代码的过程中发现有的代码有更优性能的方法 但是呢他自己
  • ctf.show web web1-web10

    ctf show web web1 web10笔记 记录一些web的知识点 本人刚开始学习web很多资料都是借鉴大佬的 许多复现的过程都是大同小异的 写的菜了请大佬们下手轻点 web1 一道简单的入门题 打开环境发现只有一串英文 flag在
  • 唯一索引比普通索引快吗?运行原理是什么?

    推荐阅读 项目实战 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画 AI讲话 翻译 GPU点亮AI想象空间 资源分享 史上最全文档AI绘画stab
  • 从源码角度深入分析iScroll中的scrollToElement方法

    问题1 官方解释 scrollToElement el time offsetX offsetY easing You re gonna like this Sit tight The only mandatory parameter is
  • cocos2d-x-2.2.4 (四) 将MyGame在Android上跑起来

    继续上一篇 我接着在MyGame工程干活 这次要将MyGame运行在Android设备上 要将cocos2dx的项目在Android上跑起来需要NDK和eclipse NDK用来编译cocos2dx的cpp文件 将其打包成动态库文件 例如l
  • 数字信号处理技术(二)变分模态分解(VMD)-Python代码

    本文仅对变分模态分解 VMD 的原理简单介绍和重点介绍模型的应用 1 VMD原理 变分模态分解 VMD 的原理在此不做详细介绍 推荐两个不错的解释参考连接 变分模态分解原理步骤 和VMD算法的介绍 官方源码 2 VMD应用实战 2 1 简介
  • AngularJS系列之JavaScript函数和对象

    转载请注明来源 http blog csdn net caoshiying viewmode contents 这篇文章针对的是有2年以上编程经验的朋友们参考的 作参考资料之用 不从基础讲起 在ES6之前 JavaScript没有class
  • Mybatis 入门

    1 Mybatis 项目构建 新建数据库 CREATE DATABASE mybatis USE mybatis DROP TABLE IF EXISTS user CREATE TABLE user id INT 20 NOT NULL
  • 多元共进|拓宽知识边界,持续增长技能

    在开放且迅速迭代的技术生态中 开发者面临着无限的机遇 与此同时 开发者的知识储备和技能水平也被赋予了更高的期待 2023 Google 开发者大会与开发者们共享了技术新知 也同步提供持续更新的学习资源 包括可以上手实践的课程和练习 加深开发
  • python+opencv+numpy入门

    一 简介 python是一门编程语言 由于其可以调用很多科学计算包 如numpy scipy matplotlib等而功能强大 numpy是python可调用的科学计算包 主要用于矩阵运算 它是python的数值计算扩展 这种工具可用来存储
  • STM32软件加密

    摘要 知识产权的保护 如何让自已辛勤的劳动成果不被别人抄袭 采用有效的手段对IC加密是值得每一个设计者关注的问题 当然 有人说 没有解不了密的IC 的确 解密是一项技术 只要有人类在不断的研究 它就有破解的一天 但是加密后的IC会增加破解的
  • 【数据库实验报告】关于SQL Server 简单的使用

    关于SQL Server 简单的使用 1 登陆SSMS 首先登陆 之前开启了sa账户 现在使用sa账户登陆 2 创建数据库 右键数据库 点击新建数据 输入数据库名称 然后确定 这个时候 已经新建了一个数据库了 现在在左侧管理器中 就可以看到
  • CaffeineCache基本使用 & SpringBoot集成缓存

    文章目录 一 常用API 1 get 2 getAll 3 refresh 二 缓存回收 清除 1 显式回收 2 隐式回收 2 1 基于容量 2 2 基于时间 2 3 基于引用 2 4 基于权重 三 刷新缓存 reload 四 监听器 五
  • 机房建设--服务器机柜尺寸参考

    自建或托管机房中常用的机柜规格为19英寸机柜 宽度 48 26cm 42U高度 1Unit 4 445cm 1 75英寸 选购需注意服务器机柜的进深通常为800mm 19英寸机柜尺度参考 称号 类型 规范尺度 mm 高 宽 深 备注 标准机
  • pktgen网络测试工具介绍

    pktgen是一款网络测试工具 可以用于压力测试 性能测试 负载均衡测试等方面 它使用Lua脚本来生成和发送数据包 并且支持多线程处理 pktgen可以在Linux系统上运行 支持多种协议和数据包类型 如TCP UDP ICMP ARP等