Boris Smus

interaction engineering

Lightweight Wordpress on Slicehost

I recently switched from shared hosting to a VPS, expecting to get an immediate and automatic performance boost. I was overly optimistic and ran into memory trouble right away. After endlessly struggling with Apache and mod_php configuration, I was ready to give up. Then on a whim, I switched to nginx/fastcgi to see the average response time drop from 1500ms to 300ms:

image

WebFaction is a great shared hosting environment, providing tons of functionality and impeccable customer support. However, shared hosting means that multiple users share resources on a single physical machine, resulting in wildly fluctuating site performance and uptime at the whim of other clients. Also, I prefer to do system administration from the command line, but WebFaction provides a powerful but clunky web-based administrative interface. All in all, despite my respect for WebFaction, I said goodbye and switched to Slicehost.

I ordered my shiny new slice and plunged into configuration. I migrated wordpress databases and set up Apache with mod_php. Everything seemed to work reasonably well until Apache ran for a few hours and began consuming my memory allowance. The slice started thrashing and performance fell to a crawl. I found the culprit to be in my mpm_prefork_module MaxClients and MaxRequestsPerChild configuration, but even after tweaking those, my slice was hitting the wall pretty quickly. I nearly returned to cushy WebFaction, where I had marginal performance without the headache, but decided to experiment more.

Nginx is a minimalist HTTP server written by Igor Sysoev for Rambler. It's now being used by Wordpress and other high profile sites. Seeking help from the internet, I eventually came across Thomasz Sterna's php-fastcgi init script and adapted it for my slice, using

PHP_FCGI_CHILDREN=5
PHP_FCGI_MAX_REQUESTS=100

for the low-memory environment. In addition, I installed the WP Super Cache plugin.

For my django site, I wrote an init script for launching the django fcgi server via django's manage.py. Here's the important part:

MAXCHILDREN=5
MAXSPARE=5
MINSPARE=2 
# ... 
start-stop-daemon --quiet --start \
  --pidfile $PIDFILE --chuid "$USER" \
  --exec /usr/bin/env -- python $SITEPATH/$SITENAME/manage.py runfcgi \
  --settings=settings \
  host=$HOST port=$PORT pidfile=$PIDFILE \
  maxchildren=$MAXCHILDREN maxspare=$MAXSPARE minspare=$MINSPARE

I'm happy with the performance both for django and php-powered sites. However, I'm just guessing when it comes to values of MAXCHILDREN, MAXSPARE and MINSPARE, PHP_FCGI_CHILDREN and PHP_FCGI_MAX_REQUESTS.

Do you have insight on how to tweak these parameters? Is your VPS hosting configuration better?