I. Basic Setup and Configuration

Disable the Statistics Module

Drupal's statistics module has a disadvantage: extra MySQL queries per page load. Even when using the Boost module, boost_stats.php can still call these MySQL queries. Of course, it is up to you whether you need these Drupal stats. Some people prefer Google Analytics or Piwik as alternatives. Other alternatives are server tools like Munin or Cacti.

Enable core caching features

Often overlooked by Drupal beginners, but still worth mentioning: do not forget to enable core caching at Administer > Site Configuration > Performance (/admin/settings/performance). To avoid issues with Drupal modules, simply select Cache Mode: Normal. And enable Page Compression.

Here you can also enable bandwidth optimizations and block cache. We will come back to that later.

Increase minimum cache lifetime on high traffic sites

Drupal's core caching system allows to set minimum cache lifetimes. This means content will not be refreshed until after a certain time. For example, on busy sites, you would set the Minimum Cache Life to 1 hour. That means visitors do not see changes on your site more often than 1 hour. But it greatly helps to improve cache-efficiency and reduces your server load.

Advantages

  • Improved cache-efficiency
  • Reduced server load

Disadvantages

  • Vistors see less frequent content changes

Install ImageCache to generate thumbnails

ImageCache is a module that can generate image thumbnails on the fly, to exactly fit your dimensions. The thumbnails is only generate once, so should not influence performance. The benefit however is to the end user: visitors will download smaller images instead of the full unscaled version.

In the earlier days of the internet often people would upload huge images scaled by setting HTML width and height. Images looked small, but took ages to download. ImageCache fixed this problem. Use ImageCache in combination with various tools, including inside node.tpl.php and page.tpl.php.

Install the Block Cache Alter module

Drupal has a built-in Block caching system, which caches the output of any block based on settings provided by module maintainers. (In hook_block() one can specifiy a number of caching settings.) The built-in system has two disadvantage: 1) it does not let you specify per-block caching; 2) it does not work at all when node access modules are in place.

Properly Configure Block Visibility Settings

Drupal's block system (/admin/structure/block) allows you to place custom blocks of content in specific theme regions. But beware, even if you do not output a region in your theme (likely page.tpl.php), the blocks you assigned to that region will still be processed by the Drupal stack. That's because Drupal can't know in advance what regions will be output to the user, so it generates all blocks depending on their visibility settings.

Replace Core Cron with Elysia Cron

The cron function should run periodically. But core cron runs all tasks at once. Enter Elysia Cron: this module lets you schedule specific cron tasks. For example, you may want to rebuild the XML Sitemap at midnight, but refresh your Node cache every hour.

The Elysia Cron's cron.php overrides the core cron.php (make backup). It is best called once every minute. This does not influence performance as the Elysia Cron module determines what tasks should be run and when.