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模块:
#modprobe pktgen
然后你将在你的电脑的/proc/net/pktgen看到以下文件:
kpktgend_0 kpktgend_1 kpktgend_2 kpktgend_3 pgctrl
其中kpktgen_*的多少是根据你的CPU的个数决定的,如我的机子的CPU数目为4,则有四个此文件。
通过命令cat /proc/net/pktgen/pgctrl可以查看pktgen的版本等信息:
#cat /proc/net/pktgen/pgctrl
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
当然若你分开绑定的话,在大数据流的时候可以均摊CPU的负担,可能对最高性能有所提升,具体就不清楚了,这个应该还和Intel网卡的多队列相关了,有关分析有待进一步实验。
Robert测试结果说明,正确的中断亲和力绑定,对发送速率有60%的提升。
2)clone_skb:限制内存的分配(clone_skb应该只是复制skb的结构体,不复制数据区)
此部分还没有看懂,应该是跟cpu高速缓存相关,先放着,不懂并不影响后面的实验。
3)延时:减小发送速率
在发送一个数据包后延时一会,延时的单位是ns级,从而达到减小发送速率的目的。若延时时间大于发送时间,应该是可以通过此功能达到每秒发送特定数据包个数的效果,即安特定的频率发送数据包。
2.2搭建实验环境
1)实验拓扑如下
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随机发送 |
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"
pktgen.conf-4:用于Dos测试的脚本,注意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"
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*
相关链接:
Linux发包工具pktgen教程@苍穹幻想
pktgen使用详细教程的更多相关文章
- SASS教程sass超详细教程
SASS安装及使用(sass教程.详细教程) 采用SASS开发CSS,可以提高开发效率. SASS建立在Ruby的基础之上,所以得先安装Ruby. Ruby的安装: 安装 rubyinstaller- ...
- Git使用详细教程(一)
很久不发博客,最近有兴趣想写点东西,但 Live Writer 不支持从Word复制图片,疯狂吐槽下 Git使用详细教程(一) Git使用详细教程(二) 该教程主要是Git与IntelliJ IDEA ...
- Win7 U盘安装Ubuntu16.04 双系统详细教程
Win7 U盘安装Ubuntu16.04 双系统详细教程 安装主要分为以下几步: 一. 下载Ubuntu 16.04镜像软件: 二. 制作U盘启动盘使用ultraISO: 三. 安装Ubuntu系统: ...
- Windows7 64位系统搭建Cocos2d-x-2.2.1最新版以及Android交叉编译环境(详细教程)
Windows7 64位系统搭建Cocos2d-x-2.2.1最新版以及Android交叉编译环境(详细教程) 声明:本教程在参考了以下博文,并经过自己的摸索后实际操作得出,本教程系本人原创,由于升级 ...
- Ubuntu 16.04安装QQ国际版图文详细教程
因工作需要,我安装了Ubuntu 16.04,但是工作上的很多事情需要QQ联系,然而在Ubuntu上的WebQQ很是不好用,于是在网上搜索了好多个Linux版本的QQ,然而不是功能不全 ...
- Ubuntu-安装-theano+caffe-超详细教程
一.说明 本文是继<Ubuntu-安装-cuda7.0-单显卡-超详细教程> 之后的续篇.theano和caffe是深度学习库,对运算能力需求很大,最好使用cuda进行加速.所以,请先阅读 ...
- Struts2详细教程
Struts2详细教程:http://www.yiibai.com/struts_2/
- Java log4j详细教程
Java log4j详细教程 http://www.jb51.net/article/74475.htm
- [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 )
[分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 ) billcheung 发表于 2011-10-23 00:07:49 https://www.itsk.com ...
随机推荐
- 恢复Linux下被误删除的文件(笔记)
恢复Linux下被误删除的文件 [root@xuegod63 ~]# mount /dev/cdrom /mnt/ 分一个区:sda4 查找:extundelete 分一个区:sda4 [root ...
- 【转】Windows与Linux(Ubuntu)双系统时间不一致的解决方法
当在嵌入式Linux里面备份文件时候,在备份的时候,PC(win7)和开发板的时间都是9:30,但是在开发板发现文件创建时间是9:30,然后u盘插在PC(win7)上,发现文件创建时间是1:30,为什 ...
- 华为測试 字符串运用-password截取
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的password进行通信,比方像这些ABBA.ABA,A,123321,可是他们有时会在開始或结束时增加一些无关的字符以防止别国破解.比 ...
- jquery selector
jquery的选择器功能 1 :lt(index) selector 一组元素选择index之前的元素,若index<0 则倒着选过来 http://api.jquery.com/lt-sele ...
- javascript 切换动画
function startMove(obj, json, fn) { clearInterval(obj.timer); obj.timer = setInterval(function() { v ...
- sqlserver2012一直显示正在还原(Restoring)和从单用户转换成多用户模式(单用户连接中)
如果不需要还原,则使用: restore database test with recovery如果只需要还原,则使用: restore database test with norecovery U ...
- 2014年1月9日 Oracle常见授权与权限回收[转]
1.GRANT 赋于权限 常用的系统权限集合有以下三个: CONNECT(基本的连接), RESOURCE(程序开发), DBA(数据库管理) 常用的数据对象权限有以下五个: ALL ON 数据对象名 ...
- 在Lambda表达式中使用循环变量
在C#5.0之前,如果在foreach循环中的lambda表达式里使用循环变量,那么你会发现一些意想不到的现象,例子如下: , , , }; var actions = new List<Act ...
- canvas写的一个小时钟demo
<!DOCTYPE html> <html> <head> <title>HTML5 Canvas Demo of clock</title> ...
- Hibernate常见接口说明
(一)SessionFactory 1. getCurrentSession()和openSession()区别 getCurrentSession创建的session会和绑定到当前线程,而openS ...