For somebody who is new to Drupal, I see that there are many resources available on Drupal Caching but I am not sure which of them to use.
1We can discuss whether we want a canonical question for this on meta, but I still think it is too broad. And performance improvements can be very context sensitive and not done in a vacuum.– mpdonadio ♦Jun 20, 2014 at 16:57
These are notes from my experiences and might vary from what others experience. I predominantly use LAMP stack and have considered the same in my suggestions.
Thumb rules for caching that I generally follow.
- Process Once Use Multiple Times.
- Live with stale data when possible
- Clear Caches infrequently and keep it very specific.
- When possible do the changes at the lowest level in the stack. LAMP - DCCc : Linux, Apache, Mysql, PHP, Drupal Core, Contrib and custom module.
Improve Performance of a Drupal Site (In the increasing order of complexity)
Keep the core updated, contrib module and themes updated. Yes it matters.
Install APC on your server. (Moved to top based on suggestion from Letharion)
Page Caching : admin/config/development/performance Difference between Minimum cache lifetime and Expiration of cached pages
- Block Caching https://drupal.org/project/blockcache_alter Caching options for all the blocks.
- Disable Unnecessary modules. Every module adds to the amount of code that needs to be available for a page load. And it also increases the number of lookups. Wherver possible use a generic module in place of multiple module that does specific functionalities.
- Cache Views content - Content aware caching for Views https://www.drupal.org/project/views_content_cache
- Disable DB logging - Use https://drupal.org/project/syslog_ng
- Reduce 404 Errors - http://www.brokenlinkcheck.com/
- Fast 404 Responses - https://drupal.org/project/fast_404 - Try handling at server level.
- Client Side Validations - https://www.drupal.org/project/clientside_validation
- Compress Image - https://www.drupal.org/project/imageapi_optimize
- Lazy Loading of Images - Don’t load unnecessary images - https://www.drupal.org/project/lazyloader
Use Sprite Sheets - https://www.drupal.org/project/spritesheets
Set Minimum Cache Life Time Value to a higher number and use cache clearing modules to clear the caches for specific pages - Whenever I edit/update a node all the page caches for anonymous user are lost
- Use Devel Module to watch queries.
- Rewrite Views Queries / avoid Views if its a overkill.
- XHProf - https://www.drupal.org/project/XHProf
- FPM, HHVM.
- DB Profiling and Tuning - https://www.drupal.org/project/dbtuner
- Use Boost, don't Bootstrap DB if not required. https://drupal.org/project/boost For most of the small to medium sites Boost is good enough and you may not need Reverse Proxies or so.
- Use CDNs - https://www.drupal.org/project/cdn Its easy to set up.
- If your cache tables are huge use Memcached - If you can install memcached and set up RAM for it, it is not as complex as it sounds.
- Etags - Configure Etags properly. https://developer.yahoo.com/blogs/ydnfiveblog/high-performance-sites-rule-13-configure-etags-7211.html
- Use Reverse Proxy Server - Varnish(at-least for assets). Helps a lot if most of your users are anonymous.
- Compressed transfer - Enable gzip compression
- Keep Alive - Use Persistent Connections where possible.
- Progressive JPEGS -
- CACHING IN CODE - Eaton’s blog is awesome. http://www.lullabot.com/blog/article/beginners-guide-caching-data-drupal-7
- Implement Cache Warming - https://www.drupal.org/project/cache_warmer - Cache Warm the pages before the end user hits them.
- Master Slave DB Config - https://www.drupal.org/project/autoslave makes it easier for you to set up one.
- Database Clusters - https://stackoverflow.com/questions/1163216/database-cluster-and-load-balancing
- Load Balancers -http://en.wikipedia.org/wiki/Load_balancing_(computing)
- Use heuristic Cache Warming - https://www.drupal.org/project/cache_graceful
- Authenticated User Caching - https://www.drupal.org/project/authcache
2Excellent answer, but one things that strongly stands out to me, is that you don't have APC at the top. APC is trivially easy to get into place, there are no down-sides, and the gains can be really large. I think it should go to the top. (Maybe with a comment that it's not needed after PHP 5.5 as the optimization finally got integrated) Jun 20, 2014 at 11:57
1Maybe also mention something about the easiest gains for caching? If your site requires mostly static content (pages are same for all users, so no logins), then Varnish or Boost provides the largest gains. Jun 20, 2014 at 13:09
The database layer is important. I cover some parts of it and the basics in this presentation http://goo.gl/30yi39
As a companion to Gokul's answer here's the way I would think about what you want to cache in Drupal (not ordered by complexity):
Caching means speeding up repeated activities.
The big repeat actions involved in a Drupal website are:
- Calling a webpage
- Running PHP code to build a webpage
- PHP calling items from the database
Caching an entire webpage
The biggest caching gains are to be had from finding a way to cache an entire webpage without ever running the PHP code or calling the database.
You can do this with Varnish or Boost. When a user calls a page they return a copy of the page without ever doing a calculation.
However this won't work if parts of the page have to be different (i.e. users login and their name appears at the top).
In order to get that to work you need to look into Authcache.
You can cache PHP with APC, or if you have version 5.5 or greater then a different cache is built in.
This is done server side and means chunks of your PHP code will be remembered. You're caching PHP for Drupal but you're not technically interacting with Drupal.
Calls to grab information from the database are expensive.
The commonest database caching mechanism is memcache.
This caches database objects in RAM, so instead of making a call to a database object on the harddrive, you just pull it from the RAM which is a lot faster.
1Redis is also a great in-memory cache store, at least comparable with memcache in my experience (though memcache probably wins out with clustering)– Clive ♦Jun 20, 2014 at 15:29