WordPress Optimization Guide
If you ever experienced slow WordPress admin panel, “MySQL server has gone away” message, pages taking forever to load or you want to prepare your site for a major increase in traffic (for example Digg front page) this is the guide for you. (update: article and the site ’survived’ Digg, Delicious and Mixx front pages on 12th November)1. Check the Connection
In some occasions your connection and bandwidth may be the cause for the slow load. In case your site shows all right for everyone else but not for you this is the prime suspect.
You can run a trace back to your site also called “trace route” to see if there are any unusually slow hosts in-between.
The command to try it is tracert on Windows (or traceoute on Linux)
tracert www.prelovac.com
The command displays the average time to servers along the route (usually in ms). In case you see a constant problem along the route (high values) you can try contacting your ISP or changing ISP all together.
The second problem may be bandwidth problem.
Typical WordPress page is around 150KB in size, which means it will load for most modem users in about 35 seconds, just because of bandwidth with all other factors omitted.
2. Check your (Vista) System
In rare occasions it can be even your system that is causing the slowdown.
If you are running Vista check this article for a diagnosis and a possible solution.
3. Check the Plugins
Plugins are usually the prime suspect for slowdowns. With so many WordPress plugins around, chance is you might have installed a plugin which does not use the resources in an optimum way.
For example such plugins that caused slowdowns in the past have been Popularity contest, aLinks or @Feed.
To check plugins, deactivate all of them and check the critical areas of the site again. If everything runs OK, re-enable the plugins one by one until you find the problematic plugin.
After finding the cause you can either write a message to the plugin author and hope they fix it or search for an alternative.
4. Check your Theme
If it’s not the plugins, and you are troubleshooting slowdown of the site, you should check it with a different theme.
Themes can include code with plugin capabilities inside the theme’s function.php file so everything what applies to plugins can apply to the theme.
Also, themes may use excessive JavaScript or image files, causing slow loading of the page because of huge amount of data to transfer and/or number of http requests used.
WordPress comes installed with a default theme and it’s best used to test the site if your theme is the suspect for poor performance.
If you discover your theme is causing the slowdowns, you can use the excellent Firebug tool for Firefox browser to debug the problem. Learn more about Firebug, your new best friend.
You can also use this site get general information about the site very fast.
5. Optimize Database Tables
Database tables should be periodically optimized (and repaired if necessary) for optimum performance.
I recommend using WP-DBManager plugin which provides this functionality as well as database backup, all crucial for any blog installation.
WP-DBManager allows you to schedule and forget, and it will take care of all the work automatically.
Other alternative is manually optimizing and repairing your table through a tool like phpmyadmin.
6. Turn off Post Revisions
With WordPress 2.6, post version tracking mechanism was introduced. For example, every time you “Save” a post, a revision is written to the database. If you do not need this feature you can easily turn it off by adding one line to your wp-config.php file, found in the installation directory of your WordPress site:
define(’WP_POST_REVISIONS’, false);
If you have run a blog with revisions turned on for a while, chance is you will have a lot of revision posts in your database. if you wish to remove them for good, simply run this query (for example using the mentioned WP-DBManager) plugin.
DELETE FROM wp_posts WHERE post_type = ‘revision’;
This will remove all “revision” posts from your database, making it smaller in the process.
NOTE: Do this with care. If you are not sure what you are doing, make sure to at least create a backup of the database first or even better, ask a professional to help you.
7. Implement Caching
Caching is a method of retrieving data from a ready storage (cache) instead of using resources to generate it every time the same information is needed. Using cache is much faster way to retrieve information and is generally recommended practice for most modern applications.
7.1 WordPress Cache
The easiest way to implement caching (and usually the only way if your blog is on shared hosting) is to use a caching plugin.
The most commonly used is WP Super Cache which is easy to install and setup.
If you run our own server you have several more options.
7.2 MySQL Optimization
MySQL can save the results of a query in it’s own cache. To enable it edit the MySQL configuration file (usually /etc/my.cnf) and add these lines:
query_cache_type = 1
query_cache_limit = 1M
query_cache_size = 20M
This will create a 20 MB query cache after you restart the MySQL server.
To check if it is properly running, run this query:
SHOW STATUS LIKE ‘Qcache%’;
Example result:
Qcache_free_blocks 718 Qcache_free_memory 13004008 Qcache_hits 780759 Qcache_inserts 56292 Qcache_lowmem_prunes 0 Qcache_not_cached 3711 Qcache_queries_in_cache 1715 Qcache_total_blocks 4344
Tip #1: If you are expecting a Digg Front Page you are likely to exceed your current limit of maximum concurrent MySQL connections which is among the prime reasons a site failing a Digg traffic spike.
You can prepare by increasing this number to about 250 using this line in the config file.
max_connections = 250
7.3 PHP Opcode Cache
PHP is interpreted language, meaning that every time PHP code is started, it is compiled into the so called op-codes, which are then run by the system. This compilation process can be cached by installing an opcode cache such as eAccelerator. There are other caching solutions out there as well.
To install eAccelerator, unpack the archive and go to the eAccelerator folder. Then type:
phpize
./configure
make
make install
This will install eAccelerrator.
Next create temp folder for storage:
mkdir /var/cache/eaccelerator
chmod 0777 /var/cache/eaccelerator
Finally to enable it, add these lines to the end of your php.ini file (usually /etc/php.ini or /usr/lib/php.ini):
extension=”eaccelerator.so”
eaccelerator.shm_size=”16″
eaccelerator.cache_dir=”/var/cache/eaccelerator”
eaccelerator.enable=”1″
eaccelerator.optimizer=”1″
eaccelerator.check_mtime=”1″
eaccelerator.debug=”0″
eaccelerator.filter=”"
eaccelerator.shm_max=”0″
eaccelerator.shm_ttl=”0″
eaccelerator.shm_prune_period=”0″
eaccelerator.shm_only=”0″
eaccelerator.compress=”1″
eaccelerator.compress_level=”9″
The changes will be noticeable at once, as PHP does not need to be ‘restarted’.
Note #1: WP Super Cache and eAccelerator work just fine together showing further increase in performance.
Note #2: If you like cutting edge and even more possibility for performance, check the ultra cool WP Super Cache and eAccelerator plugin.
Note #3: You can easily test changes in your configuration by running a test from your command prompt
ab -n 1000 http://your.server/
and comparing results.
Note #4: Apache optimization is out of scope of this article but you can find extensive information here.
Note #5: You can find even more tips&tricks on Elliot Back’s site (and he plays DOTA too, how cool is that).
8. “MySQL server has gone away” workaround
This WordPress database error appears on certain configurations and it manifests in very slow and no response, usually on your admin pages.
Workaround for this MySQL problem has been best addressed in this article.
This problem evidently exists, but the suggested fix is valid only until you upgrade your WordPress. Hopefully it will be further researched and added into the WordPress core in the future.
9. Fixing posting not possible problem
If you experience WordPress admin panel crawling to a halt, with inability to post or update certain posts, you are probably hitting the mod_security wall.
ModSecurity is Apache module for increasing web site security by preventing system intrusions. However, sometimes it may decide that your perfectly normal WordPress MySQL query is trying to do something suspicious and black list it, which manifests in very slow or no response of the site.
To test if this is the case, check your Apache error log, for example:
tail -f /usr/local/apache/logs/error_log
and look for something like this:
ModSecurity: Access denied with code 500 (phase 2) … [id "300013"] [rev "1"] [msg "Generic SQL injection protection"] [severity "CRITICAL"] [hostname www.prelovac.com"] [uri “/vladimir/wp-admin/page.php”
It tells you the access for this page was denied because of a security rule with id 300013. Fixing this includes white-listing this rule for the page in question.
To do that, edit apache config file (for example /usr/local/apache/conf/modsec2/exclude.conf) and add these lines:
<LocationMatch “/vladimir/wp-admin/page.php”>
SecRuleRemoveById 300013
</LocationMatch>
This will white list the page for the given security rule and your site will continue to work normally.
10. Other reasons for slow posting
Reasons for slow WordPress posting may include rss ping and pingback timeouts.
By default WordPress will try to ping servers listed in your ping list (found in Settings->Writing panel) and one of them may timeout slowing the entire process.
Second reason are post pingbacks, mechanism in which WordPress notifies the sites you linked to in your article. You can disable pingbacks in Settings->Discussion by un-checking option “Attempt to notify any blogs linked to from the article (slows down posting)“.
Try clearing ping list and disabling pingbacks to see if that helps speed up your posting time.
Conclusion
Modern webservers and websites have grown to depend on many different factors.
This article covered various approaches to optimization from system level PHP and MySQL cache to settings within your WordPress.
I hope following this guide will help you create a fast and responsive WordPress based site.