Open-source HTTP stress testing tool "hey"

Publish: 2021-01-17 | Modify: 2021-01-17

hey is an HTTP stress testing tool developed using Golang. It can be used as a replacement for ApacheBench (ab). In the article "socat vs Brook port forwarding non-authoritative comparison test, who is stronger and weaker?", hey is mentioned, and this article provides detailed instructions on how to install and use hey.

http_600

Installing hey

The following instructions are for a Linux 64-bit system. If you are using a different operating system, please visit the hey project repository to download the corresponding client.

The author has provided pre-compiled binaries that can be downloaded and used directly:

# Download hey
wget https://hey-release.s3.us-east-2.amazonaws.com/hey_linux_amd64
# If the download speed is slow, you can use the xiaoz software library link
wget http://soft.xiaoz.org/linux/hey_linux_amd64
# Grant execute permission
chmod +x hey_linux_amd64
# Move the file to the sbin directory
mv hey_linux_amd64 /usr/sbin/hey

If you are using a different operating system, please use the appropriate link:

Using hey

To view the help information, enter hey -h:

flag needs an argument: -h
Usage: hey [options...] <url>

Options:
  -n  Number of requests to run. Default is 200.
  -c  Number of workers to run concurrently. Total number of requests cannot
      be smaller than the concurrency level. Default is 50.
  -q  Rate limit, in queries per second (QPS) per worker. Default is no rate limit.
  -z  Duration of application to send requests. When duration is reached,
      application stops and exits. If duration is specified, n is ignored.
      Examples: -z 10s -z 3m.
  -o  Output type. If none provided, a summary is printed.
      "csv" is the only supported alternative. Dumps the response
      metrics in comma-separated values format.

  -m  HTTP method, one of GET, POST, PUT, DELETE, HEAD, OPTIONS.
  -H  Custom HTTP header. You can specify as many as needed by repeating the flag.
      For example, -H "Accept: text/html" -H "Content-Type: application/xml" .
  -t  Timeout for each request in seconds. Default is 20, use 0 for infinite.
  -A  HTTP Accept header.
  -d  HTTP request body.
  -D  HTTP request body from file. For example, /home/user/file.txt or ./file.txt.
  -T  Content-type, defaults to "text/html".
  -a  Basic authentication, username:password.
  -x  HTTP Proxy address as host:port.
  -h2 Enable HTTP/2.

  -host HTTP Host header.

  -disable-compression  Disable compression.
  -disable-keepalive    Disable keep-alive, prevents re-use of TCP
                        connections between different HTTP requests.
  -disable-redirects    Disable following of HTTP redirects
  -cpus                 Number of used cpu cores.
                        (default for current machine is 2 cores)

For example:

hey -n 10000 -c 100 -m GET https://www.qq.com/
  • -n: Total number of requests
  • -c: Number of concurrent client connections
  • -m: Request method, such as GET/POST

The above example sends 100 GET requests to https://www.qq.com/ with a total of 10,000 requests. After execution, hey will print out the statistics, as shown below.

Summary:
  Total:        9.9769 secs
  Slowest:      0.3740 secs
  Fastest:      0.0350 secs
  Average:      0.0971 secs
  Requests/sec: 1002.3120

Response time histogram:
  0.035 [1]     |
  0.069 [894]   |■■■■■■
  0.103 [6193]  |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.137 [2158]  |■■■■■■■■■■■■■■
  0.171 [464]   |■■■
  0.205 [118]   |■
  0.238 [84]    |■
  0.272 [56]    |
  0.306 [29]    |
  0.340 [2]     |
  0.374 [1]     |

Latency distribution:
  10% in 0.0702 secs
  25% in 0.0802 secs
  50% in 0.0917 secs
  75% in 0.1056 secs
  90% in 0.1266 secs
  95% in 0.1510 secs
  99% in 0.2334 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0016 secs, 0.0350 secs, 0.3740 secs
  DNS-lookup:   0.0008 secs, 0.0000 secs, 0.1045 secs
  req write:    0.0001 secs, 0.0000 secs, 0.0716 secs
  resp wait:    0.0896 secs, 0.0320 secs, 0.2326 secs
  resp read:    0.0054 secs, 0.0014 secs, 0.1429 secs

Status code distribution:
  [200] 10000 responses

For more usage examples, please execute hey -h to view the help documentation.

Conclusion

hey is a convenient tool for stress testing websites and provides detailed statistical results. However, please be aware that stress testing tools can put a certain amount of pressure on servers, similar to launching a DDoS attack on a website, so please use it responsibly.

hey project repository: https://github.com/rakyll/hey


Comments