pktgen使用指南


pktgen使用指南

簡介

​ pktgen是一個位於linux內核層的高性能網絡測試工具,由瑞士皇家理工大學的TSlab實驗室的Robert Olsson開發的(現在應該不在皇家理工了),主要用來測試網絡驅動與網卡設備,支持多線程,能夠產生隨機mac地址、IP地址、UDP端口號的數據包,pktgen 的作者使用多CPU處理器在不同的PCI總線(pci 、pcie等總線)上用千兆以太網卡做過測試(pktgen的表現依賴於CPU處理速率、內存延時、pci總線速率等硬件參數),發送數據速率甚至可以大於10GBit/s。可見是可以滿足大多數的網卡等測試需求。
  pktgen的配置與統計信息查看都使用/proc文件系統完成,/proc文件系統是一種特殊的,有軟件創建的文件系統,內核使用/proc文件系統向外界導出信息,外界也可以通過它配置內核態的一些進程的參數,如ps top uptime等linux發行版中的很多工具就是通過/proc實現的.在大多情況下,我們只用/proc讀出數據(用於調試內核驅動等),而在pktgen中配置命令就用到了/proc的寫入數據功能。

加載pktgen模塊

現在版本的linux發行版大多加入了pktgen,使用以下命令加載pktgen模塊:

[root@localhost ~]#modprobe pktgen

加載pktgen內核模塊后,會在每個CPU上啟動一個內核線程,內核線程的名字從kpktgend_0開始依次增加,下面是四個CPU的主機在加載pktgen后的ps信息

[root@localhost ~]# ps -ef | grep pktgen
root      1610     2  0 15:09 ?        00:00:00 [kpktgend_0]
root      1611     2  0 15:09 ?        00:00:00 [kpktgend_1]
root      1612     2  0 15:09 ?        00:00:00 [kpktgend_2]
root      1613     2  0 15:09 ?        00:00:00 [kpktgend_3]

前面也講到過,pktgen的配置和統計是通過proc文件來完成的,加載pktgen模塊后pktgen 的proc文件(在/proc/net/pktgen目錄下),kpktgend_x是對應的內核線程的信息,pgctl用來控制pktgen的開始和關閉

kpktgend_0  kpktgend_1  kpktgend_2  kpktgend_3  pgctrl

pktgen使用

將某個端口(如eth0)放到對應的內核線程中配置發送報文的字段

[root@localhost pktgen]# cat kpktgend_1
Running: 
Stopped: eth0 
Result: OK: add_device=eth01echo rem_device_all>kpktgend_1  //為了安全起見,最好先刪除綁定在某個線程(kpktgend_1)的所有端口 2echo add_device eth0>kpktgend_1  //添加某個端口(eth1)到某個線程(kpktgend_0) 

添加端口后kpktgend_x的信息是

[root@localhost pktgen]# ls
eth0  kpktgend_0  kpktgend_1  kpktgend_2  kpktgend_3  pgctrlh0 

增加端口后,pktgen目錄下也會創建一個和端口同名的文件,如ethx

[root@localhost pktgen]# ls 
eth0  kpktgend_0  kpktgend_1  kpktgend_2  kpktgend_3  pgctrl 

配置發送報文的字段

echo count 1000>eth0 //發送數據包的個數,0 表示一直發送
echo clone_skb 0>eth0 //表示復制多少數據包,clone_skb=1000,克隆1000報文;clone_skb=0表示不克隆,就是一直發送同一個報文。
echo pkt_size 1000>eth0
echo dst 192.168.192.33>eth0
echo dst_mac 00:15:5d:4b:19:b1>eth0

啟動pktgen

echo start>pgctrl 

查看統計信息

[root@localhost pktgen]# cat eth0 
Params: count 1000  min_pkt_size: 58  max_pkt_size: 58
     frags: 0  delay: 0  clone_skb: 0  ifname: eth0
     flows: 0 flowlen: 0
     queue_map_min: 0  queue_map_max: 0
     dst_min: 192.168.192.33  dst_max: 
     src_min:   src_max: 
     src_mac: 00:15:5d:01:70:01 dst_mac: 00:15:5d:4b:19:b1
     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: 3424209348us  stopped: 3424219341us idle: 9324us
     seq_num: 1001  cur_dst_mac_offset: 0  cur_src_mac_offset: 0
     cur_saddr: 192.168.192.45  cur_daddr: 192.168.192.33
     cur_udp_dst: 9  cur_udp_src: 9
     cur_queue_map: 0
     flows: 0
Result: OK: 9992(c668+d9324) usec, 1000 (58byte,0frags)
  100072pps 46Mb/sec (46433408bps) errors: 0

pktgen參數

摘自https://www.kernel.org/doc/Documentation/networking/pktgen.txt

測試網絡PPS性能,可以通過配置ratep來指定報文發送速率。

Current commands and configuration options
==========================================
** Pgcontrol commands:
start
stop
reset
** Thread commands:
add_device
rem_device_all
** Device commands:
count
clone_skb
burst
debug
frags
delay
src_mac_count
dst_mac_count
pkt_size
min_pkt_size
max_pkt_size
queue_map_min
queue_map_max
skb_priority
tos           (ipv4)
traffic_class (ipv6)
mpls
udp_src_min
udp_src_max
udp_dst_min
udp_dst_max
node
flag
  IPSRC_RND
  IPDST_RND
  UDPSRC_RND
  UDPDST_RND
  MACSRC_RND
  MACDST_RND
  TXSIZE_RND
  IPV6
  MPLS_RND
  VID_RND
  SVID_RND
  FLOW_SEQ
  QUEUE_MAP_RND
  QUEUE_MAP_CPU
  UDPCSUM
  IPSEC
  NODE_ALLOC
  NO_TIMESTAMP
spi (ipsec)
dst_min
dst_max
src_min
src_max
dst_mac
src_mac

clear_counters
src6
dst6
dst6_max
dst6_min
flows
flowlen
rate
ratep
xmit_mode <start_xmit|netif_receive>

vlan_cfi
vlan_id
vlan_p

svlan_cfi
svlan_id
svlan_p

pktgen腳本

上面的配置稍微有些復雜,對運維人員不太友好,github上提供了更為方便的pktgen的腳本

imghttps://github.com/netoptimizer/network-testing/tree/master/pktgen - Connect to preview

里面提供了多種pktgen的例子,最常用的是pktgen_sample01_simple.sh和pktgen_sample02_multiqueue.sh,

drwxr-xr-x 1 mrwuzs 197121    0 Mar 12 15:24 ./
drwxr-xr-x 1 mrwuzs 197121    0 Mar 12 14:23 ../
-rw-r--r-- 1 mrwuzs 197121 1843 Mar 12 14:23 README.rst
-rw-r--r-- 1 mrwuzs 197121 4219 Mar 12 14:23 functions.sh
-rw-r--r-- 1 mrwuzs 197121 3037 Mar 12 14:23 parameters.sh
-rwxr-xr-x 1 mrwuzs 197121 2840 Mar 12 14:23 pktgen_bench_xmit_mode_netif_receive.sh*
-rwxr-xr-x 1 mrwuzs 197121 1995 Mar 12 14:23 pktgen_bench_xmit_mode_queue_xmit.sh*
-rwxr-xr-x 1 mrwuzs 197121 2029 Mar 12 14:23 pktgen_sample01_simple.sh*
-rwxr-xr-x 1 mrwuzs 197121 2329 Mar 12 14:23 pktgen_sample02_multiqueue.sh*
-rwxr-xr-x 1 mrwuzs 197121 2740 Mar 12 14:23 pktgen_sample03_burst_single_flow.sh*
-rwxr-xr-x 1 mrwuzs 197121 2665 Mar 12 14:23 pktgen_sample04_many_flows.sh*
-rwxr-xr-x 1 mrwuzs 197121 2411 Mar 12 14:23 pktgen_sample05_flow_per_thread.sh*
-rwxr-xr-x 1 mrwuzs 197121 3219 Mar 12 14:23 pktgen_sample06_numa_awared_queue_irq_affinity.sh*
-rwxr-xr-x 1 mrwuzs 197121 3641 Mar 12 14:23 unit_test01_race_add_rem_device_loop.sh*1drwxr-xr-x 1 mrwuzs 197121    0 

剛才的配置就可以簡單化成一條命令,更加方便

./pktgen_sample01_simple.sh -i eth0 -m  00:15:5d:4b:19:b1 -d 192.168.192.33 -t 1 -n 1000

該腳本支持的參數
該腳本是通用腳本,部分參數不支持,需要做簡單修改

Usage: ./pktgen_sample01_simple.sh [-vx] -i ethX
  -i : ($DEV)       output interface/device (required)
  -s : ($PKT_SIZE)  packet size
  -d : ($DEST_IP)   destination IP
  -m : ($DST_MAC)   destination MAC-addr
  -t : ($THREADS)   threads to start
  -f : ($F_THREAD)  index of first thread (zero indexed CPU number)
  -c : ($SKB_CLONE) SKB clones send before alloc new SKB
  -n : ($COUNT)     num messages to send per thread, 0 means indefinitely
  -b : ($BURST)     HW level bursting of SKBs
  -v : ($VERBOSE)   verbose
  -x : ($DEBUG)     debug
  -6 : ($IP6)       IPv6

用pktgen測試網絡PPS性能指標

測試的組網和iperf測試基本相同,客戶端安裝pktgen來發包,接收端通過sar命令(linux系統)來查看端口統計信息,通過對比收發兩端的速率來判斷是否有丟包。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM