Start At The Bottom
Deal with network
problems / bottlenecks
first
Be familiar with Operating
System network
optimizations
Web Server
Apache?
Web Server
nginx LiteSpeed
http://nginx.net/ http://litespeedtech.com/
lighttpd Zeus
http://www.lighttpd.net/ http://www.zeus.com/
Apache
• Can be a pig, remove any modules you aren’t
using
• Turn off host name lookups
• Turn on compression (mod_deflate)
• Turn off FollowSymLinks (and .htaccess if you
can)
• Skip Apache all together, serve static content
from another server
PHP
• Use an opcode cache (APC, lots of others)
• Don’t use on static files (unless you really,
really need to)
• Consider output buffering
• Be careful with preg_* functions
MySQL - Table Types
MyISAM
• High performance reads or writes, not
both
• Full text search
InnoDB
• Better for mixed reads/writes
• Transactions, Foreign Keys
MySQL
• Double (and triple) check indexes
• Tune your configuration
• key_buffer_size, table_cache,
sort_buffer_size, read_buffer_size
• Replication (more on that later)
• Interesting quirks, get familiar with them
Memcache
In memory object cache, learn it, use it, love it
With Caution
WordPress
• MySQL tables default to using MyISAM,
consider using InnoDB instead
• Turn off unused plugins
• Check that themes and plugins aren’t abusing
MySQL or PHP
• Server static content from another server
(optimized for that task)
Construction
Start from the bottom and
work your way up
Test Setup
• Ubuntu 9.04 server edition
• Apache 2.2.11
• PHP 5.2.6
• MySQL 5.0.75
• WordPress -trunk
Test “Hardware”
Parallels 4.0
2.66 Xeon
1 GB Ram
Abusing The Server
siege - http://www.joedog.org/index/siege-home
siege -d 1 -c 50 -r 10 http://192.168.1.100/
Below The Baseline
Zero Byte HTML - zero.html
(80 r/s) ~0.01 s/r
Zero Byte PHP - zero.php
(80 r/s) ~0.01 s/r
WordPress + Memcache
• Ryan Boren
• Stores WordPress data in Memcache
• Reduces the number of database queries
• http://ryan.wordpress.com/2005/12/23/
memcached-backend/
WordPress
+ WP Super Cache
• Donncha O Caoimh
• Stores rendered HTML on disk
• http://wordpress.org/extend/plugins/wp-super-
cache/
Let me 'splain. ...
No, there is too much. Let me sum up.
Requests Seconds per
Description Potential
per Second request (mean)
Zero Bytes 80 ~0.01 -
Static phpinfo() 75 ~0.04 100%
phpinfo() 69 ~0.04 92%
OOB WP 6 ~7.00 8%
WP & APC 22 ~1.51 29%
WP & APC/
24 ~1.40 32%
Memcache
WP & APC/
60 ~0.04 80%
Memcache/Batcache
What Now?
All In One
Web / Database
Moving Out
Web Database
Paying In Cache
Web
Memcache Database
But Wait, There’s More!
MySQL Replication
• Master / Slave - one way asynchronous
• Send writes to the master, reads to the
slave(s)
• Replication works on both MyISAM and
InnoDB tables
• Supports multiple slaves and replication
chaining
Enter HyperDB
• Drop in replacement for the default
WordPress database class
• Supports distributed reads/writes
• Partition data (helpful for large WPMU
installs)
• Failover support when a database goes down
• http://codex.wordpress.org/HyperDB
Replicated Data
DB Master
Web
Memcache
DB Slave
A Balancing Act
Load Balancer
Web 1 Web 2 Web 3
Variations on a Theme
• Master / Relay / Slave
• Slave just for backups
• Multiple data centers
• Task specific web servers
When Everything Goes
Wrong
Hire An Amazing
SysAdmin
Thank You
Find Me
• http://josephscott.org/
• joseph@josephscott.org
• http://twitter.com/josephscott/
• #wordpress-dev
0 comments
Post a comment