logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

kxdpgun - XDP-powered DNS benchmarking tool

Author

       CZ.NIC Labs <https://www.knot-dns.cz>

Description

       Powerful generator of DNS traffic, sending and receiving packets through XDP.

       Queries are generated according to a textual file which is read sequentially in a loop until a configured
       duration  elapses.  The  order of queries is not guaranteed. Responses are received (unless disabled) and
       counted, but not checked against queries.

       The number of parallel threads is autodetected according to the  number  of  queues  configured  for  the
       network interface.

   Parametersfilename
              Path to the queries file. See the description below regarding the file format.

       target Either the domain name, IPv4 or IPv6 address of a remote target.

   Options-t, --durationseconds
              Duration of traffic generation, specified as a decimal number in seconds (default is 5.0).

       -T, --tcp[=debug_mode]
              Send queries over TCP. See the list of optional debug modes below.

       -U, --quic[=debug_mode]
              Send queries over QUIC. See the list of optional debug modes below.

       -Q, --qpsqueries
              Number  of  queries-per-second  (approximately)  to be sent (default is 1000).  The program is not
              optimized for low speeds at which it may lose communication packets. The recommended minimum speed
              is 2 packets per thread (Rx/Tx queue).

       -b, --batchsize
              Send more queries in a batch. Improves QPS but may affect the counterpart's packet  loss  (default
              is 10 for UDP and 1 for TCP/QUIC).

       -r, --drop
              Drop incoming responses. Improves QPS, but disables response statistics.

       -p, --portnumber
              Remote destination port (default is 53 for UDP/TCP, 853 for QUIC).

       -F, --affinitycpu_spec
              CPU affinity for all threads specified in the format [<cpu_start>][s<cpu_step>], where <cpu_start>
              is the CPU ID for the first thread and <cpu_step> is the CPU ID increment for next thread (default
              is 0s1).

       -i, --infilefilename
              Path to a file with query templates.

       -B, --binary
              Specify that input file is in binary format. This format is similar to the TCP DNS message format.
              The file contains records formatted as 2-octet length (network order) followed by a message in DNS
              wire format.

       -I, --interfaceinterface
              Network interface for outgoing communication. This can be useful in situations when the interfaces
              are in a bond for example.

       -l, --locallocalIP[/prefix]
              Override  the  auto-detected  source IP address. If an address range is specified instead, various
              IPs from the range will be used for different queries uniformly (address range  not  supported  in
              the QUIC mode).

       -L, --mac-local
              Override auto-detected local MAC address.

       -R, --mac-remote
              Override auto-detected remote MAC address.

       -v, --vlanid
              Add VLAN 802.1Q header with the given id. VLAN offloading should be disabled.

       -e, --edns-sizesize
              EDNS  UDP payload size, range 512-4096 (default is 1232). Note that over XDP the maximum supported
              MTU is 1790.

       -m, --modemode
              Set the XDP mode. Supported values are:

              • auto (default) – the XDP mode is selected automatically to achieve the best  performance,  which
                means  that  native  driver  support is preferred over the generic one, and zero-copy is used if
                available.

              • copy – the XDP socket copy mode is forced even if  zero-copy  is  available.  This  can  resolve
                various driver issues, but at the cost of lower performance.

              • generic  –  the generic XDP implementation is forced even if native implementation is available.
                This mode  doesn't  require  support  from  the  driver  nor  hardware,  but  offers  the  worst
                performance.

       -G, --qlogpath
              Generate qlog files in the directory specified by path. The directory has to exist.

              This option is ignored if not in the QUIC mode. The recommended usage is with --quic=R or with low
              QPS. Otherwise, too many files are generated.

       -j, --json
              Print statistics formatted as json.

       -S, --stats-periodperiod
              Report statistics automatically every period milliseconds.

              These reports contain only metrics collected in the given period.

       -h, --help
              Print the program help.

       -V, --version
              Print  the  program version. The option -VV makes the program print the compile time configuration
              summary.

   Queriesfileformat
       Each line describes a query in the form:

       query_namequery_type [flags]

       Where query_name is a domain name to be queried, query_type is a record type name, and flags is a  single
       character:

       E Send query with EDNS.

       D Request DNSSEC (EDNS + DO flag).

   TCP/QUICdebugmodes0      Perform full handshake for all connections (QUIC only).

       1      Just send SYN (Initial) and receive SYN-ACK (Handshake).

       2      Perform TCP/QUIC handshake and don't send anything, allow close initiated by counterpart.

       3      Perform TCP/QUIC handshake and don't react further.

       5      Send incomplete query (N-1 bytes) and don't react further.

       7      Send query and don't ACK the response or anything further.

       8      Don't close the connection and ignore close by counterpart.

       9      Operate normally except for not ACKing the final FIN+ACK (TCP only).

       R      Instead of opening a connection for each query, reuse connections.

   Signals
       Sending  USR1  signal  to  a  running process triggers current statistics dump to the standard output. In
       combination with -S may cause erratic printout timing.

Examples

       Manually created queries file:

          abc6.example.com. AAAA
          nxdomain.example.com. A
          notzone. A
          a.example.com. NS E
          ab.example.com. A D
          abcd.example.com. DS D

       Queries file generated from a zone file (Knot DNS format):

          cat ZONE_FILE | awk "{print \$1,\$3}" | grep -E "(NS|DS|A|AAAA|PTR|MX|SOA)$" | sort -u -R > queries.txt

       Basic usage:

          # kxdpgun -i ~/queries.txt 2001:DB8::1

       UsingUDPwithincreasedbatchsize:

          # kxdpgun -t 20 -Q 1000000 -i ~/queries.txt -b 20 -p 8853 192.0.2.1

       UsingTCP:

          # kxdpgun -t 20 -Q 100000 -i ~/queries.txt -T -p 8853 192.0.2.1

Exit Values

       Exit status of 0 means successful operation. Any other exit status indicates an error.

Name

       kxdpgun - XDP-powered DNS benchmarking tool

Notes

       Linux kernel 4.18+ is required.

       The utility has to be executed  under  root  or  with  these  capabilities:  CAP_NET_RAW,  CAP_NET_ADMIN,
       CAP_SYS_ADMIN, CAP_IPC_LOCK, and CAP_SYS_RESOURCE (Linux < 5.11).

       The utility allocates source UDP/TCP ports from the range 2000-65535.

       Due  to  the multi-threaded program structure there are slight discrepancies in the timespan during which
       metrics are collected  for  any  given  thread.  The  statistics  printouts  ignore  this  and  are  thus
       ever-so-slightly  inaccurate.  The error margin decreases proportionally to the volume of data & timespan
       over which they are collected.

See Also

kdig(1).

Synopsis

kxdpgun [options] -ifilenametarget

See Also