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 <stdint.h>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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章