brintos

brintos / linux-shallow public Read only

0
0
Text · 12.5 KiB · c945218 Raw
423 lines · plain
1.. SPDX-License-Identifier: GPL-2.02 3====================================4HOWTO for the linux packet generator5====================================6 7Enable CONFIG_NET_PKTGEN to compile and build pktgen either in-kernel8or as a module.  A module is preferred; modprobe pktgen if needed.  Once9running, pktgen creates a thread for each CPU with affinity to that CPU.10Monitoring and controlling is done via /proc.  It is easiest to select a11suitable sample script and configure that.12 13On a dual CPU::14 15    ps aux | grep pkt16    root       129  0.3  0.0     0    0 ?        SW    2003 523:20 [kpktgend_0]17    root       130  0.3  0.0     0    0 ?        SW    2003 509:50 [kpktgend_1]18 19 20For monitoring and control pktgen creates::21 22	/proc/net/pktgen/pgctrl23	/proc/net/pktgen/kpktgend_X24	/proc/net/pktgen/ethX25 26 27Tuning NIC for max performance28==============================29 30The default NIC settings are (likely) not tuned for pktgen's artificial31overload type of benchmarking, as this could hurt the normal use-case.32 33Specifically increasing the TX ring buffer in the NIC::34 35 # ethtool -G ethX tx 102436 37A larger TX ring can improve pktgen's performance, while it can hurt38in the general case, 1) because the TX ring buffer might get larger39than the CPU's L1/L2 cache, 2) because it allows more queueing in the40NIC HW layer (which is bad for bufferbloat).41 42One should hesitate to conclude that packets/descriptors in the HW43TX ring cause delay.  Drivers usually delay cleaning up the44ring-buffers for various performance reasons, and packets stalling45the TX ring might just be waiting for cleanup.46 47This cleanup issue is specifically the case for the driver ixgbe48(Intel 82599 chip).  This driver (ixgbe) combines TX+RX ring cleanups,49and the cleanup interval is affected by the ethtool --coalesce setting50of parameter "rx-usecs".51 52For ixgbe use e.g. "30" resulting in approx 33K interrupts/sec (1/30*10^6)::53 54 # ethtool -C ethX rx-usecs 3055 56 57Kernel threads58==============59Pktgen creates a thread for each CPU with affinity to that CPU.60Which is controlled through procfile /proc/net/pktgen/kpktgend_X.61 62Example: /proc/net/pktgen/kpktgend_0::63 64 Running:65 Stopped: eth4@066 Result: OK: add_device=eth4@067 68Most important are the devices assigned to the thread.69 70The two basic thread commands are:71 72 * add_device DEVICE@NAME -- adds a single device73 * rem_device_all         -- remove all associated devices74 75When adding a device to a thread, a corresponding procfile is created76which is used for configuring this device. Thus, device names need to77be unique.78 79To support adding the same device to multiple threads, which is useful80with multi queue NICs, the device naming scheme is extended with "@":81device@something82 83The part after "@" can be anything, but it is custom to use the thread84number.85 86Viewing devices87===============88 89The Params section holds configured information.  The Current section90holds running statistics.  The Result is printed after a run or after91interruption.  Example::92 93    /proc/net/pktgen/eth4@094 95    Params: count 100000  min_pkt_size: 60  max_pkt_size: 6096	frags: 0  delay: 0  clone_skb: 64  ifname: eth4@097	flows: 0 flowlen: 098	queue_map_min: 0  queue_map_max: 099	dst_min: 192.168.81.2  dst_max:100	src_min:   src_max:101	src_mac: 90:e2:ba:0a:56:b4 dst_mac: 00:1b:21:3c:9d:f8102	udp_src_min: 9  udp_src_max: 109  udp_dst_min: 9  udp_dst_max: 9103	src_mac_count: 0  dst_mac_count: 0104	Flags: UDPSRC_RND  NO_TIMESTAMP  QUEUE_MAP_CPU105    Current:106	pkts-sofar: 100000  errors: 0107	started: 623913381008us  stopped: 623913396439us idle: 25us108	seq_num: 100001  cur_dst_mac_offset: 0  cur_src_mac_offset: 0109	cur_saddr: 192.168.8.3  cur_daddr: 192.168.81.2110	cur_udp_dst: 9  cur_udp_src: 42111	cur_queue_map: 0112	flows: 0113    Result: OK: 15430(c15405+d25) usec, 100000 (60byte,0frags)114    6480562pps 3110Mb/sec (3110669760bps) errors: 0115 116 117Configuring devices118===================119This is done via the /proc interface, and most easily done via pgset120as defined in the sample scripts.121You need to specify PGDEV environment variable to use functions from sample122scripts, i.e.::123 124    export PGDEV=/proc/net/pktgen/eth4@0125    source samples/pktgen/functions.sh126 127Examples::128 129 pg_ctrl start           starts injection.130 pg_ctrl stop            aborts injection. Also, ^C aborts generator.131 132 pgset "clone_skb 1"     sets the number of copies of the same packet133 pgset "clone_skb 0"     use single SKB for all transmits134 pgset "burst 8"         uses xmit_more API to queue 8 copies of the same135			 packet and update HW tx queue tail pointer once.136			 "burst 1" is the default137 pgset "pkt_size 9014"   sets packet size to 9014138 pgset "frags 5"         packet will consist of 5 fragments139 pgset "count 200000"    sets number of packets to send, set to zero140			 for continuous sends until explicitly stopped.141 142 pgset "delay 5000"      adds delay to hard_start_xmit(). nanoseconds143 144 pgset "dst 10.0.0.1"    sets IP destination address145			 (BEWARE! This generator is very aggressive!)146 147 pgset "dst_min 10.0.0.1"            Same as dst148 pgset "dst_max 10.0.0.254"          Set the maximum destination IP.149 pgset "src_min 10.0.0.1"            Set the minimum (or only) source IP.150 pgset "src_max 10.0.0.254"          Set the maximum source IP.151 pgset "dst6 fec0::1"     IPV6 destination address152 pgset "src6 fec0::2"     IPV6 source address153 pgset "dstmac 00:00:00:00:00:00"    sets MAC destination address154 pgset "srcmac 00:00:00:00:00:00"    sets MAC source address155 156 pgset "queue_map_min 0" Sets the min value of tx queue interval157 pgset "queue_map_max 7" Sets the max value of tx queue interval, for multiqueue devices158			 To select queue 1 of a given device,159			 use queue_map_min=1 and queue_map_max=1160 161 pgset "src_mac_count 1" Sets the number of MACs we'll range through.162			 The 'minimum' MAC is what you set with srcmac.163 164 pgset "dst_mac_count 1" Sets the number of MACs we'll range through.165			 The 'minimum' MAC is what you set with dstmac.166 167 pgset "flag [name]"     Set a flag to determine behaviour.  Current flags168			 are: IPSRC_RND # IP source is random (between min/max)169			      IPDST_RND # IP destination is random170			      UDPSRC_RND, UDPDST_RND,171			      MACSRC_RND, MACDST_RND172			      TXSIZE_RND, IPV6,173			      MPLS_RND, VID_RND, SVID_RND174			      FLOW_SEQ,175			      QUEUE_MAP_RND # queue map random176			      QUEUE_MAP_CPU # queue map mirrors smp_processor_id()177			      UDPCSUM,178			      IPSEC # IPsec encapsulation (needs CONFIG_XFRM)179			      NODE_ALLOC # node specific memory allocation180			      NO_TIMESTAMP # disable timestamping181			      SHARED # enable shared SKB182 pgset 'flag ![name]'    Clear a flag to determine behaviour.183			 Note that you might need to use single quote in184			 interactive mode, so that your shell wouldn't expand185			 the specified flag as a history command.186 187 pgset "spi [SPI_VALUE]" Set specific SA used to transform packet.188 189 pgset "udp_src_min 9"   set UDP source port min, If < udp_src_max, then190			 cycle through the port range.191 192 pgset "udp_src_max 9"   set UDP source port max.193 pgset "udp_dst_min 9"   set UDP destination port min, If < udp_dst_max, then194			 cycle through the port range.195 pgset "udp_dst_max 9"   set UDP destination port max.196 197 pgset "mpls 0001000a,0002000a,0000000a" set MPLS labels (in this example198					 outer label=16,middle label=32,199					 inner label=0 (IPv4 NULL)) Note that200					 there must be no spaces between the201					 arguments. Leading zeros are required.202					 Do not set the bottom of stack bit,203					 that's done automatically. If you do204					 set the bottom of stack bit, that205					 indicates that you want to randomly206					 generate that address and the flag207					 MPLS_RND will be turned on. You208					 can have any mix of random and fixed209					 labels in the label stack.210 211 pgset "mpls 0"		  turn off mpls (or any invalid argument works too!)212 213 pgset "vlan_id 77"       set VLAN ID 0-4095214 pgset "vlan_p 3"         set priority bit 0-7 (default 0)215 pgset "vlan_cfi 0"       set canonical format identifier 0-1 (default 0)216 217 pgset "svlan_id 22"      set SVLAN ID 0-4095218 pgset "svlan_p 3"        set priority bit 0-7 (default 0)219 pgset "svlan_cfi 0"      set canonical format identifier 0-1 (default 0)220 221 pgset "vlan_id 9999"     > 4095 remove vlan and svlan tags222 pgset "svlan 9999"       > 4095 remove svlan tag223 224 225 pgset "tos XX"           set former IPv4 TOS field (e.g. "tos 28" for AF11 no ECN, default 00)226 pgset "traffic_class XX" set former IPv6 TRAFFIC CLASS (e.g. "traffic_class B8" for EF no ECN, default 00)227 228 pgset "rate 300M"        set rate to 300 Mb/s229 pgset "ratep 1000000"    set rate to 1Mpps230 231 pgset "xmit_mode netif_receive"  RX inject into stack netif_receive_skb()232				  Works with "burst" but not with "clone_skb".233				  Default xmit_mode is "start_xmit".234 235Sample scripts236==============237 238A collection of tutorial scripts and helpers for pktgen is in the239samples/pktgen directory. The helper parameters.sh file support easy240and consistent parameter parsing across the sample scripts.241 242Usage example and help::243 244 ./pktgen_sample01_simple.sh -i eth4 -m 00:1B:21:3C:9D:F8 -d 192.168.8.2245 246Usage:::247 248  ./pktgen_sample01_simple.sh [-vx] -i ethX249 250  -i : ($DEV)       output interface/device (required)251  -s : ($PKT_SIZE)  packet size252  -d : ($DEST_IP)   destination IP. CIDR (e.g. 198.18.0.0/15) is also allowed253  -m : ($DST_MAC)   destination MAC-addr254  -p : ($DST_PORT)  destination PORT range (e.g. 433-444) is also allowed255  -t : ($THREADS)   threads to start256  -f : ($F_THREAD)  index of first thread (zero indexed CPU number)257  -c : ($SKB_CLONE) SKB clones send before alloc new SKB258  -n : ($COUNT)     num messages to send per thread, 0 means indefinitely259  -b : ($BURST)     HW level bursting of SKBs260  -v : ($VERBOSE)   verbose261  -x : ($DEBUG)     debug262  -6 : ($IP6)       IPv6263  -w : ($DELAY)     Tx Delay value (ns)264  -a : ($APPEND)    Script will not reset generator's state, but will append its config265 266The global variables being set are also listed.  E.g. the required267interface/device parameter "-i" sets variable $DEV.  Copy the268pktgen_sampleXX scripts and modify them to fit your own needs.269 270 271Interrupt affinity272===================273Note that when adding devices to a specific CPU it is a good idea to274also assign /proc/irq/XX/smp_affinity so that the TX interrupts are bound275to the same CPU.  This reduces cache bouncing when freeing skbs.276 277Plus using the device flag QUEUE_MAP_CPU, which maps the SKBs TX queue278to the running threads CPU (directly from smp_processor_id()).279 280Enable IPsec281============282Default IPsec transformation with ESP encapsulation plus transport mode283can be enabled by simply setting::284 285    pgset "flag IPSEC"286    pgset "flows 1"287 288To avoid breaking existing testbed scripts for using AH type and tunnel mode,289you can use "pgset spi SPI_VALUE" to specify which transformation mode290to employ.291 292Disable shared SKB293==================294By default, SKBs sent by pktgen are shared (user count > 1).295To test with non-shared SKBs, remove the "SHARED" flag by simply setting::296 297	pg_set "flag !SHARED"298 299However, if the "clone_skb" or "burst" parameters are configured, the skb300still needs to be held by pktgen for further access. Hence the skb must be301shared.302 303Current commands and configuration options304==========================================305 306**Pgcontrol commands**::307 308    start309    stop310    reset311 312**Thread commands**::313 314    add_device315    rem_device_all316 317 318**Device commands**::319 320    count321    clone_skb322    burst323    debug324 325    frags326    delay327 328    src_mac_count329    dst_mac_count330 331    pkt_size332    min_pkt_size333    max_pkt_size334 335    queue_map_min336    queue_map_max337    skb_priority338 339    tos           (ipv4)340    traffic_class (ipv6)341 342    mpls343 344    udp_src_min345    udp_src_max346 347    udp_dst_min348    udp_dst_max349 350    node351 352    flag353    IPSRC_RND354    IPDST_RND355    UDPSRC_RND356    UDPDST_RND357    MACSRC_RND358    MACDST_RND359    TXSIZE_RND360    IPV6361    MPLS_RND362    VID_RND363    SVID_RND364    FLOW_SEQ365    QUEUE_MAP_RND366    QUEUE_MAP_CPU367    UDPCSUM368    IPSEC369    NODE_ALLOC370    NO_TIMESTAMP371    SHARED372 373    spi (ipsec)374 375    dst_min376    dst_max377 378    src_min379    src_max380 381    dst_mac382    src_mac383 384    clear_counters385 386    src6387    dst6388    dst6_max389    dst6_min390 391    flows392    flowlen393 394    rate395    ratep396 397    xmit_mode <start_xmit|netif_receive>398 399    vlan_cfi400    vlan_id401    vlan_p402 403    svlan_cfi404    svlan_id405    svlan_p406 407 408References:409 410- ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/411- ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/examples/412 413Paper from Linux-Kongress in Erlangen 2004.414- ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/pktgen_paper.pdf415 416Thanks to:417 418Grant Grundler for testing on IA-64 and parisc, Harald Welte,  Lennert Buytenhek419Stephen Hemminger, Andi Kleen, Dave Miller and many others.420 421 422Good luck with the linux net-development.423