因为要进行性能测试,但是在进行过程中发现当包足够小,发送速率(pps)达到一定程度的时候,是无法再提高包的发送速率的。因此,就有人推荐使用pktgen来进行尝试。通过搜索发现,这个东西有两种形式,一种是直接由linux系统自带的内核模块进行发包(也就是略过协议栈,直接控制发包),另一种是依赖于dpdk的pktgen,需要进行比较复杂的编译(它的编译比较复杂,至今我都没找到centos6对应的补丁从而成功编译pktgen),下面具体说说这两种应用,捋捋思路,看看踩过的坑,从而避免自己再犯同样的错误。
不多说,直接上命令,然后具体解释。
命令 |
解释 |
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的值没有验证,被丢弃好像也是理所当然的,如下图:
在内核没有找到相关模块,需要进行编译的情况下使用。
编译的问题,主要参考链接: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 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
|
最大的坑,就是我看着每个参数都明白,事实证明还是太自信了,人生就是升级打怪兽,从前走过的捷径,都会让自己在某个时刻重新补回来,好了,回到原题。
先说我的错误:之前变成,给个IP就行了,有了IP它自己有arp协议嘛,解析出来mac就可以了,为什么要填mac地址?
可是我忘记了arp协议是在有协议栈的情况下,操作系统帮忙做的,现在是直接从内核发包的,于是所有的数据都得自己构造啊。于是,那我填上接收端的mac地址好了,但是总是感觉有哪里不太对,要是测个试就这么麻烦,如果不是局域网环境,那我要怎么知道接收端的mac地址呢?
不管怎么说,反正我先把对端的mac地址填上了进行测试,结果?结果当然是失败了啊。
重点来了:
Mac地址只能在子网中进行识别,因此在初始发包的时候,,由于mac地址设置的不正确,包根本就出不去当前的子网,那mac地址应该设置为什么?网关地址。
如何查看?
route -n arp -n |
经过这样的踩坑完毕,终于能够正常的进行包传送了,可是由于复杂的网络环境,这些包到哪里会丢失真的就不得而知了。
这个不同于内核模块,是个软件,可以直接执行的,但是编译过程相对复杂。
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