Thursday, March 1, 2012

Howto: Performance Benchmarks a Webserver Howto

SkyHi @ Thursday, March 01, 2012
You can benchmark Apache, IIS and other web server with apache benchmarking tool called ab. Recently I was asked to performance benchmarks for different web servers.
It is true that benchmarking a web server is not an easy task. From how to benchmark a webserver:
First, benchmarking a web server is not an easy thing. To benchmark a web server the time it will take to give a page is not important: you don't care if a user can have his page in 0.1 ms or in 0.05 ms as nobody can have such delays on the Internet.
What is important is the average time it will take when you have a maximum number of users on your site simultaneously. Another important thing is how much more time it will take when there are 2 times more users: a server that take 2 times more for 2 times more users is better than another that take 4 times more for the same amount of users."
Here are few tips to carry out procedure along with an example:

Apache Benchmark Procedures

  • You need to use same hardware configuration and kernel (OS) for all tests
  • You need to use same network configuration. For example, use 100Mbps port for all tests
  • First record server load using top or uptime command
  • Take at least 3-5 readings and use the best result
  • After each test reboot the server and carry out test on next configuration (web server)
  • Again record server load using top or uptime command
  • Carry on test using static html/php files and dynamic pages
  • It also important to carry out test using the Non-KeepAlive and KeepAlive (the Keep-Alive extension to provide long-lived HTTP sessions, which allow multiple requests to be sent over the same TCP connection) features
  • Also don't forget to carry out test using fast-cgi and/or perl tests

Webserver Benchmark Examples:

Let us see how to benchmark a Apache 2.2 and lighttpd 1.4.xx web server.

Static Non-KeepAlive test for Apache web server

i) Note down server load using uptime command
$ uptime
ii) Create a static (small) html page as follows (snkpage.html) (assuming that server IP is in /var/www/html (or use your own webroot):
PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

Webserver test

This is a webserver test page.

Login to Linux/bsd desktop computer and type following command:
$ ab -n 1000 -c 5
  • -n 1000: ab will send 1000 number of requests to server in order to perform for the benchmarking session
  • -c 5 : 5 is concurrency number i.e. ab will send 5 number of multiple requests to perform at a time to server
For example if you want to send 10 request, type following command:
$ ab -n 10 -c 2
This is ApacheBench, Version 2.0.41-dev <$Revision: 1.141 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd,
Copyright (c) 1998-2002 The Apache Software Foundation,
Benchmarking (be patient).....done
Server Software:
Server Hostname:
Server Port:            80
Document Path:          /
Document Length:        16289 bytes
Concurrency Level:      1
Time taken for tests:   16.885975 seconds
Complete requests:      10
Failed requests:        0
Write errors:           0
Total transferred:      166570 bytes
HTML transferred:       162890 bytes
Requests per second:    0.59 [#/sec] (mean)
Time per request:       1688.597 [ms] (mean)
Time per request:       1688.597 [ms] (mean, across all concurrent requests)
Transfer rate:          9.59 [Kbytes/sec] received
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:      353  375  16.1    386     391
Processing:  1240 1312  52.1   1339    1369
Waiting:      449  472  16.2    476     499
Total:       1593 1687  67.7   1730    1756
Percentage of the requests served within a certain time (ms)
  50%   1730
  66%   1733
  75%   1741
  80%   1753
  90%   1756
  95%   1756
  98%   1756
  99%   1756
 100%   1756 (longest request)
Repeat above command 3-5 times and save the best reading.

Static Non-KeepAlive test for lighttpd web server

First, reboot the server:
# reboot
Stop Apache web server. Now configure lighttpd and copy /var/www/html/snkpage.html to lighttpd webroot and run the command (from other linux/bsd system):
$ ab -n 1000 -c 5
c) Plot graph using Spreadsheet or gnuplot.

How do I carry out Web server Static KeepAlive test?

Use -k option that enables the HTTP KeepAlive feature using ab test tool. For example:
$ ab -k -n 1000 -c 5
Use the above procedure to create php, fast-cgi and dynmic pages to benchmarking the web server.
Please note that 1000 request is a small number you need to send bigger (i.e. the hits you want to test) requests, for example following command will send 50000 requests :
$ ab -k -n 50000 -c 2

How do I save result as a Comma separated value?

Use -e option that allows to write a comma separated value (CSV) file which contains for each percentage (from 1% to 100%) the time (in milliseconds) it took to serve that percentage of the requests:
$ ab -k -n 50000 -c 2 -e apache2r1.cvs

How do I import result into excel or gnuplot programs so that I can create graphs?

Use above command or -g option as follows:
$ ab -k -n 50000 -c 2 -g apache2r3.txt
Put following files in your webroot (/var/www/html or /var/www/cgi-bin) directory. Use ab command.

Sample test.php file

$command=`perl -v`;
$title = "Perl Version";
print "Content-type: text/html\n\n";
print "$title\n\n\n";
print "


; print $command;   print "\n\n";  
Run ab command as follows:
$ ab -n 3000 -c 5

Sample psql.php (php+mysql) file


   $link = mysql_connect("localhost", "USERNAME", "PASSWORD");
   $query = "SELECT * FROM TABLENAME";
   $result = mysql_query($query);
   while ($line = mysql_fetch_array($result))
      foreach ($line as $value)
         print "$value\n";

Run ab command as follows:
$ ab -n 1000 -c 5

Featured Articles:

Here is a way to let ab produce a CSV file that covers a range of concurrencies (like 0-1,000), saving you the hurdle of running ab 1,000 times (and merging results).
It has been used to benchmark Apache, IIS 5.1 and 7.0, Nginx, Cherokee, Rock and TrustLeap G-WAN, see:
You just have then to import the CSV file into Open Office to generate Charts!


What is DomainKeys?

SkyHi @ Thursday, March 01, 2012
DomainKeys is an email authentication technology developed by Yahoo, and is primarily used as an additional anti-spam and anti-phishing method.

How DomainKeys works
  • Sending emails
    • The domain owner generates a public / private key pair to use for signing all outgoing messages (multiple key pairs are allowed). The public key is published in DNS, and the private key is made available to their DomainKey-enabled outbound email servers.
    • When each email is sent by an account within the domain, the DomainKey-enabled email server automatically uses the stored private key to generate a digital signature of the message. This signature is embedded as a header in the sent email, and the email is sent on to the target recipient's mail server.
  • Receiving emails
    • The DomainKeys-enabled receiving email server extracts the signature and claimed From: domain from the email headers and fetches the public key from DNS for the claimed From: domain.
    • The public key from DNS is then used by the receiving mail server to verify that the signature was generated by the matching private key. This proves that the email was indeed sent by, and with the permission of, the claimed sending From: domain and that its headers and content weren't altered during the transfer.
    • The receiving email server applies the local policies based on the results of the signature test. If the domain is verified and no other antispam tests catch it, the email can be delivered to the user's inbox. If the signature fails to verify, or there isn't one, the email can be dropped, flagged or quarantined.
How to check your mail server uses this technology correctly
Send an email to the following randomly generated email Once you have sent your message, click the "View Results" button below to see your message results. Please note that it may take a few minutes to receive the message.


What is a glue record?

SkyHi @ Thursday, March 01, 2012
A glue record in simplest terms is an IP address that is "glued" to a specific domain or subdomain in the registry. Glue records are most commonly needed for users that are trying to use name server addresses that are subdomains of the domain itself. To explain a little further: 

John has a domain registered named John wants to set up his own name servers (DNS) using the addresses and The problem with this is that because of the way that DNS works, every time someone tries to access, they will have to check with one of the subdomains ( or for the address which are both "under" the domain. Since you can't get to a subdomain before getting to the domain, and the domain is what we are looking for in the first place, we seem to be stuck. Let's personify the process for finding the correct address for a domain in the DNS lookup process:

Q: "I am trying to find What is the IP address for the website"
A: "I do not have the address. Check the name server for You will find the address there."
Q: "Okay. What is the name server for"
A: ""
Q: "Okay. What is the address for so I can check there?"
A: "I do not have the address. is a subdomain of So check the name server for"
Q: "Okay.... What is the name server for"
A: ""
Q: "You just said that. So you know the name of the name server but don't have the address?"
A: "Yes, only the name server has the address of the name server!"
Q: "So if only the name server knows the address for the name server, how am I supposed to get the address?!"   

The solution to this is to set up a glue record. A glue record will glue the IP address to the domain/subdomain so that the process is a bit more like:

Q: "I am trying to find What is the IP address for the website"
A: "I do not have the address. Check the name server for You will find the address there."
Q: "Okay. What is the name server for"
A: ""   

This time the name came with an address since they were "glued" together! Now that's helpful!

This process may seem very technical but setting up a glue record in the 1&1 Control Panel is actually quite easy and may have already happened without you even knowing it. Any time a subdomain is created with "ns" at the beginning, a glue record is automatically created for this subdomain. Follow the next steps to get a better understanding:

Step 1:

Log in to the 1&1 Control Panel using your Customer ID OR domain name and your password

If you have only one package, you will land on the Administration page. If you have more than one package, select the package in question to reach its Administration page.

Step 2:

Click the Domains link from the Domains & Webspace panel.

Step 3:

Click the down arrow button next to New and select Create Subdomain.

Step 4:

Enter a subdomain that starts with "ns" such as ns1ns2, etc. and select the appropriate domain from the drop-down box.
Click the OK button when finished to create the subdomain.

Step 5:

The subdomain should be set up within the next 15 minutes or so. The glue record will be applied to the subdomain since it starts with "ns" however since the glue record is a DNS record, it may take 24-48 hours until fully updated and recognized by all servers/computers on the Internet.

You must have at least two name server addresses. Repeat this process to create another subdomain that starts with "ns" such as ns2.

If you need to change the IP address that the subdomain points to, please reference How do I edit/change a domain's IP Address (A record)?