wordpress performance & scalability
DESCRIPTION
TRANSCRIPT
WordPressPerformance & Scalability
Joseph Scotthttp://josephscott.org/
Find Me
• http://josephscott.org/
• http://twitter.com/josephscott/
• #wordpress-dev
Backup First
Performance
Shelby Supercars Ultimate Aero Twin Turbo
Scalability
Web Apps Are LikeOgres Onions
Start At The BottomDeal with network problems / bottlenecks first
Be familiar with Operating System network optimizations
Web Server
Apache?
Web Server
nginxhttp://nginx.net/
lighttpdhttp://www.lighttpd.net/
LiteSpeedhttp://litespeedtech.com/
Zeushttp://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 TypesMyISAM
• 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 andwork 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 Xeon1 GB Ram
Abusing The Serversiege - 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
a phpinfo( )’s worth
static HTML - phpinfo.html100% (75 r/s) ~0.04 s/r
PHP - phpinfo.php92% (69 r/s) ~0.04 s/r
51,213 / 8,689 bytes
Hello World!
WordPress: /wp/?p=1
6,582 / 2,531 bytes
Hello World!
WordPress: /wp/?p=18% (6 r/s) ~7 s/r
6,582 / 2,531 bytes
Hello World!+ APC
WordPress: /wp/?p=129% (22 r/s) ~1.51 s/r
Use An Opcode Cache!%8 ~7 %29 ~1.51
Use An Opcode Cache!%8 ~7 %29 ~1.51
WordPress + Memcache
• Ryan Boren
• Stores WordPress data in Memcache
• Reduces the number of database queries
• http://ryan.wordpress.com/2005/12/23/memcached-backend/
Hello World!+ APC + Memcache
WordPress: /wp/?p=132% (24 r/s) ~1.4 s/r
Batcache!
WordPress + Batcache
• Andy Skelton
• Stores rendered HTML in Memcache
• http://wordpress.org/extend/plugins/batcache/
Hello World! + APC + Memcache + Batcache
WordPress: /wp/?p=180% (60 r/s) ~0.4 s/r
Hello World! + APC + Memcache + Batcache
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.
DescriptionRequests
per SecondSeconds per
request (mean)Potential
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/Memcache
24 ~1.40 32%
WP & APC/Memcache/Batcache
60 ~0.04 80%
What Now?
All In One
Web / Database
Moving Out
Web Database
Paying In Cache
Web
DatabaseMemcache
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
Web
DB Master
MemcacheDB Slave
A Balancing Act
Web 2
Load Balancer
Web 1 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/
• http://twitter.com/josephscott/
• #wordpress-dev