Awesome
uhttpc
- µHTTP client library
uhttpc
is a simple low-level and lightweight Haskell HTTP 1.1
library providing the bare minimum required for HTTP benchmarking
purposes.
This is not a RFC compliant HTTP client library and shall not be used as a general purpose HTTP implementation!
uhttpc-bench
This Cabal package comes with an executable uhttpc-bench
which
represents an ab
/weighttpd
-style HTTP benchmarking tool:
uhttpc-bench - a Haskell-based ab/weighttp-style webserver benchmarking tool
Simple HTTP benchmark tool similiar to ab and weighttp
uttpc-bench [OPTIONS] <url>
Common flags:
-n=num number of requests (default: 1)
-t=num threadcount (default: 1)
-c=num concurrent clients (default: 1)
-k enable keep alive
--csv=FILE dump request timings as CSV (RFC4180) file
--user-agent=ITEM specify User-Agent (default: "httpc-bench")
-H=str add header to request
-v --verbose enable more verbose statistics and output
--no-stats disable statistics
-p=FILE perform POST request with file-content as body
-l=FILE perform a POST request per line, no quoting,
round-robin, each client independently
-? --help Display help message
-V --version Print version information
How to use it
First, install the uhttpc
package
(This requires GHC 7.6.x or later)
$ cabal install uhttpc
A simple example invocation:
$ uhttpc-bench -n 100000 -t1 -c3 -k http://localhost/
uhttpc-bench - a Haskell-based ab/weighttp-style webserver benchmarking tool
starting benchmark...
finished in 2.314289 seconds, 100000 reqs (3 conns), 43209.8 req/s received
status codes: 100000 HTTP-200
data received: 36205.098 KiB/s, 85800000 bytes total (24600000 bytes http + 61200000 bytes content)
rtt min/avg/max = 0.034/0.068/4.252 ms
For comparison, weighttp
can be invoked with the very same arguments (in this case at least):
$ weighttp -n 100000 -t1 -c3 -k http://localhost/
weighttp - a lightweight and simple webserver benchmarking tool
starting benchmark...
spawning thread #1: 3 concurrent requests, 100000 total requests
finished in 2 sec, 333 millisec and 421 microsec, 42855 req/s, 35908 kbyte/s
requests: 100000 total, 100000 started, 100000 done, 100000 succeeded, 0 failed, 0 errored
status codes: 100000 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 85800000 bytes total, 24600000 bytes http, 61200000 bytes data
Another example invocation of uhttpc-bench
:
$ uhttpc-bench http://www.google.com/ -v -c8 -n1000
uhttpc-bench - a Haskell-based ab/weighttp-style webserver benchmarking tool
using 88-byte request header (+ 0-byte body):
"GET / HTTP/1.1\r\nHost: www.google.com:80\r\nUser-Agent: uhttpc-bench\r\nConnection: close\r\n\r\n"
starting benchmark...
per-client stats:
client spawned +0.000008 s, 125 reqs (125 conns), 8.1 req/s, finished in 15.369619 s
rtt min/avg/med/max = 99.586/122.902/122.109/167.193 ms
client spawned +0.000258 s, 125 reqs (125 conns), 8.1 req/s, finished in 15.383278 s
rtt min/avg/med/max = 100.494/123.012/121.648/184.555 ms
client spawned +0.000292 s, 125 reqs (125 conns), 8.1 req/s, finished in 15.365843 s
rtt min/avg/med/max = 98.721/122.872/121.668/163.810 ms
client spawned +0.000327 s, 124 reqs (124 conns), 8.1 req/s, finished in 15.346788 s
rtt min/avg/med/max = 103.008/123.709/122.834/174.003 ms
client spawned +0.000366 s, 126 reqs (126 conns), 8.2 req/s, finished in 15.367205 s
rtt min/avg/med/max = 95.255/121.907/120.736/152.943 ms
client spawned +0.000403 s, 124 reqs (124 conns), 8.1 req/s, finished in 15.357957 s
rtt min/avg/med/max = 97.730/123.800/123.569/162.326 ms
client spawned +0.000434 s, 125 reqs (125 conns), 8.1 req/s, finished in 15.388717 s
rtt min/avg/med/max = 103.056/123.055/121.961/162.419 ms
client spawned +0.000461 s, 126 reqs (126 conns), 8.2 req/s, finished in 15.394365 s
rtt min/avg/med/max = 102.114/122.123/121.289/151.520 ms
finished in 15.394867 seconds, 1000 reqs (1000 conns), 65.0 req/s received
status codes: 1000 HTTP-302
data received: 63.498 KiB/s, 1001000 bytes total (783000 bytes http + 218000 bytes content)
rtt 2/9|25/50/75|91/98-th quantile = 103.737/108.696 | 115.124/121.688/129.944 | 137.715/148.159 ms
rtt min/avg/max = 95.255/122.919/184.555 ms
The --csv
option allows to export the raw measurement data in format
suitable for offline analysis with statistical tools such as R
.