Tag Archives: benchmarking

Load testing a web site with Siege

Siege is an HTTP load testing and benchmarking utility. It helps you test you server and web developments in high load situations. Quoted from it’s home page:

Siege is an http load testing and benchmarking utility. It was designed to let web developers measure their code under duress, to see how it will stand up to load on the internet. Siege supports basic authentication, cookies, HTTP and HTTPS protocols. It lets its user hit a web server with a configurable number of simulated web browsers. Those browsers place the server “under siege.”

Servers

To install it in Ubuntu just use the repositories:

sudo apt-get install siege

In Mac OS X using MacPorts:

sudo port install siege

And using brew:

sudo brew install siege

If you don’t use either of them you’ll have to download and compile the source code. It’s as easy as running those commands that will install the binary files in /usr/local/bin folder:

curl -O http://download.joedog.org/siege/siege-latest.tar.gz
tar xzvpf siege-latest.tar.gz
cd `ls -1d */ | grep siege- | sort -r | head -1`
./configure
make
sudo make install

Note: That “strange” cd command moves you into the folders extracted from siege-latest.tar.gz. As it could have any version number we get the list of all folders starting with siege-, then sort in reverse order and get the first one.

Use siege.config to create a .siegerc file in your home folder with the default configuration:

$ siege.config
New configuration template added to /Users/user/.siegerc
Run siege -C to view the current settings in that file

Then you can list it’s options using the -C parameter of siege:

$ siege -C
CURRENT  SIEGE  CONFIGURATION
Mozilla/5.0 (apple-x86_64-darwin13.3.0) Siege/3.0.6
Edit the resource file to change the settings.
----------------------------------------------
version:                        3.0.6
verbose:                        true
quiet:                          false
debug:                          false
protocol:                       HTTP/1.1
get method:                     HEAD
connection:                     close
concurrent users:               15
time to run:                    n/a
repetitions:                    n/a
socket timeout:                 30
accept-encoding:                gzip
delay:                          1 sec
internet simulation:            false
benchmark mode:                 false
failures until abort:           1024
named URL:                      none
URLs file:                      /usr/local/etc/urls.txt
logging:                        true
log file:                       /usr/local/var/siege.log
resource file:                  /Users/user/.siegerc
timestamped output:             false
comma separated output:         false
allow redirects:                true
allow zero byte data:           true
allow chunked encoding:         true
upload unique files:            true

Now that siege is installed you can start testing a web site:

siege -c5 -d5 -r1 -v http://www.test.com

In this example I used:

  • -c5 to define the number of concurrent users
  • -d5 to define the delay between each user request
  • -r1 to define number of repetitions

The result of the command is something like this:

** SIEGE 3.0.6
** Preparing 5 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200   0.14 secs:    7706 bytes ==> GET  /
HTTP/1.1 200   0.16 secs:    7706 bytes ==> GET  /
HTTP/1.1 200   0.11 secs:    7706 bytes ==> GET  /
HTTP/1.1 200   0.11 secs:    7706 bytes ==> GET  /
HTTP/1.1 200   0.11 secs:    7706 bytes ==> GET  /
done.

Transactions:		           5 hits
Availability:		      100.00 %
Elapsed time:		        4.12 secs
Data transferred:	        0.04 MB
Response time:		        0.13 secs
Transaction rate:	        1.21 trans/sec
Throughput:		        0.01 MB/sec
Concurrency:		        0.15
Successful transactions:           5
Failed transactions:	           0
Longest transaction:	        0.16
Shortest transaction:	        0.11

But this command only tests one URL in your server, the one you give as parameter. To make a more real world test you can use the logparse Perl script to create your own urls.txt file. This program collects URLs from Apache style access logs and populates a urls.txt file to use it later with siege. The parameters needed are the web site you want to generate the URLs for and an access_log file from the Apache server:

perl logparse -h http://test.com -f /opt/local/apache2/logs/test.com-access_log

Once you have the urls.txt file you can use it in siege with the -f option:

siege -c5 -d5 -r1 -f=urls.txt -v http://www.test.com

Ref: http://www.joedog.org/siege-home/