ApacheBench (ab) is a tool for benchmarking an Apache Hypertext Transfer Protocol (HTTP) server. This shows how many requests per second the server is capable of handling.
A point to note is that ApacheBench will only use one operating system thread regardless of the concurrency level; specified by the -c parameter. In some cases, especially when benchmarking high-capacity servers, a single instance of ApacheBench can itself be a bottleneck. To overcome this, additional instances of ApacheBench may be used in parallel to more fully saturate the target URL.
ApacheBench was recently used to test the capability of the Caleum server, to find the threshold of the total number of web requests it can concurrently serve, in its current configuration.
Working with ApacheBench
Installing on a Windows machine
- Download the software from the link http://www.apache.org/dist/httpd/binaries/win32/ by selecting any mirrors on the site.
- Select the latest version of the software or later
- Double-click and install the software. While installing provide the information
Network Domain: localhost
Server Name: localhost
Admin Email: provide a real or fake email
Leave all default check boxes checked
- After installation an icon will be displayed in the system tray. This means Apache2.2 has been installed and started.
- To verify further type http://localhost/ in browser. If Apache 2.2 has been started a message “It works!” in bold will be loaded in browser
- To stop/restart the server click on the icon ->Apache 2.2->Stop/Restart.
To measure performance of a server you may need to point your files to Apache. Since we are doing a web service testing this step is optional.
Execution:
- Open command prompt and go to the path where ApacheBench is installed say “C:\Program Files\Apache Software Foundation\Apache2.2\bin”
- Type ab –n 100 –c 10 http://{webserver hostname:port}/{document path}
You can also provide the authentication details as the parameters in document path.
Other options that can be used are
Options are:
-n | requests | Number of requests to perform |
-t | timelimit | Seconds to max. wait for responses |
-v | verbosity | How much troubleshooting info to print |
-b | windowsize | Size of TCP send/receive buffer, in bytes |
-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 attributesare a colon separated username and password. |
-P | attribute | Add Basic Proxy Authentication, the attributes are a colon separated username and password. |
-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 |
-Z | ciphersuite | Specify SSL/TLS cipher suite (See openssl ciphers) |
-c | concurrency | Number of multiple requests to make |
-T | content-type | Content-type header for POSTing, eg. ‘application/x-www-form-urlencoded’. Default is ‘text/plain’ |
-g | filename | Output collected data to gnuplot format file. |
-e | filename | Output CSV file with percentages served |
-p | postfile | File containing data to POST. Remember also to set -T |
-f | protocol | Specify SSL/TLS protocol (SSL2, SSL3, TLS1, or ALL) |
-X | proxy:port | Proxyserver and port number to use |
-i | Use HEAD instead of GET | |
-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. | |
-r | Don’t exit on socket receive errors. | |
-h | Display usage information (this message) | |
-w | Print out results in HTML tables |
An output as below is displayed in the cmd prompt after the execution
Concurrency Level: | 10 | |
Time taken for tests: | 321.212 sec | |
Complete requests: | 1000 | |
Failed requests: | 11 | (Connect: 0, Receive: 0, Length: 11, Exceptions: 0) |
Write errors: | 0 | |
Document length | 21bytes | |
Total transferred: | 22124 bytes | |
HTML transferred: | 11994 bytes | |
Requests per second: | 1.01 [#/sec] (mean) | |
Time per request: | 1216.319 [ms] (mean) | |
Time per request: | 156.272 [ms] (mean, across all concurrent requests) | |
Transfer rate: | 1.81 [Kbytes/sec] received
1.61 kb/s sent 0.42 kb/s total |
Connection Times (ms) | min | mean | [+/-sd] | median | max |
Connect: | 200 | 200 | 121 | 212 | 3000 |
Processing: | 301 | 2121 | 612.8 | 1921 | 3267 |
Waiting: | 211 | 2112 | 21 | 121 | 1211 |
Total: | 711 | 3546 | 799.3 | 3281 | 6547 |
Percentage of the requests served within a certain time (ms)
50% | 1212 |
66% | 3823 |
75% | 2211 |
80% | 4555 |
90% | 5555 |
95% | 6666 |
98% | 7777 |
99% | 8888 |
100% | 8899 (longest request) |
It shows total time to complete the entire test and the number of completed request and failed requests. If there is any fail an additional line will be displayed. Connect:, Receive:, Length:, Exceptions:
While testing web server, we mainly focus on the fails in Connect and Receive. The fail in the length are due the content length not being specified or some additional data like ads come up in the page which goes beyond the specified length.
Have questions? Contact the software testing experts at InApp to learn more.