7,242 瀏覽數

Pktgen 簡介

是什麼 Pktgen (Packet-Generation 是它的全名) ? 它是一個 Linux 核心的模組,它可以以非常快的速度產生封包,跟一般的 iperf , Qperf 測試網路工具相比較,因為 pktgen 不是在 User space( Applcation ),所以它能更精準的算出網路的效能,也可以對網路產生更大的壓力測試.

關於 Kernel , User space 以及 CPU ring 的觀念請參考 http://benjr.tw/3407

要知道 Pktgen 的由來,要先知道 Intel 的 DPDK ( Intel® – Data Plane Development Kit ), Intel 的 DPDK 主要可以加速網路上對於小封包的處理速度 (此應用主要是應用在 10G bite 的網路環境) ,而這 Pktgen 就是用來測試網路流量的封包產生器.

如果你對 DPDK 有興趣可以先參考一下什麼是 DPDK ??

前面講過 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 是什麼,怎麼用,上面的測試是沒有太大的意義,因為封包傳出去沒有指定給任何網路裝置,後面的介紹會完整介紹如何指定.

6 個網友的想法 “Pktgen 簡介

  1. 自動參照通知: Pktgen – netfilter | Benjr.tw

  2. 自動參照通知: 常用的 Performance / Monitor 測試工具 | Benjr.tw

  3. 自動參照通知: Pktgen – Commands | Benjr.tw

  4. 自動參照通知: Pkgen 效能測試 | Benjr.tw

  5. 自動參照通知: Pkgen 壓力測試 | Benjr.tw

  6. 自動參照通知: pktgen 封包的傳送與接收 | Benjr.tw

發表迴響