pktgen使用详细教程
pktgen使用详细教程
网上有很多讲解pktgen的文章,但总是不够全面细致,看完之后自己还是不会写pktgen测试脚本,为此本文对pktgen进行详细的阐述,让大家看完本文后能够自己动手写pktgen shell.
#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
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级,从而达到减小发送速率的目的。若延时时间大于发送时间,应该是可以通过此功能达到每秒发送特定数据包个数的效果,即安特定的频率发送数据包。
1)实验拓扑如下
1 +-----------+ +-----------+ 2 | Host1 | | Host2 | 3 | eth1 +-----------+nf0 | 4 | | | | 5 | | | | 6 7 +-----------+ +-----------+
首先我们看下一个简单代码,对pktgen的shell 控制有个直观感受,你可以先试着看看此代码,也可以直接跳过,先看看下面的内容,然后再回过来看此代码
[[ `lsmod | grep pktgen` == [[ == =550
= > =`cat | fgrep [ = |>
=/proc/net/pktgen/
echo =/proc/net/pktgen/
=/proc/net/pktgen/
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随机发送 |
> =`cat | fgrep [ = |>
pktgen.conf-1 :在当CPU系统中将eth1 eth2 绑定到线程0,部分代码如下
PGDEV=/proc/net/pktgen/
pktgen.conf-2: eth1使用线程0 eth2使用线程1发送,部分代码如下
PGDEV=/proc/net/pktgen/=/proc/net/pktgen/
pktgen.conf-3:在双cpu系统中 eth1 eth2都使用线程0发送,部分代码如下
PGDEV=/proc/net/pktgen/=/proc/net/pktgen/
pktgen.conf-4:用于Dos测试的脚本,注意clone_skb 0,部分代码如下
PGDEV=/proc/net/pktgen/
pktgen.conf-5:用于路由流测试的脚本,同样注意 clone_skb 0
PGDEV=/proc/net/pktgen/
pgset
最后贴一个比较复杂的脚本:
PGDEV=/proc/net/pktgen/=/proc/net/pktgen/
i 2 3 4 5 6 7 8 9 10 11
=/proc/net/pktgen/eth=/proc/net/pktgen/-2 /proc/net/pktgen/eth*
相关链接:
Linux发包工具pktgen教程@苍穹幻想
评论暂时关闭