weighttp¶
About¶
weighttp
(pronounced weighty
) is a lightweight and small benchmarking tool for webservers.
weighttp
was designed to be very fast and easy to use and only supports a tiny fraction of the HTTP 1.x protocol in order to be lean and simple.weighttp
supports multithreading to make good use of modern CPUs with multiple cores as well as event-driven I/O for concurrent requests within a single thread.
Similar tools¶
Deployment¶
Obtaining¶
Use git to fetch the latest source:
$ git clone https://git.lighttpd.net/lighttpd/weighttp.git
or download a .tar.gz from https://git.lighttpd.net/lighttpd/weighttp/archive/master.tar.gz
Binary packages are available from https://build.opensuse.org for openSUSE and Debian based distributions:
Building¶
meson¶
meson setup --buildtype debugoptimized --prefix /usr/local build cd build meson compile #sudo meson install
autotools¶
$ ./autogen.sh $ ./configure $ make
The executable is created as src/weighttp
Alternatively, you can use gcc directly.
$ gcc -g2 -O2 src/*.c -o weighttp -lpthread -lm
Usage¶
weighttp
uses similar command line arguments as apache bench
(ab) for the subset of features supported by weighttp:
weighttp <options> <URI> -n num number of requests (mandatory) -t num thread count (default: 1) (note: differs from @ab -t timeout@) -c num concurrent clients (default: 1) -k keep alive (default: no) -K num num pipelined requests (default: 1) (note: not a feature of @ab@) -6 use ipv6 (default: no) -i use HTTP HEAD method (default: GET) -m method use custom HTTP method (default: GET) -H str add header to request ("label: value"); repeatable -b size socket buffer sizes (SO_SNDBUF, SO_RCVBUF) -B addr local address to bind to when making outgoing connections -C cookie add cookie to request ("cookie-name=value"); repeatable -F use TCP Fast Open (RFC 7413) -T type Content-Type header to use for POST/PUT data, e.g. application/x-www-form-urlencoded (default: text/plain) -A string add Basic WWW Authorization (str is username:password) -P string add Basic Proxy-Authorization (str is username:password) -X proxy proxy:port or unix domain socket path beginning w/ '/' -p file make HTTP POST request using file contents for body -u file make HTTP PUT request using file contents for body -d (ignored; compatibility with Apache Bench (ab)) -l (ignored; compatibility with Apache Bench (ab)) -r (ignored; compatibility with Apache Bench (ab)) -q quiet: do not show version header or progress -h show help and exit -V show version and exit
Troubleshooting¶
Benchmarking a webserver can result in a lot of sockets being created, especially if you don't use the -k parameter to reuse existing connections.
This can cause your system to run out of TCP port numbers and you will see the following error:
error: connect() failed: Cannot assign requested address (99)
Linux has a hardcoded 60 seconds timeout before it reuses a previously in use port. You can mitigate the problem by tuning 2 kernel parameters:
TCP_TW_REUSE¶
Linux can be configured to allow reuse of sockets which are in the TIME_WAIT state when it is safe from a protocol perspective.
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
or add "net.ipv4.tcp_tw_reuse = 1" to your /etc/sysctl.conf to make the change permanent. You need to reload it via sysctl /etc/sysctl.conf
TCP_TW_RECYCLE¶
Note: TCP_TW_RECYCLE has been removed since Linux 4.12
Linux before Linux 4.12 can be configured to allow fast recycling of sockets which are in the TIME_WAIT state even if it is not safe from a protocol perspective.
You should not use this in a production environment. It can cause issues with load balancers and other mayhem.
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
or add "net.ipv4.tcp_tw_recycle = 1" to your /etc/sysctl.conf to make the change permanent (bad idea). You need to reload it via sysctl /etc/sysctl.conf
Updated by gstrauss 8 days ago ยท 13 revisions locked