A Tale of Seduction and Betrayal
Some of the best-designed and officially featured WordPress themes aren’t built to handle mid-volume traffic. Just one incoming link from a semi-popular page can take your server down.
A New Blog for a Web App
Everything started out smoothly. Like thousands of developers do every day, I set up a new WordPress installation to support a new web app I’m getting online. I’ve got a Linode 1536 which is perfect for this ♢. It has gigs of free disk space and 800MB of unused RAM just for cache. And these virtual servers are fast. Mine hosts about 15 Rails and WordPress apps and the system load never gets up to 1.0.
For me, the hardest (and most fun) part of setting up a new blog is choosing the theme. I didn’t want to waste time, so I looked only at WordPress’s one-page “featured” themes list and chose News — a conservative theme with personality.
I wrote a few posts to get started, posted a link to one on Reddit, and went to sleep.
I Woke Up but My Server Wasn’t There
At around 9am, I was in for a shock: no web pages were loading and it took 2 minutes to simply ssh in. There were about a million Apache processes running and the system was out of memory. Checking on Reddit, I saw that the post was getting a good amount of traffic: it was at the top of the r/programming subreddit. It had a couple of hundred up-votes; a lot, but certainly not an apocalypse. So this was odd. I also saw that someone reposted it to the Hacker News. (Nice!) Except that the posts were only noting that the site was offline (Not nice.)
Discovering the Culprit: the Theme
A helpful Hacker News reader suggested “Caching is your friend”. That was my first thought as well. WordPress by default is just a PHP app, doing a lot of repetitious work with every request. But that didn’t feel right. This was a brand new blog, after all, and the requests were all for one simple page.
The web server logs held the answer. Every visit to that blog post was generating 46 server requests for theme assets. 36 of those were for images. I couldn’t believe that the theme linked to that many individual files. This is a huge issue: it’s very important to reduce the number of external files required by a web page. No amount of server caching and optimization can help a site designed like this.
I used a trick to re-gain access to the web site. I stopped Apache, restarted it, and then jumped in before more web requests would arrive. I changed to the simpler but very well designed Twenty Eleven theme and … my web sites began to come back to life. I re-checked the server logs. Each visit was now generating only 7 requests.
The Moral: Trust But Verify Your Theme
Even highly promoted beautiful themes can have flaws that will crash an entire server under even modest traffic. Before you permanently change to a new theme, look at the HTML it generates. Analyze it with YSlow or Page Speed.