h2load(1) nghttp2 h2load(1)
NAME
h2load - HTTP/2 benchmarking tool
SYNOPSIS
h2load [OPTIONS]... [URI]...
DESCRIPTION
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).
Default: 30
-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,h2-16,h2-14,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.
--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.
-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.
OUTPUT
requests
total The number of requests h2load was instructed to make.
started
The number of requests h2load has started.
done The number of requests completed.
succeeded
The number of requests completed successfully. Only HTTP
status code 2xx or3x are considered as success.
failed The number of requests failed, including HTTP level
failures (non-successful HTTP status code).
errored
The number of requests failed, except for HTTP level
failures. This is the subset of the number reported in
failed and most likely the network level failures or
stream was reset by RST_STREAM.
timeout
The number of requests whose connection timed out before
they were completed. This is the subset of the
number reported in errored.
status codes
The number of status code h2load received.
traffic
total The number of bytes received from the server "on the
wire". If requests were made via TLS, this value is the
number of decrypted bytes.
headers
The number of response header bytes from the server
without decompression. The space savings shows
efficiency of header compression. Let
decompressed(headers) to the number of bytes used for
header fields after decompression. The space savings is
calculated by (1 - headers / decompressed(headers)) *
100. For HTTP/1.1, this is usually 0.00%, since it does
not have header compression. For HTTP/2, it shows some
insightful numbers.
data The number of response body bytes received from the
server.
time for request
min The minimum time taken for request and response.
max The maximum time taken for request and response.
mean The mean time taken for request and response.
sd The standard deviation of the time taken for request and
response.
+/- sd The fraction of the number of requests within standard
deviation range (mean +/- sd) against total number of
successful requests.
time for connect
min The minimum time taken to connect to a server including
TLS handshake.
max The maximum time taken to connect to a server including
TLS handshake.
mean The mean time taken to connect to a server including TLS
handshake.
sd The standard deviation of the time taken to connect to a
server.
+/- sd The fraction of the number of connections within
standard deviation range (mean +/- sd) against total
number of successful connections.
time for 1st byte (of (decrypted in case of TLS) application data)
min The minimum time taken to get 1st byte from a server.
max The maximum time taken to get 1st byte from a server.
mean The mean time taken to get 1st byte from a server.
sd The standard deviation of the time taken to get 1st byte
from a server.
+/- sd The fraction of the number of connections within standard
deviation range (mean +/- sd) against total number of
successful connections.
req/s
min The minimum request per second among all clients.
max The maximum request per second among all clients.
mean The mean request per second among all clients.
sd The standard deviation of request per second among all
clients. server.
+/- sd The fraction of the number of connections within standard
deviation range (mean +/- sd) against total number of
successful connections.
FLOW CONTROL
h2load sets large flow control window by default, and effectively
disables flow control to avoid under utilization of server performance.
To set smaller flow control window, use -w and -W options. For
example, use -w16 -W16 to set default window size described in HTTP/2
protocol specification.
SEE ALSO
nghttp(1), nghttpd(1), nghttpx(1)
AUTHOR
Tatsuhiro Tsujikawa
COPYRIGHT
2012, 2015, 2016, Tatsuhiro Tsujikawa
1.60.0 March 1, 2024 h2load(1)
nghttp2 1.60.0 - Generated Fri Mar 1 05:54:54 CST 2024
