zoukankan      html  css  js  c++  java
  • 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系统)来查看端口统计信息,通过对比收发两端的速率来判断是否有丢包。

  • 相关阅读:
    linux工具-awk
    linux工具-sed
    linux工具-grep
    linux编程-bash
    linux命令-sort
    linux命令-seq
    linux命令-find
    linux命令-split
    IDEA去除xml文件中的屎黄色背景
    Rabbit 基于cloud 的配置使用结构流程
  • 原文地址:https://www.cnblogs.com/mrwuzs/p/14696321.html
Copyright © 2011-2022 走看看