Using apachebench (ab) with Drupal 7 to load test site with authenticated users

apachebench is an excellent performance and load-testing tool for any website, and Drupal-based sites are no exception. A lot of Drupal sites, though, need to be measured not only under heavy anonymous traffic load (users who aren't logged in), but also under heavy authenticated-user load.

Drupal.org has some good tips for ab testing, but the details for using ab's '-C' option (notice the capital C... C is for Cookie) are lacking. Basically, if you pass the -C option with a valid session ID/cookie, Drupal will send ab the page as if ab were authenticated.

Instead of constantly going into the database and looking up session IDs and such nonsense, I have a simple script, which is quite revised from the 2008-era script originally from 2bits that worked with Drupal 5, which will give you the proper ab commands for stress-testing your Drupal site under authenticated user load. Simply copy the attached script (source pasted below) to your site's docroot, and run the command from the command line as follows:

<br />
# [PATH_TO_SCRIPT] [HTTP_HOST] [URL_TO_TEST] [#_SESSIONS] [#_REQUESTS]<br />
$ /path/to/drupal/root/ab-testing-cli.php www.example.com http://www.example.com/node/1 2 10<br />

You'll get back the command to paste into the cli in order to test the URL you provided as an authenticated user. (Note: The sessions table needs to be populated for this to work, so someone (or a few someones) will need to have logged in during the past few hours/days for this to work correctly).

Here's the full code (file attached to bottom of post):

<?php
 
<br /
?>
/**
* @file
*
* Script to generate ab tests for logged in users using sessions from database.
* This script is based on an older script by 2bits for load testing Drupal 5,
* located at: http://goo.gl/4pfku
*
* Place this script into the webroot of your Drupal site.
*
* Usage (from command line):
* # [PATH_TO_SCRIPT] [HTTP_HOST] [URL_TO_TEST] [#_SESSIONS] [#_REQUESTS]
* $ php /path/to/drupal/root/ab-testing-cli.php example.com http://www.example.com/ 2 200
*
* After the script runs, it will output a list of commands for you to use to
* test your website as a logged-in user.
*/

// Set the variable below to your Drupal root (on the server).
$drupal_root = '/path/to/drupal/root/';

// If arguments not supplied properly, warn user.
if ($argc != 5) {
$prog = basename($argv[0]);
print "Usage: $prog host url concurrency num_requests\n";
exit(1);
}

// Get the arguments for ab.
$url = $argv[2];
$number_concurrency = $argv[3];
$number_requests = $argv[4];

// Set this directory to your drupal root directory.
chdir($drupal_root);

// Set up required variables to help Drupal bootstrap the correct site.
$_SERVER['HTTP_HOST'] = $argv[1];
$_SERVER['PHP_SELF'] = basename(__file__);
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';
define('DRUPAL_ROOT', getcwd());

// Boostrap Drupal.
require_once('./includes/bootstrap.inc');
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

// Get as many sessions as the user calls for.
$results = db_query_range("SELECT sid FROM {sessions} WHERE uid > 1", 0, $number_concurrency)->fetchAll();

// Loop through the results and print the proper ab command for each session.
foreach ($results as $result) {
$cookie = session_name() . '=' . $result->sid;
print "ab -c 1 -n $number_requests -C $cookie $url\n";
}
?>

Comments

Very helpful, thanks a lot !
I think it definitely deservers its own drush command... Any volunteer ?

Check out drush - you'll find it much easier to create small utilities like this.