ab is a benchmarking tool for web server that normally comes standard with
Apache installation. It's used for load-testing your web server and produce useful metrics such as the number of requests per second that the server is able to serve.
ab could be used to benchmark any web server including
The way load-testing with
ab work is by generating
HTTP requests to the web server as fast as the web server could handle and then to iteratively tune the web server configuration based on the result.
ab supports a few options that could test different aspect of the web server.
Apacheweb server package along with all the dependencies for your operating system.
$ sudo apt update && sudo apt install --assume-yes apache2 # Ubuntu and Debian derivatives $ sudo yum install --assumeyes httpd # CentOS and RedHat derivatives
ApacheBench) binary is included with
Apache installation as a dependency.
URLof the web page that you want to perform the load test against.
abagainst the selected web page.
$ ab -n <number_of_request> -c <concurrency> <url>
Make sure to add a (forward) slash (
/) at the end of the
URL otherwise it will not be recognised by the command
This is a basic example of performing a performance test which in this case is to send a total of
<number_of_request> requests to the web server with
<concurrency> being sent concurrently
Other options for
$ ab -h Usage: ab [options] [http[s]://]hostname[:port]/path Options are: -n requests Number of requests to perform -c concurrency Number of multiple requests to make at a time -t timelimit Seconds to max. to spend on benchmarking This implies -n 50000 -s timeout Seconds to max. wait for each response Default is 30 seconds -b windowsize Size of TCP send/receive buffer, in bytes -B address Address to bind to when making outgoing connections -p postfile File containing data to POST. Remember also to set -T -u putfile File containing data to PUT. Remember also to set -T -T content-type Content-type header to use for POST/PUT data, eg. 'application/x-www-form-urlencoded' Default is 'text/plain' -v verbosity How much troubleshooting info to print -w Print out results in HTML tables -i Use HEAD instead of GET -x attributes String to insert as table attributes -y attributes String to insert as tr attributes -z attributes String to insert as td or th attributes -C attribute Add cookie, eg. 'Apache=1234'. (repeatable) -H attribute Add Arbitrary header line, eg. 'Accept-Encoding: gzip' Inserted after all normal header lines. (repeatable) -A attribute Add Basic WWW Authentication, the attributes are a colon separated username and password. -P attribute Add Basic Proxy Authentication, the attributes are a colon separated username and password. -X proxy:port Proxyserver and port number to use -V Print version number and exit -k Use HTTP KeepAlive feature -d Do not show percentiles served table. -S Do not show confidence estimators and warnings. -q Do not show progress when doing more than 150 requests -l Accept variable document length (use this for dynamic pages) -g filename Output collected data to gnuplot format file. -e filename Output CSV file with percentages served -r Don't exit on socket receive errors. -m method Method name -h Display usage information (this message) -I Disable TLS Server Name Indication (SNI) extension -Z ciphersuite Specify SSL/TLS cipher suite (See openssl ciphers) -f protocol Specify SSL/TLS protocol (SSL2, TLS1, TLS1.1, TLS1.2 or ALL) -E certfile Specify optional client certificate chain and private key
$ ab -n 1000 -c 10 https://www.example.com/ This is ApacheBench, Version 2.3 <$Revision: 1826891 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking www.example.com (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 560 requests Completed 610 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: Apache/2.4.33 Server Hostname: www.example.com Server Port: 443 Document Path: / Document Length: 12906 bytes Concurrency Level: 10 Time taken for tests: 19.070 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 13410000 bytes HTML transferred: 12905610 bytes Requests per second: 52.44 [#/sec] (mean) Time per request: 190.704 [ms] (mean) Time per request: 19.070 [ms] (mean, across all concurrent requests) Transfer rate: 686.70 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.0 0 1 Processing: 73 190 41.2 186 348 Waiting: 72 188 41.2 185 346 Total: 73 190 41.2 186 348 Percentage of the requests served within a certain time (ms) 50% 186 66% 207 75% 218 80% 226 90% 244 95% 257 98% 272 99% 305 100% 348 (longest request)
Some of the more important results are
Requests per second and
Time per request.
Other commonly used options for testing are
-k which is to enable
KeepAlive mode and reducing network overhead by sharing a single
HTTP session for all the requests.
JMetermight be more suitable for that.
abshould not be run on the same machine as the web server.
abitself is resource intensive, thus doing so will negatively impact the web server's performance and skew the test result.
|Ubuntu 16.04 LTS (Xenial Xerus)||Apache 2.2|
|Ubuntu 16.10 (Yakkety Yak)||Apache 2.3|
|Ubuntu 17.04 (Zesty Zapus)||Apache 2.4|
|Ubuntu 17.10 (Artful Aardvark)|
|Ubuntu 18.04 LTS (Bionic Beaver)|
|Ubuntu 18.10 (Cosmic Cuttlefish)|
|Ubuntu 19.04 (Disco Dingo)|
Comment anonymously. Login not required.