如果你完全不知道什麼是 Pktgen 可以先從這一篇來了解 Pktgen 簡介 – https://benjr.tw/93300
這次的實驗是從 System A 打封包到 System B , pktgen 封包的傳送與接收 架構圖如下
載入 pktgen 模組
ben@ubuntu~$ sudo su - [sudo] password for ben: root@ubuntu~# modprobe pktgen
指定網路裝置 eth0 給 CPU 0 來處理封包
root@ubuntu:~# echo "add_device eth0" > /proc/net/pktgen/kpktgend_0
封包要從機器 A 傳送到 B 除了要設定 package size 外我們還要指定對方的 MAC Address (00:0C:29:06:A1:F9 -> 00:0C:29:77:5A:56)
root@ubuntu:~# echo "min_pkt_size 64" > /proc/net/pktgen/eth0 root@ubuntu:~# echo "max_pkt_size 9000" > /proc/net/pktgen/eth0 root@ubuntu:~# echo "dst_mac 00:0C:29:77:5A:56" > /proc/net/pktgen/eth0
設定完成,可以先檢查剛剛設定的內容.
root@ubuntu:~# cat /proc/net/pktgen/eth0 Params: count 1000 min_pkt_size: 64 max_pkt_size: 9000 frags: 0 delay: 0 clone_skb: 0 ifname: eth0 flows: 0 flowlen: 0 queue_map_min: 0 queue_map_max: 0 dst_min: dst_max: src_min: src_max: src_mac: 00:0c:29:06:a1:f9 dst_mac: 00:0c:29:77:5a:56 udp_src_min: 9 udp_src_max: 9 udp_dst_min: 9 udp_dst_max: 9 src_mac_count: 0 dst_mac_count: 0 Flags: Current: pkts-sofar: 0 errors: 0 started: 0us stopped: 0us idle: 0us seq_num: 0 cur_dst_mac_offset: 0 cur_src_mac_offset: 0 cur_saddr: 0x0 cur_daddr: 0x0 cur_udp_dst: 0 cur_udp_src: 0 cur_queue_map: 0 flows: 0 Result: OK: dstmac
開始進行測試
root@ubuntu:~# echo "start" > /proc/net/pktgen/pgctrl
測試完畢!!連線正常的話可以看到封包有被傳送出去,機器 B 透過 ifconfig eth0 應該也會發現封包變多了.
root@ubuntu:~# cat /proc/net/pktgen/eth0 Params: count 1000 min_pkt_size: 64 max_pkt_size: 9000 frags: 0 delay: 0 clone_skb: 0 ifname: eth0 flows: 0 flowlen: 0 queue_map_min: 0 queue_map_max: 0 dst_min: dst_max: src_min: src_max: src_mac: 00:0c:29:06:a1:f9 dst_mac: 00:0c:29:77:5a:56 udp_src_min: 9 udp_src_max: 9 udp_dst_min: 9 udp_dst_max: 9 src_mac_count: 0 dst_mac_count: 0 Flags: Current: pkts-sofar: 1000 errors: 0 started: 2015028695039us stopped: 2015028715432us idle: 98us seq_num: 1001 cur_dst_mac_offset: 0 cur_src_mac_offset: 0 cur_saddr: 0x844d200a cur_daddr: 0x0 cur_udp_dst: 9 cur_udp_src: 9 cur_queue_map: 0 flows: 0 Result: OK: 20393(c20294+d98) nsec, 1000 (1064byte,0frags) 49036pps 417Mb/sec (417394432bps) errors: 0
照同樣的設定在 System B 上面,將封包從 System B 打給 System A.
當兩個系統上有多個網路埠時,必須指定不同的 CPU Core 去處理!要不然 Pktgen 只會去處理最後設定的那一個網路裝置.
root@ubuntu:~# echo "add_device eth0" > /proc/net/pktgen/kpktgend_0 root@ubuntu:~# echo "add_device eth1" > /proc/net/pktgen/kpktgend_1
除了兩個系統的對打外, Pktgen 可以用同一個系統自己跟自己的網路埠互相對打,架構圖如下:
那我們可以透過 pktgen 來產生網路的壓力測試或是效能測試嗎??? 答案是可以的.不管是兩個系統的對打,或是同一個系統自己跟自己的網路埠互相對打.
- Pktgen 壓力測試 – https://benjr.tw/93413
- Pktgen 效能測試 – https://benjr.tw/93416
參考使用方式 – http://iori.tw/the-usage-and-introduction-about-the-pktgen/
沒有解決問題,試試搜尋本站其他內容
Hi Benjr大
感謝你將我的文章加到你的 Recommend List 內,在谷哥大神查到的文章均為 TX 的部分,至於 RX 的部分比較少,按照 https://people.kth.se/~danieltt/pktgen/ 裡有提到需要額外在指定Kernel版本下重新編譯 pktgen 的 Module,才有辦法生出 /proc/net/pktgen/pgrx 的 file,或是直接使用 Bifrost/Linux 這支 Distribution,進而從 RX Side 觀察 TX Packet Loss 的情況,上述均參考 http://www.ainoniwa.net/ssp/?p=1019
Thanks for your sharing~
謝謝你的回應,一開始還不太會用 pktgen 參考了你文章很多的說明.
如果系統有兩個網路埠,就可以互打,也應該可以觀察到 RX 的狀態.<- 無法使用,必須使用 netfilter 才能使用,請參考 http://benjr.tw/93460