Pktgen的一些总结


 

因为要进行性能测试,但是在进行过程中发现当包足够小,发送速率(pps)达到一定程度的时候,是无法再提高包的发送速率的。因此,就有人推荐使用pktgen来进行尝试。通过搜索发现,这个东西有两种形式,一种是直接由linux系统自带的内核模块进行发包(也就是略过协议栈,直接控制发包),另一种是依赖于dpdk的pktgen,需要进行比较复杂的编译(它的编译比较复杂,至今我都没找到centos6对应的补丁从而成功编译pktgen),下面具体说说这两种应用,捋捋思路,看看踩过的坑,从而避免自己再犯同样的错误。

 

1     依赖内核模块的pktgen

1.1    使用

不多说,直接上命令,然后具体解释。

命令

解释

modprobe pktgen

载入模块1)见下文

lsmod |grep -i pktgen

查看是否成功加载

echo "add_device eth0" > /proc/net/pktgen/kpktgend_0

绑定设备

cat /proc/net/pktgen/eth0

查看绑定情况

cat /proc/net/pktgen/pgctrl

查看命令

echo "min_pkt_size 64" > /proc/net/pktgen/eth0

设置最小的包大小

echo "max_pkt_size 9000" > /proc/net/pktgen/eth0

设置最大的包大小

echo "dst_mac 0A:C8:7A:CF:64:44" > /proc/net/pktgen/eth0

设置目的mac地址,注意此处有坑,见后面的踩坑

echo "count 0" > /proc/net/pktgen/eth0

设置发送的数据包量

echo "dst_min X.X.X.X" > /proc/net/pktgen/eth0

设置目的IP的范围(最小值,包含)

echo "dst_max X.X.X.X " > /proc/net/pktgen/eth0

设置目的IP的范围(最大值,不包含)

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

开始执行

 

1)      也有使用insmod的,但是两者的区别是:比如需要安装b模块,但是b依赖于a模块,因此使用insmod安装就需要先安装a模块再安装b模块;如果使用modprobe的话,就可以直接安装b模块,默认将安装a模块

基本上设置完成后就可以进行测试,要查看是否有流量,可以使用ifstat,tcpdump工具查看,使用应用层的抓包工具是无法看到的。

发送包的情况如下图所示:

接收包的情况如下图所示:

注意:上面的图中有个discard明显标识,也就是说pktgen的包是会被丢弃的。

其他更具体的使用,参考链接:

https://www.kernel.org/doc/Documentation/networking/pktgen.txt

 

仔细观察参数,好像有UDP包添加checksunm的项,于是尝试了一下,可是结果是令人失望的,依然是discard,使用wireshark查看包的状况发现checksum的值没有验证,被丢弃好像也是理所当然的,如下图:

 

1.2    编译

在内核没有找到相关模块,需要进行编译的情况下使用。

编译的问题,主要参考链接:https://github.com/danieltt/pktgen

贴主要内容在这里说一说:

Kernel module for packet generator and packet receiver with statistics. Source based from Linux Kernel pktgen 3.11.0

这句明显看要有对应的版本啊,它后面的链接所提供的版本不是很全,所有的版本下载在这里找

https://elixir.bootlin.com/linux/v3.10-rc7/source/net/core/pktgen.c

To compile the headers of the running kernel are required.

sudo apt-get install linux-headers-$(uname -r)

好的,这步是要安装对应的头文件,但是我的centos6无论怎么找都没有找到对应的头文件安装,不过好在我之前装了个内核开放扩展包,后来证明也能够使用。

yum install kernel-devel.x86_64

Current version for kernel 3.11.0. It uses netfilter hooks to process incomming packets.

To compile and load the module:

make

这一步就是神挡杀神,佛挡杀佛了,每个人的情况不一样,但是少不得总是要出现奇奇怪怪的问题,自求多福吧,举例来说明,我的就是说uint64没有定义,然后加个include ok

insmod ./pktgen.ko

不多说啊,这一步就是安装模块嘛,但是安装之前如果是在尝试了使用内核已有模块直接使用的情况,记得使用rmmod进行模块卸载,然后再安装

it is necessary to map each interrupt with a different core. You can use [eth-affinity] (https://github.com/jelaas/eth-affinity) to set up automaticaly.

eth-affinity

讲真,这个我还没弄的特别清楚,好像是要绑定中断,反正就是安装说明自动安装了

to start the receiver, you need to be root

 

1.3    踩坑

最大的坑,就是我看着每个参数都明白,事实证明还是太自信了,人生就是升级打怪兽,从前走过的捷径,都会让自己在某个时刻重新补回来,好了,回到原题。

先说我的错误:之前变成,给个IP就行了,有了IP它自己有arp协议嘛,解析出来mac就可以了,为什么要填mac地址?

可是我忘记了arp协议是在有协议栈的情况下,操作系统帮忙做的,现在是直接从内核发包的,于是所有的数据都得自己构造啊。于是,那我填上接收端的mac地址好了,但是总是感觉有哪里不太对,要是测个试就这么麻烦,如果不是局域网环境,那我要怎么知道接收端的mac地址呢?

不管怎么说,反正我先把对端的mac地址填上了进行测试,结果?结果当然是失败了啊。

重点来了:

Mac地址只能在子网中进行识别,因此在初始发包的时候,,由于mac地址设置的不正确,包根本就出不去当前的子网,那mac地址应该设置为什么?网关地址。

如何查看?

route -n

arp -n

 

经过这样的踩坑完毕,终于能够正常的进行包传送了,可是由于复杂的网络环境,这些包到哪里会丢失真的就不得而知了。

2     依赖dpdk的pktgen

这个不同于内核模块,是个软件,可以直接执行的,但是编译过程相对复杂。

2.1    编译

1.       yum install kernel-devel.x86_64安装内核开发包

2.       编译dpdk:

参考文档:https://media.readthedocs.org/pdf/dpdk/latest/dpdk.pdf

Note:在centos7下应该是没有问题的,但是在centos6环境下需要有patch

make configT=x86_64-native-linuxapp-gcc

sed -ri's,(PMD_PCAP=).*,\1y,' build/.config

make

其实具体的选项,在usertools文件夹中的setup.sh中都有具体的指明,可以按照具体的步骤来做,但是真心的,永远不知道哪里忽然就错了,还是要一个错误一个错误找的。

中间设计开启大页、numa设置等比较具体的内容

中间可能遇到,修改内核开发包中指向的链接,找不到文件等错误,这些都需要一一解决。

3.       编译pktgen

自己目前没有进展到这一步,放弃了,因为我主要想在centos6的环境下进行试验,这个补丁找不到。具体参考:http://dpdk.org/dev/patchwork/patch/13481/

可以尝试的参考:http://blog.csdn.net/anzhuangguai/article/details/52033983

 

你可能感兴趣的:(操作系统基础)