因爲要進行性能測試,但是在進行過程中發現當包足夠小,發送速率(pps)達到一定程度的時候,是無法再提高包的發送速率的。因此,就有人推薦使用pktgen來進行嘗試。通過搜索發現,這個東西有兩種形式,一種是直接由linux系統自帶的內核模塊進行發包(也就是略過協議棧,直接控制發包),另一種是依賴於dpdk的pktgen,需要進行比較複雜的編譯(它的編譯比較複雜,至今我都沒找到centos6對應的補丁從而成功編譯pktgen),下面具體說說這兩種應用,捋捋思路,看看踩過的坑,從而避免自己再犯同樣的錯誤。
1 依賴內核模塊的pktgen
1.1 使用
不多說,直接上命令,然後具體解釋。
命令 | 解釋 |
modprobe pktgen | |
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