You can test the scalability and performance of your site with benchmarking and traffic generation tools. Many commercial and open-source tools are available, each with varying degrees of sophistication. In general, it is difficult to accurately simulate real-world request traffic because visitors have different navigation patterns, access the Internet using connections with different speeds, stop a download if it is taking too long, press the reload button repeatedly if they get impatient, and so on. As such, some tools record actual network traffic for later replay.
However, for a quickbut accurateglimpse at basic information regarding your server's capability to handle heavy traffic, the Apache server comes with a simple, but useful, load-testing tool called ApacheBench, or ab. You can find it in the /bin directory of the Apache distribution.
This tool enables you to request a certain URL a number of times and display a summary of the result. The following command requests the main page of the www.example.com server 1,000 times, with 10 simultaneous clients at any given time:
# /usr/local/apache2/bin/ab -n 1000 -c 10 http://www.example.com/
By the Way
If you invoke ab without any arguments, you will get a complete listing of command-line options and syntax. Additionally, the trailing slash on the target URL is required, unless a specific page is named.
The result will look similar to the following:
This is ApacheBench, Version 2.0.40-dev <$Revision: 220.127.116.11 $> apache-2.0 Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Copyright (c) 1998-2002 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 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Finished 1000 requests Server Software: Apache/2.0.55 Server Hostname: www.example.com Server Port: 80 Document Path: / Document Length: 16 bytes Concurrency Level: 10 Time taken for tests: 2.269667 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 252255 bytes HTML transferred: 16080 bytes Requests per second: 440.59 [#/sec] (mean) Time per request: 22.697 (mean) Time per request: 2.270 (mean, across all concurrent requests) Transfer rate: 108.39 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 1.9 0 15 Processing: 1 20 61.9 15 689 Waiting: 0 19 60.6 14 687 Total: 1 21 61.9 15 689 Percentage of the requests served within a certain time (ms) 50% 15 66% 16 75% 17 80% 18 90% 19 95% 22 98% 224 99% 422 100% 689 (longest request)
These requests were made over the Internet to a sample server. You should get many more requests per second if you conduct the test against a server in the same machine or over a local network. The output of the tool is self-explanatory. Some of the relevant results are the number of requests per second and the average time it takes to service a request. You can also see how more than 95% of the requests were served in less than one second.
You can play with different settings for the number of requests and with the number of simultaneous clients to find the point at which your server slows down significantly.