A Comprehensive Guide to the Open-Source HTTP Load Testing Tool Hey

hey toolhttp load testinggolang performance toolapachebench alternativewebsite stress test
Published·Modified·

Hey is an HTTP load testing tool developed using Golang, which can serve as an alternative to ApacheBench (ab). The tool was mentioned in the article "Socat vs. Brook Port Forwarding Non-Authoritative Comparison Test: Who is Stronger?". This article details the installation and usage of hey.

Installing Hey

The following instructions use a Linux 64-bit system. If you are using a different operating system, please download the corresponding client from the hey project address.

The author has provided pre-compiled binary packages for direct download and use:

# 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 execution permissions
chmod +x hey_linux_amd64
# Move the file to the sbin directory
mv hey_linux_amd64 /usr/sbin/hey

For other operating systems, please refer to the following:

Using Hey

Enter hey -h to view help information:

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)

Here is an example:

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

The example above means initiating 100 concurrent GET requests to https://www.qq.com/, with a total of 10,000 requests. After execution, hey will print statistical information, as follows:

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, please execute hey -h to view the help documentation.

Conclusion

Hey allows for convenient website stress testing and returns detailed statistical results. Additionally, stress testing tools can place a certain amount of pressure on the server, equivalent to launching a CC attack on the website, so please do not abuse them.

Hey project address: https://github.com/rakyll/hey