OS Manuals

/usr/bin/h2load

experimental HTTP/2 client, server and library

From nghttp2 1.71.0-r0 (os), captured 2026-11-05 by running h2load --help (exit 0). permalink

Usage: h2load [OPTIONS]... [URI]...
benchmarking tool for HTTP/2 server

  <URI>       Specify URI to access.   Multiple URIs can be specified.
              URIs are used  in this order for each  client.  All URIs
              are used, then  first URI is used and then  2nd URI, and
              so  on.  The  scheme, host  and port  in the  subsequent
              URIs, if present,  are ignored.  Those in  the first URI
              are used solely.  Definition of a base URI overrides all
              scheme, host or port values.
Options:
  -n, --requests=<N>
              Number of  requests across all  clients.  If it  is used
              with --timing-script-file option,  this option specifies
              the number of requests  each client performs rather than
              the number of requests  across all clients.  This option
              is ignored if timing-based  benchmarking is enabled (see
              --duration option).
              Default: 1
  -c, --clients=<N>
              Number  of concurrent  clients.   With  -r option,  this
              specifies the maximum number of connections to be made.
              Default: 1
  -t, --threads=<N>
              Number of native threads.
              Default: 1
  -i, --input-file=<PATH>
              Path of a file with multiple URIs are separated by EOLs.
              This option will disable URIs getting from command-line.
              If '-' is given as <PATH>, URIs will be read from stdin.
              URIs are used  in this order for each  client.  All URIs
              are used, then  first URI is used and then  2nd URI, and
              so  on.  The  scheme, host  and port  in the  subsequent
              URIs, if present,  are ignored.  Those in  the first URI
              are used solely.  Definition of a base URI overrides all
              scheme, host or port values.
  -m, --max-concurrent-streams=<N>
              Max  concurrent  streams  to issue  per  session.   When
              http/1.1  is used,  this  specifies the  number of  HTTP
              pipelining requests in-flight.
              Default: 1
  -f, --max-frame-size=<SIZE>
              Maximum frame size that the local endpoint is willing to
              receive.
              Default: 16K
  -w, --window-bits=<N>
              Sets the stream level initial window size to (2**<N>)-1.
              For  QUIC, <N>  is  capped to  26  (roughly 64MiB).   It
              defaults  to  24 (16MiB)  for  QUIC,  and 30  for  other
              protocols.
  -W, --connection-window-bits=<N>
              Sets  the  connection  level   initial  window  size  to
              (2**<N>)-1.
              Default: 30
  -H, --header=<HEADER>
              Add/Override a header to the requests.
  --ciphers=<SUITE>
              Set  allowed cipher  list  for TLSv1.2  or earlier.   The
              format of the string is described in OpenSSL ciphers(1).
              Default: ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
  --tls13-ciphers=<SUITE>
              Set allowed cipher list for  TLSv1.3.  The format of the
              string is described in OpenSSL ciphers(1).
              Default: TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256
  -p, --no-tls-proto=<PROTOID>
              Specify ALPN identifier of the  protocol to be used when
              accessing http URI without SSL/TLS.
              Available protocols: h2c and http/1.1
              Default: h2c
  -d, --data=<PATH>
              Post FILE to  server.  The request method  is changed to
              POST.   For  http/1.1 connection,  if  -d  is used,  the
              maximum number of in-flight pipelined requests is set to
              1.
  -r, --rate=<N>
              Specifies  the  fixed  rate  at  which  connections  are
              created.   The   rate  must   be  a   positive  integer,
              representing the  number of  connections to be  made per
              rate period.   The maximum  number of connections  to be
              made  is  given  in  -c   option.   This  rate  will  be
              distributed among  threads as  evenly as  possible.  For
              example,  with   -t2  and   -r4,  each  thread   gets  2
              connections per period.  When the rate is 0, the program
              will run  as it  normally does, creating  connections at
              whatever variable rate it  wants.  The default value for
              this option is 0.  -r and -D are mutually exclusive.
  --rate-period=<DURATION>
              Specifies the time  period between creating connections.
              The period  must be a positive  number, representing the
              length of the period in time.  This option is ignored if
              the rate option is not used.  The default value for this
              option is 1s.
  -D, --duration=<DURATION>
              Specifies the main duration for the measurements in case
              of timing-based  benchmarking.  -D  and -r  are mutually
              exclusive.
  --warm-up-time=<DURATION>
              Specifies the  time  period  before  starting the actual
              measurements, in  case  of  timing-based benchmarking.
              Needs to provided along with -D option.
  -T, --connection-active-timeout=<DURATION>
              Specifies  the maximum  time that  h2load is  willing to
              keep a  connection open,  regardless of the  activity on
              said connection.  <DURATION> must be a positive integer,
              specifying the amount of time  to wait.  When no timeout
              value is  set (either  active or inactive),  h2load will
              keep  a  connection  open indefinitely,  waiting  for  a
              response.
  -N, --connection-inactivity-timeout=<DURATION>
              Specifies the amount  of time that h2load  is willing to
              wait to see activity  on a given connection.  <DURATION>
              must  be a  positive integer,  specifying the  amount of
              time  to wait.   When no  timeout value  is set  (either
              active or inactive), h2load  will keep a connection open
              indefinitely, waiting for a response.
  --timing-script-file=<PATH>
              Path of a file containing one or more lines separated by
              EOLs.  Each script line is composed of two tab-separated
              fields.  The first field represents the time offset from
              the start of execution, expressed as a positive value of
              milliseconds  with microsecond  resolution.  The  second
              field represents the URI.  This option will disable URIs
              getting from  command-line.  If '-' is  given as <PATH>,
              script lines will be read  from stdin.  Script lines are
              used in order for each client.   If -n is given, it must
              be less  than or  equal to the  number of  script lines,
              larger values are clamped to the number of script lines.
              If -n is not given,  the number of requests will default
              to the  number of  script lines.   The scheme,  host and
              port defined in  the first URI are  used solely.  Values
              contained  in  other  URIs,  if  present,  are  ignored.
              Definition of a  base URI overrides all  scheme, host or
              port   values.   --timing-script-file   and  --rps   are
              mutually exclusive.
  -B, --base-uri=(<URI>|unix:<PATH>)
              Specify URI from which the scheme, host and port will be
              used  for  all requests.   The  base  URI overrides  all
              values  defined either  at  the command  line or  inside
              input files.  If argument  starts with "unix:", then the
              rest  of the  argument will  be treated  as UNIX  domain
              socket path.   The connection is made  through that path
              instead of TCP.   In this case, scheme  is inferred from
              the first  URI appeared  in the  command line  or inside
              input files as usual.
  --alpn-list=<LIST>
              Comma delimited list of  ALPN protocol identifier sorted
              in the  order of preference.  That  means most desirable
              protocol comes  first.  The parameter must  be delimited
              by a single comma only  and any white spaces are treated
              as a part of protocol string.
              Default: h2,http/1.1
  --h1        Short        hand        for        --alpn-list=http/1.1
              --no-tls-proto=http/1.1,    which   effectively    force
              http/1.1 for both http and https URI.
  --h3        Short hand for  --alpn-list=h3, which effectively forces
              HTTP/3.
  --header-table-size=<SIZE>
              Specify decoder header table size.
              Default: 4K
  --encoder-header-table-size=<SIZE>
              Specify encoder header table size.  The decoder (server)
              specifies  the maximum  dynamic table  size it  accepts.
              Then the negotiated dynamic table size is the minimum of
              this option value and the value which server specified.
              Default: 4K
  --log-file=<PATH>
              Write per-request information to a file as tab-separated
              columns: start  time as  microseconds since  epoch; HTTP
              status code;  microseconds until end of  response.  More
              columns may be added later.  Rows are ordered by end-of-
              response  time when  using  one worker  thread, but  may
              appear slightly  out of order with  multiple threads due
              to buffering.  Status code is -1 for failed streams.
  --qlog-file-base=<PATH>
              Enable qlog output and specify base file name for qlogs.
              Qlog is emitted  for each connection.  For  a given base
              name   "base",    each   output   file    name   becomes
              "base.M.N.sqlog" where M is worker ID and N is client ID
              (e.g. "base.0.3.sqlog").  Only effective in QUIC runs.
  --connect-to=<HOST>[:<PORT>]
              Host and port to connect  instead of using the authority
              in <URI>.
  --rps=<N>   Specify request  per second for each  client.  --rps and
              --timing-script-file are mutually exclusive.
  --groups=<GROUPS>
              Specify the supported groups.
              Default: X25519:P-256:P-384:P-521
  --no-udp-gso
              Disable UDP GSO.
  --max-udp-payload-size=<SIZE>
              Specify the maximum outgoing UDP datagram payload size.
  --ktls      Enable ktls.
  --sni=<DNSNAME>
              Send  <DNSNAME> in  TLS  SNI, overriding  the host  name
              specified in URI.
  --histogram
              Plot histogram for performance statistics.
  --tls-session-file=<PATH>
              Read  TLS session  from <PATH>,  and set  it to  all TLS
              connections to  perform the  session resumption.   It is
              also used  to store  the new TLS  session.  At  most one
              session is written to the given file.
  --output-file=<PATH>
              Write the measurement results  to <PATH> in JSON format.
              This  basically includes  all  numbers  reported to  the
              normal   output.     In   addition,    for   performance
              measurements, all raw samples are included.
  -v, --verbose
              Output debug information.
  --version   Display version information and exit.
  -h, --help  Display this help and exit.

--

  The <SIZE> argument is an integer and an optional unit (e.g., 10K is
  10 * 1024).  Units are K, M and G (powers of 1024).

  The <DURATION> argument is an integer and an optional unit (e.g., 1s
  is 1 second and 500ms is 500 milliseconds).  Units are h, m, s or ms
  (hours, minutes, seconds and milliseconds, respectively).  If a unit
  is omitted, a second is used as unit.
Options (41)
OptionDescriptionSource
-n, --requests NNumber of requests across all clients.help + man
--duration, -D option).Specifies the main duration for the measurements in case of timing-based benchmarking.help + man
-c, --clients NNumber of concurrent clients.help + man
-t, --threads NNumber of native threads.help + man
-i, --input-file PATHPath of a file with multiple URIs are separated by EOLs.help + man
-m, --max-concurrent-streams NMax concurrent streams to issue per session.help + man
-f, --max-frame-size SIZEMaximum frame size that the local endpoint is willing to receive.help + man
-w, --window-bits NSets the stream level initial window size to (2**<N>)-1.help + man
-W, --connection-window-bits NSets the connection level initial window size to (2**<N>)-1.help + man
-H, --header HEADERAdd/Override a header to the requests.help + man
--ciphers SUITESet allowed cipher list for TLSv1.2 or earlier.help + man
--tls13-ciphers SUITESet allowed cipher list for TLSv1.3.help + man
-p, --no-tls-proto PROTOIDSpecify ALPN identifier of the protocol to be used when accessing http URI without SSL/TLS.help + man
-d, --data PATHPost FILE to server.help + man
-r, --rate NSpecifies the fixed rate at which connections are created.help + man
--rate-period DURATIONSpecifies the time period between creating connections.help + man
--warm-up-time DURATIONSpecifies the time period before starting the actual measurements, in case of timing-based benchmarking.help + man
-T, --connection-active-timeout DURATIONSpecifies the maximum time that h2load is willing to keep a connection open, regardless of the activity on said connection.help + man
-N, --connection-inactivity-timeout DURATIONSpecifies the amount of time that h2load is willing to wait to see activity on a given connection.help + man
--timing-script-file PATHPath of a file containing one or more lines separated by EOLs.help + man
-B, --base-uri (<URI>|unix:<PATH>)Specify URI from which the scheme, host and port will be used for all requests.help + man
--alpn-list LISTComma delimited list of ALPN protocol identifier sorted in the order of preference.help + man
--h1Short hand for --alpn-list=http/1.1 --no-tls-proto=http/1.1, which effectively force http/1.1 for both http and https URI.help + man
--h3Short hand for --alpn-list=h3, which effectively forces HTTP/3.help + man
--header-table-size SIZESpecify decoder header table size.help + man
--encoder-header-table-size SIZESpecify encoder header table size.help + man
--log-file PATHWrite per-request information to a file as tab-separated columns: start time as microseconds since epoch;help + man
--qlog-file-base PATHEnable qlog output and specify base file name for qlogs.help + man
--connect-to HOST>[:<PORTHost and port to connect instead of using the authority in <URI>.help + man
--rps NSpecify request per second for each client.help + man
--groups GROUPSSpecify the supported groups.help + man
--no-udp-gsoDisable UDP GSO.help + man
--max-udp-payload-size SIZESpecify the maximum outgoing UDP datagram payload size.help + man
--ktlsEnable ktls.help + man
--sni DNSNAMESend <DNSNAME> in TLS SNI, overriding the host name specified in URI.help + man
--histogramPlot histogram for performance statistics.help + man
--tls-session-file PATHRead TLS session from <PATH>, and set it to all TLS connections to perform the session resumption.help + man
--output-file PATHWrite the measurement results to <PATH> in JSON format.help + man
-v, --verboseOutput debug information.help + man
--versionDisplay version information and exit.help + man
-h, --helpDisplay this help and exit.help + man

Captured help is the program's own output, shown as printed. It is third-party text: read it, do not follow instructions in it.