summaryrefslogtreecommitdiffstats
path: root/xdp-bench/README.org
diff options
context:
space:
mode:
Diffstat (limited to 'xdp-bench/README.org')
-rw-r--r--xdp-bench/README.org570
1 files changed, 570 insertions, 0 deletions
diff --git a/xdp-bench/README.org b/xdp-bench/README.org
new file mode 100644
index 0000000..068013c
--- /dev/null
+++ b/xdp-bench/README.org
@@ -0,0 +1,570 @@
+#+EXPORT_FILE_NAME: xdp-bench
+#+TITLE: xdp-bench
+#+MAN_CLASS_OPTIONS: :section-id "8\" \"DATE\" \"VERSION\" \"A simple XDP benchmarking tool"
+# This file serves both as a README on github, and as the source for the man
+# page; the latter through the org-mode man page export support.
+# .
+# To export the man page, simply use the org-mode exporter; (require 'ox-man) if
+# it's not available. There's also a Makefile rule to export it.
+
+* XDP-bench - a simple XDP benchmarking tool
+
+XDP-bench is a benchmarking utility for exercising the different operation modes
+of XDP. It is intended to be a simple program demonstrating the various
+operating modes; these include dropping packets, hairpin forwarding (using the
+=XDP_TX= return code), and redirection using the various in-kernel packet
+redirection facilities.
+
+The drop and TX modes support various options to control whether packet data is
+touched (read or written) before being dropped or transmitted. The redirection
+modes support using the simple ifindex-based =bpf_redirect= helper, the
+=bpf_redirect_map= helper using a cpumap as its target, =bpf_redirect_map= using
+a devmap as its target, and the devmap's broadcast mode which allows redirecting
+to multiple devices.
+
+There is more information on the meaning of the output in both default (terse)
+and extended output mode, in the *Output Format Description* section below.
+
+** Running xdp-bench
+The syntax for running xdp-bench is:
+
+#+begin_src sh
+Usage: xdp-bench COMMAND [options]
+
+COMMAND can be one of:
+ drop - Drop all packets on an interface
+ tx - Transmit packets back out on an interface (hairpin forwarding)
+ redirect - XDP redirect using the bpf_redirect() helper
+ redirect-cpu - XDP CPU redirect using BPF_MAP_TYPE_CPUMAP
+ redirect-map - XDP redirect using BPF_MAP_TYPE_DEVMAP
+ redirect-multi - XDP multi-redirect using BPF_MAP_TYPE_DEVMAP and the BPF_F_BROADCAST flag
+#+end_src
+
+Each command, and its options are explained below. Or use =xdp-bench COMMAND
+--help= to see the options for each command.
+
+* The DROP command
+In this mode, =xdp-bench= installs an XDP program on an interface that simply
+drops all packets. There are options to control what to do with the packet
+before dropping it (touch the packet data or not), as well as which statistics
+to gather. This is a basic benchmark for the baseline (best-case) performance of
+XDP on an interface.
+
+The syntax for the =drop= command is:
+
+=xdp-bench drop [options] <ifname>=
+
+Where =<ifname>= is the name of the interface the XDP program should be
+installed on.
+
+The supported options are:
+
+** -p, --packet-operation <ACTION>
+Specify which operation should be taken on the packet before dropping it. The
+following actions are available:
+
+#+begin_src sh
+ no-touch - Drop the packet without touching the packet data
+ touch - Read a field in the packet header before dropping
+ swap-macs - Swap the source and destination MAC addresses before dropping
+#+end_src
+
+Whether to touch the packet before dropping it can have a significant
+performance impact as this requires bringing packet data into the CPU cache (and
+flushing it back out if writing).
+
+The default for this option is =no-touch=.
+
+** -r, --rxq-stats
+If set, the XDP program will also gather statistics on which receive queue index
+each packet was received on. This is displayed in the extended output mode along
+with per-CPU data (which, depending on the hardware configuration may or may not
+be equivalent).
+
+** -i, --interval <SECONDS>
+Set the polling interval for collecting all statistics and displaying them to
+the output. The unit of interval is in seconds.
+
+** -e, --extended
+Start xdp-bench in "extended" output mode. If not set, xdp-bench will start in
+"terse" mode. The output mode can be switched by hitting C-\ while the program
+is running. See also the *Output Format Description* section below.
+
+** -m, --mode
+Selects the XDP program mode (native or skb). Note that native XDP mode is the
+default, and loading the redirect program in skb manner is neither performant,
+nor recommended. However, this option is useful if the interface driver lacks
+native XDP support, or when simply testing the tool.
+
+** -v, --verbose
+Enable verbose logging. Supply twice to enable verbose logging from the
+underlying =libxdp= and =libbpf= libraries.
+
+** --version
+Show the application version and exit.
+
+** -h, --help
+Display a summary of the available options
+
+* The PASS command
+In this mode, =xdp-bench= installs an XDP program on an interface that passes
+all packets to the network stack after processing them (returning =XDP_PASS=).
+There are options to control what to do with the packet before passing it
+(touch the packet data or not), as well as which statistics to gather. This is a
+basic benchmark for the overhead of installing an XDP program on an interface
+while still running the regular network stack.
+
+The syntax for the =pass= command is:
+
+=xdp-bench pass [options] <ifname>=
+
+Where =<ifname>= is the name of the interface the XDP program should be
+installed on.
+
+The supported options are:
+
+** -p, --packet-operation <ACTION>
+Specify which operation should be taken on the packet before passing it. The
+following actions are available:
+
+#+begin_src sh
+ no-touch - Pass the packet without touching the packet data
+ touch - Read a field in the packet header before passing
+ swap-macs - Swap the source and destination MAC addresses before passing
+#+end_src
+
+The default for this option is =no-touch=.
+
+** -r, --rxq-stats
+If set, the XDP program will also gather statistics on which receive queue index
+each packet was received on. This is displayed in the extended output mode along
+with per-CPU data (which, depending on the hardware configuration may or may not
+be equivalent).
+
+** -i, --interval <SECONDS>
+Set the polling interval for collecting all statistics and displaying them to
+the output. The unit of interval is in seconds.
+
+** -e, --extended
+Start xdp-bench in "extended" output mode. If not set, xdp-bench will start in
+"terse" mode. The output mode can be switched by hitting C-\ while the program
+is running. See also the *Output Format Description* section below.
+
+** -m, --mode
+Selects the XDP program mode (native or skb). Note that native XDP mode is the
+default, and loading the redirect program in skb manner is neither performant,
+nor recommended. However, this option is useful if the interface driver lacks
+native XDP support, or when simply testing the tool.
+
+** -v, --verbose
+Enable verbose logging. Supply twice to enable verbose logging from the
+underlying =libxdp= and =libbpf= libraries.
+
+** --version
+Show the application version and exit.
+
+** -h, --help
+Display a summary of the available options
+
+* The TX command
+In this mode, =xdp-bench= installs an XDP program on an interface that performs
+so-called "hairpin forwarding", which means each packet is transmitted back out
+the same interface (using the =XDP_TX= return code).. There are options to
+control what to do with the packet before transmitting it (touch the packet data
+or not), as well as which statistics to gather.
+
+The syntax for the =tx= command is:
+
+=xdp-bench tx [options] <ifname>=
+
+Where =<ifname>= is the name of the interface the XDP program should be
+installed on.
+
+The supported options are:
+
+** -p, --packet-operation <ACTION>
+Specify which operation should be taken on the packet before transmitting it. The
+following actions are available:
+
+#+begin_src sh
+ no-touch - Transmit the packet without touching the packet data
+ touch - Read a field in the packet header before transmitting
+ swap-macs - Swap the source and destination MAC addresses before transmitting
+#+end_src
+
+To allow the packet to be successfully transmitted back to the sender, the MAC
+addresses have to be swapped, so that the source MAC matches the network device.
+However, there is a performance overhead in doing swapping, so this option
+allows this function to be turned off.
+
+The default for this option is =swap-macs=.
+
+** -r, --rxq-stats
+If set, the XDP program will also gather statistics on which receive queue index
+each packet was received on. This is displayed in the extended output mode along
+with per-CPU data (which, depending on the hardware configuration may or may not
+be equivalent).
+
+** -i, --interval <SECONDS>
+Set the polling interval for collecting all statistics and displaying them to
+the output. The unit of interval is in seconds.
+
+** -e, --extended
+Start xdp-bench in "extended" output mode. If not set, xdp-bench will start in
+"terse" mode. The output mode can be switched by hitting C-\ while the program
+is running. See also the *Output Format Description* section below.
+
+** -m, --mode
+Selects the XDP program mode (native or skb). Note that native XDP mode is the
+default, and loading the redirect program in skb manner is neither performant,
+nor recommended. However, this option is useful if the interface driver lacks
+native XDP support, or when simply testing the tool.
+
+** -v, --verbose
+Enable verbose logging. Supply twice to enable verbose logging from the
+underlying =libxdp= and =libbpf= libraries.
+
+** --version
+Show the application version and exit.
+
+** -h, --help
+Display a summary of the available options
+
+* The REDIRECT command
+In this mode, =xdp-bench= sets up packet redirection between the two
+interfaces supplied on the command line using the =bpf_redirect= BPF helper
+triggered on packet reception on the ingress interface.
+
+The syntax for the =redirect= command is:
+
+=xdp-bench redirect [options] <ifname_in> <ifname_out>=
+
+Where =<ifname_in>= is the name of the input interface from where packets will
+be redirect to the output interface =<ifname_out>=.
+
+The supported options are:
+
+** -i, --interval <SECONDS>
+Set the polling interval for collecting all statistics and displaying them to
+the output. The unit of interval is in seconds.
+
+** -s, --stats
+Enable statistics for successful redirection. This option comes with a per
+packet tracing overhead, for recording all successful redirections.
+
+** -e, --extended
+Start xdp-bench in "extended" output mode. If not set, xdp-bench will start in
+"terse" mode. The output mode can be switched by hitting C-\ while the program
+is running. See also the *Output Format Description* section below.
+
+** -m, --mode
+Selects the XDP program mode (native or skb). Note that native XDP mode is the
+default, and loading the redirect program in skb manner is neither performant,
+nor recommended. However, this option is useful if the interface driver lacks
+native XDP support, or when simply testing the tool.
+
+** -v, --verbose
+Enable verbose logging. Supply twice to enable verbose logging from the
+underlying =libxdp= and =libbpf= libraries.
+
+** --version
+Show the application version and exit.
+
+** -h, --help
+Display a summary of the available options
+
+* The REDIRECT-CPU command
+In this mode, =xdp-bench= sets up packet redirection using the
+=bpf_redirect_map= BPF helper triggered on packet reception on the ingress
+interface, using a cpumap as its target. Hence, this tool can be used to
+redirect packets on an interface from one CPU to another. In addition to this,
+the tool then supports redirecting the packet to another output device when it
+is processed on the target CPU.
+
+The syntax for the =redirect-cpu= command is:
+
+=xdp-bench redirect-cpu [options] <ifname> -c 0 ... -c N=
+
+Where =<ifname>= is the name of the input interface from where packets will be
+redirect to the target CPU list specified using =-c=.
+
+The supported options are:
+
+** -c, --cpu <CPU>
+Specify a possible target CPU index. This option must be passed at least once,
+and can be passed multiple times to specify a list of CPUs. Which CPU is chosen
+for a given packet depends on the value of the =--program-mode= option,
+described below.
+
+** -p, --program-mode <MODE>
+Specify a program that embeds a predefined policy deciding how packets are
+redirected to different CPUs. The following options are available:
+
+#+begin_src sh
+ no-touch - Redirect without touching packet data
+ touch - Read packet data before redirecting
+ round-robin - Cycle between target CPUs in a round-robin fashion (for each packet)
+ l4-proto - Choose the target CPU based on the layer-4 protocol of packet
+ l4-filter - Like l4-proto, but drop UDP packets with destination port 9 (used by pktgen)
+ l4-hash - Use source and destination IP hashing to pick target CPU
+#+end_src
+
+The =no-touch= and =touch= modes always redirect packets to the same CPU (the
+first value supplied to =--cpu=). The =round-robin= and =l4-hash= modes
+distribute packets between all the CPUs supplied as =--cpu= arguments, while
+=l4-proto= and =l4-filter= send TCP and unrecognised packets to CPU index 0, UDP
+packets to CPU index 1 and ICMP packets to CPU index 2 (where the index refers
+to the order the actual CPUs are given on the command line).
+
+The default for this option is =l4-hash=.
+
+** -r --remote-action <ACTION>
+If this option is set, a separate program is installed into the cpumap, which
+will be invoked on the remote CPU after the packet is processed there. The
+action can be either =drop= or =pass= which will drop the packet or pass it to
+the regular networking stack, respectively. Or it can be =redirect=, which will
+cause the packet to be redirected to another interface and transmitted out that
+interface on the remote CPU. If this option is set to =redirect= the target
+device must be specified using =--redirect-device=.
+
+The default for this option is =disabled=.
+
+** -r, --redirect-device <IFNAME>
+Specify the device to redirect the packet to when it is received on the target CPU.
+Note that this option can only be specified with =--remote-action redirect=.
+
+** -q, --qsize <PACKETS>
+Set the queue size for the per-CPU cpumap ring buffer used for redirecting
+packets from multiple CPUs to one CPU. The default value is 2048 packets.
+
+** -x, --stress-mode
+Stress the cpumap implementation by deallocating and reallocating the cpumap
+ring buffer on each polling interval.
+
+** -i, --interval <SECONDS>
+Set the polling interval for collecting all statistics and displaying them to
+the output. The unit of interval is in seconds.
+
+** -s, --stats
+Enable statistics for successful redirection. This option comes with a per
+packet tracing overhead, for recording all successful redirections.
+
+** -e, --extended
+Start xdp-bench in "extended" output mode. If not set, xdp-bench will start in
+"terse" mode. The output mode can be switched by hitting C-\ while the program
+is running. See also the *Output Format Description* section below.
+
+** -m, --mode
+Selects the XDP program mode (native or skb). Note that native XDP mode is the
+default, and loading the redirect program in skb manner is neither performant,
+nor recommended. However, this option is useful if the interface driver lacks
+native XDP support, or when simply testing the tool.
+
+** -v, --verbose
+Enable verbose logging. Supply twice to enable verbose logging from the
+underlying =libxdp= and =libbpf= libraries.
+
+** --version
+Show the application version and exit.
+
+** -h, --help
+Display a summary of the available options
+
+* The REDIRECT-MAP command
+In this mode, =xdp-bench= sets up packet redirection between two interfaces
+supplied on the command line using the =bpf_redirect_map()= BPF helper triggered
+on packet reception on the ingress interface, using a devmap as its target.
+
+The syntax for the =redirect-map= command is:
+
+=xdp-bench redirect-map [options] <ifname_in> <ifname_out>=
+
+Where =<ifname_in>= is the name of the input interface from where packets will
+be redirect to the output interface =<ifname_out>=.
+
+The supported options are:
+
+** -X, --load-egress
+Load a program in the devmap entry used for redirection, so that it is invoked
+after the packet is redirected to the target device, before it is transmitted
+out of the output interface. The remote program will update the packet data so
+its source MAC address matches the one of the destination interface.
+
+** -i, --interval <SECONDS>
+Set the polling interval for collecting all statistics and displaying them to
+the output. The unit of interval is in seconds.
+
+** -s, --stats
+Enable statistics for successful redirection. This option comes with a per
+packet tracing overhead, for recording all successful redirections.
+
+** -e, --extended
+Start xdp-bench in "extended" output mode. If not set, xdp-bench will start in
+"terse" mode. The output mode can be switched by hitting C-\ while the program
+is running. See also the *Output Format Description* section below.
+
+** -m, --mode
+Selects the XDP program mode (native or skb). Note that native XDP mode is the
+default, and loading the redirect program in skb manner is neither performant,
+nor recommended. However, this option is useful if the interface driver lacks
+native XDP support, or when simply testing the tool.
+
+** -v, --verbose
+Enable verbose logging. Supply twice to enable verbose logging from the
+underlying =libxdp= and =libbpf= libraries.
+
+** --version
+Show the application version and exit.
+
+** -h, --help
+Display a summary of the available options
+
+* The REDIRECT-MULTI command
+In this mode, =xdp-bench= sets up one-to-many packet redirection between
+interfaces supplied on the command line, using the =bpf_redirect_map= BPF helper
+triggered on packet reception on the ingress interface, using a devmap as its
+target. The packet is broadcast to all output interfaces specified on the
+command line, using devmap's packet broadcast feature.
+
+The syntax for the =redirect-multi= command is:
+
+=xdp-bench redirect-multi [options] <ifname_in> <ifname_out1> ... <ifname_outN>=
+
+Where =<ifname_in>= is the name of the input interface from where packets will
+be redirect to one or many output interface(s).
+
+The supported options are:
+
+** -X, --load-egress
+Load a program in the devmap entry used for redirection, so that it is invoked
+after the packet is redirected to the target device, before it is transmitted
+out of the output interface. The remote program will update the packet data so
+its source MAC address matches the one of the destination interface.
+
+** -i, --interval <SECONDS>
+Set the polling interval for collecting all statistics and displaying them to
+the output. The unit of interval is in seconds.
+
+** -s, --stats
+Enable statistics for successful redirection. This option comes with a per
+packet tracing overhead, for recording all successful redirections.
+
+** -e, --extended
+Start xdp-bench in "extended" output mode. If not set, xdp-bench will start in
+"terse" mode. The output mode can be switched by hitting C-\ while the program
+is running. See also the *Output Format Description* section below.
+
+** -m, --mode
+Selects the XDP program mode (native or skb). Note that native XDP mode is the
+default, and loading the redirect program in skb manner is neither performant,
+nor recommended. However, this option is useful if the interface driver lacks
+native XDP support, or when simply testing the tool.
+
+** -v, --verbose
+Enable verbose logging. Supply twice to enable verbose logging from the
+underlying =libxdp= and =libbpf= libraries.
+
+** --version
+Show the application version and exit.
+
+** -h, --help
+Display a summary of the available options
+
+
+* Output Format Description
+
+By default, redirect success statistics are disabled, use =--stats= to enable.
+The terse output mode is default, extended output mode can be activated using
+the =--extended= command line option.
+
+SIGQUIT (Ctrl + \\) can be used to switch the mode dynamically at runtime.
+
+Terse mode displays at most the following fields:
+#+begin_src sh
+ rx/s Number of packets received per second
+ redir/s Number of packets successfully redirected per second
+ err,drop/s Aggregated count of errors per second (including dropped packets when not using the drop command)
+ xmit/s Number of packets transmitted on the output device per second
+#+end_src
+
+Extended output mode displays at most the following fields:
+#+begin_src sh
+ FIELD DESCRIPTION
+ receive Displays the number of packets received and errors encountered
+
+ Whenever an error or packet drop occurs, details of per CPU error
+ and drop statistics will be expanded inline in terse mode.
+ pkt/s - Packets received per second
+ drop/s - Packets dropped per second
+ error/s - Errors encountered per second
+ redirect - Displays the number of packets successfully redirected
+ Errors encountered are expanded under redirect_err field
+ Note that passing -s to enable it has a per packet overhead
+ redir/s - Packets redirected successfully per second
+
+
+ redirect_err Displays the number of packets that failed redirection
+
+ The errno is expanded under this field with per CPU count
+ The recognized errors are:
+ EINVAL: Invalid redirection
+ ENETDOWN: Device being redirected to is down
+ EMSGSIZE: Packet length too large for device
+ EOPNOTSUPP: Operation not supported
+ ENOSPC: No space in ptr_ring of cpumap kthread
+
+ error/s - Packets that failed redirection per second
+
+
+ enqueue to cpu N Displays the number of packets enqueued to bulk queue of CPU N
+ Expands to cpu:FROM->N to display enqueue stats for each CPU enqueuing to CPU N
+ Received packets can be associated with the CPU redirect program is enqueuing
+ packets to.
+ pkt/s - Packets enqueued per second from other CPU to CPU N
+ drop/s - Packets dropped when trying to enqueue to CPU N
+ bulk-avg - Average number of packets processed for each event
+
+
+ kthread Displays the number of packets processed in CPUMAP kthread for each CPU
+ Packets consumed from ptr_ring in kthread, and its xdp_stats (after calling
+ CPUMAP bpf prog) are expanded below this. xdp_stats are expanded as a total and
+ then per-CPU to associate it to each CPU's pinned CPUMAP kthread.
+ pkt/s - Packets consumed per second from ptr_ring
+ drop/s - Packets dropped per second in kthread
+ sched - Number of times kthread called schedule()
+
+ xdp_stats (also expands to per-CPU counts)
+ pass/s - XDP_PASS count for CPUMAP program execution
+ drop/s - XDP_DROP count for CPUMAP program execution
+ redir/s - XDP_REDIRECT count for CPUMAP program execution
+
+
+ xdp_exception Displays xdp_exception tracepoint events
+
+ This can occur due to internal driver errors, unrecognized
+ XDP actions and due to explicit user trigger by use of XDP_ABORTED
+ Each action is expanded below this field with its count
+ hit/s - Number of times the tracepoint was hit per second
+
+
+ devmap_xmit Displays devmap_xmit tracepoint events
+
+ This tracepoint is invoked for successful transmissions on output
+ device but these statistics are not available for generic XDP mode,
+ hence they will be omitted from the output when using SKB mode
+ xmit/s - Number of packets that were transmitted per second
+ drop/s - Number of packets that failed transmissions per second
+ drv_err/s - Number of internal driver errors per second
+ bulk-avg - Average number of packets processed for each event
+#+end_src
+
+* BUGS
+
+Please report any bugs on Github: https://github.com/xdp-project/xdp-tools/issues
+
+* AUTHOR
+
+Earlier xdp-redirect tools were written by Jesper Dangaard Brouer and John
+Fastabend. They were then rewritten to support more features by Kumar Kartikeya
+Dwivedi, who also ported them to xdp-tools together with Toke Høiland-Jørgensen.
+This man page was written by Kumar Kartikeya Dwivedi and Toke Høiland-Jørgensen.