是什麼 Pktgen (Packet-Generation 是它的全名) ? 它是一個 Linux 核心的模組,它可以以非常快的速度產生封包,跟一般的 iperf , Qperf 測試網路工具相比較,因為 pktgen 不是在 User space( Applcation ),所以它能更精準的算出網路的效能,也可以對網路產生更大的壓力測試.
關於 Kernel , User space 以及 CPU ring 的觀念請參考 https://benjr.tw/3407
要知道 Pktgen 的由來,要先知道 Intel 的 DPDK ( Intel® – Data Plane Development Kit ), Intel 的 DPDK 主要可以加速網路上對於小封包的處理速度 (此應用主要是應用在 10G bite 的網路環境) ,而這 Pktgen 就是用來測試網路流量的封包產生器.
如果你對 DPDK 有興趣可以先參考一下什麼是 DPDK – https://benjr.tw/49010 ??
前面講過 Pktgen 不是一支應用程式,他是一個模組 pktgen.ko ,目前很多核心都支援而且可以直接使用,像是我使用的 Ubuntu 14.04 / RHEL 6.5 裡面已經內建了 Pktgen 了.
第一步就是先檢查 pktgen 模組是否存在.
ben@ubuntu~$ sudo su - [sudo] password for ben: root@ubuntu~# modprobe pktgen root@ubuntu~# lsmod |grep -i pktgen pktgen 53234 0
如果找不到 pktgen 模組,請自行去 pktgen 的下載點 http://dpdk.org/browse/apps/pktgen-dpdk/refs/
確定上了 pktgen 模組後就可以開始使用 pktgen 了,不過 pktgen 跟一般測試工具不太一樣,他沒有任何相對應的程式可以使用,完全是針對 /proc/net/pktgen 目錄下的設定檔來做即可 (在 Linux 下 /proc 這個目錄下的資訊都是和核心相關的資料.以及其他硬體的相關設定值.) 聽起來很怪,先來看看 /proc/net/pktgen 這個目錄下面有什麼吧!!
root@ubuntu:~$ sudo su - [sudo] password for ben: root@ubuntu:~# ll /proc/net/pktgen/ total 0 dr-xr-xr-x 2 root root 0 Dec 17 00:11 ./ dr-xr-xr-x 6 root root 0 Dec 17 00:11 ../ -rw------- 1 root root 0 Dec 17 00:11 kpktgend_0 -rw------- 1 root root 0 Dec 17 00:11 pgctrl
只有這兩個檔案
- kpktgend_0
你可能會看到多個 kpktgend ,kpktgend_0, kpktgend_1, kpktgend_2, kpktgend_3 …. ,這跟你的 CPU 的核心數量會一致,在使用 pktgen 的時候可以設定哪一個網路埠使用哪一個 CPU 核心來處理資料,kpktgend_0 就對應到 CPU 0 這個核心,以此類推 kpktgend_1 對應到 CPU 1 , kpktgend_2 對應到 CPU 2, kpktgend_3 對應到 CPU 3 … - pgctrl
主要是用來控制 pktgen 的行為,可以參考 linux 原始碼目錄 Documentation/networking/pktgen.txt 裡面文件 或是 https://www.kernel.org/doc/Documentation/networking/pktgen.txt 提供一些指令的參考.
如果直接看該檔案內容可以看到 pktgen 的版本名稱.root@ubuntu:~# cat /proc/net/pktgen/pgctrl Packet Generator for packet performance testing. Version: 2.74
好了!!要怎麼用呢!!
第二步就是指定網路裝置 eth 給哪一個 CPU 來處理封包,透過 kpktgend_x 的 add_device 的指令來指定.
root@ubuntu:~# echo "add_device eth0" > /proc/net/pktgen/kpktgend_0
你會在 /proc/net/pktgen 看到多了一個檔案 eth0 ,這個裝置就是等一下我們要測試的裝置.如果你有多個網路裝置 eth1 , eth2 … 都是透過這個方式來指定.
root@ubuntu:/# ll /proc/net/pktgen/ total 0 dr-xr-xr-x 2 root root 0 Dec 17 01:32 ./ dr-xr-xr-x 6 root root 0 Dec 17 01:32 ../ -rw------- 1 root root 0 Dec 17 01:32 eth0 -rw------- 1 root root 0 Dec 17 01:32 kpktgend_0 -rw------- 1 root root 0 Dec 17 01:32 pgctrl
我們看一下 eth0 裡面到底有什麼資料.
root@ubuntu:~# cat /proc/net/pktgen/eth0 Params: count 1000 min_pkt_size: 0 max_pkt_size: 0 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:8f:8a:2b dst_mac: 00:00:00:00:00:00 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: 0.0.0.0 cur_daddr: 0.0.0.0 cur_udp_dst: 0 cur_udp_src: 0 cur_queue_map: 0 flows: 0 Result: Idle
先來看這三個參數.
- count 1000
傳送封包次數 - min_pkt_size: 0
最小封包 - max_pkt_size: 0
最大封包
因為預設封包大小為 0,所以這邊隨便設個大小.
root@ubuntu:~# echo "pkt_size 9014" > /proc/net/pktgen/eth0 root@ubuntu:~# cat /proc/net/pktgen/eth0 Params: count 1000 min_pkt_size: 9014 max_pkt_size: 9014 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:8f:8a:2b dst_mac: 00:00:00:00:00:00 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: 0.0.0.0 cur_daddr: 0.0.0.0 cur_udp_dst: 0 cur_udp_src: 0 cur_queue_map: 0 flows: 0 Result: OK: pkt_size=9014
透過 pkt_size 可以同時設定 min_pkt_size: 9014 以及 max_pkt_size: 9014 ,當然我們也可以分開設定 min_pkt_size 以及 max_pkt_size .
先記錄一下 eth0 封包狀況,TX 是 3795 .
root@ubuntu:~# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:0c:29:8f:8a:2b inet addr:172.16.175.140 Bcast:172.16.175.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe8f:8a2b/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:4626 errors:0 dropped:0 overruns:0 frame:0 TX packets:3795 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2331865 (2.3 MB) TX bytes:559102 (559.1 KB)
好了現在就可以執行 pktgen ,還記得 /proc/net/pktgen/pgctrl 是用來控制 pktgen 行為的檔案.
root@ubuntu:~# echo "start" > /proc/net/pktgen/pgctrl
測試完畢,來看看結果吧! eth0 TX packets 從 3795 變成 4832,不一定會剛好 1000 個封包(但一定要大於你所設定的封包),網路裝置其實一直在嘗試傳送與接收封包
root@ubuntu:~# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:0c:29:8f:8a:2b inet addr:172.16.175.140 Bcast:172.16.175.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe8f:8a2b/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:4674 errors:0 dropped:0 overruns:0 frame:0 TX packets:4832 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2336133 (2.3 MB) TX bytes:9575951 (9.5 MB)
/proc/net/pktgen/eth0 也來觀察一下他的變化.
root@ubuntu:~# cat /proc/net/pktgen/eth0 Params: count 1000 min_pkt_size: 9014 max_pkt_size: 9014 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:8f:8a:2b dst_mac: 00:00:00:00:00:00 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: 11143620548us stopped: 11143646302us idle: 367us seq_num: 1001 cur_dst_mac_offset: 0 cur_src_mac_offset: 0 cur_saddr: 172.16.175.140 cur_daddr: 0.0.0.0 cur_udp_dst: 9 cur_udp_src: 9 cur_queue_map: 0 flows: 0 Result: OK: 25753(c25386+d367) usec, 1000 (9014byte,0frags) 38829pps 2800Mb/sec (2800036848bps) errors: 0
原先的 Result: OK: pkt_size=9014 只有這一行.
執行後的 Result: OK: 25753(c25386+d367) usec, 1000 (9014byte,0frags)
38829pps 2800Mb/sec (2800036848bps) errors: 0
可以看到測試結果 OK
測試時間 25753 usec (u 10負 6 次方,m:1e-3 u:1e-6 n:1e-9)
傳送封包數 1000,以及封包大小 9014byte,以及是否有破碎的封包 0 frags
每秒傳送封包數 38829pps(package per second)
每秒傳送多少封包 2800Mb/sec
以及是否有錯誤 errors: 0
上面只是大概讓我們了解 pktgen 是什麼,怎麼用,上面的測試是沒有太大的意義,因為封包傳出去沒有指定給任何網路裝置,後面的介紹會完整介紹如何指定.
- Pktgen 封包的傳送與接收 – https://benjr.tw/93394
- Pktgen 壓力測試 – https://benjr.tw/93413
- Pktgen 效能測試 – https://benjr.tw/93416
- Pktgen Commands – https://benjr.tw/93439
- Pktgen netfilter – https://benjr.tw/93460
6 thoughts on “Pktgen 簡介”