Memcached & Drupal

De inzet van het Memcached caching systeem op één van onze Drupal websites laat na enkele eerste globale tests een verbetering in de laadtijd zien van ruim 15%. Niet helemaal de spectaculaite resulaten waarop ik gehoopt had, maar een mooie eerste stap in het fine-tunen van LAMP en Drupal.

Op een doorsnee pagina zien we een verbetering in de laadtijd van ruim 12%. Op de zwaarste pagina van de site (/admin/modules) is de tijdwinst ruim 18%. 

Drupal = geheugenvreter

Drupal als ontwikkelplatform is een sterk en flexibel systeem met een theming- en hooksysteem dat ontwikkelaars op andere open source platforms moet doen likkebaarden. Maar aan die kracht en flexibiliteit hangt een prijskaartje: per paginarequest moet Drupal een ongekende hoeveelheid informatie verwerken van alle geinstalleerde modules - welke hooks maar ook welke preprocess-, process- en themefuncties zijn geimplementeerd en moeten worden uitgevoerd?

Drupal's eigen cache-systeem (een database cache implementatie) inschakelen kan een flinke besparing op serverload en latency opleveren, maar is minder geavanceerd en snel dan gespecialiseerde cachingsystemen zoals Varnish en Memcached.

Memcached

Memcached is (zoals de producent zelf zegt): A free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.

Anders dan Drupal's eigen caching systeem, is Memcached een in-memory systeem, het houdt z'n data beschikbaar in het RAM geheugen, wat een snelle toegankelijkheid waarborgt. Memcached is met name bedoeld om de database load te verlagen. Dat doet het door de resultaten van database- en API-aanroepen en page rendering op te slaan.

Installatie

Installeer de Memcached daemon:

yum install memcached
service memcached start

Installeer de PHP extentie:

pecl install memcached

Installeer de 'Memcache API and Integration' Drupal module.

De vereiste configuratie is minimaal. Uit de README van Memcache API:

8. Edit settings.php to make memcache the default cache class, for example:
      $conf['cache_backends'][] = 'sites/all/modules/memcache/memcache.inc';
      $conf['cache_default_class'] = 'MemCacheDrupal';
9. Make sure the following line also exists, to ensure that the special
    cache_form bin is assigned to non-volatile storage:
      $conf['cache_class_cache_form'] = 'DrupalDatabaseCache'

Wie meer geavanceerde wensen heeft (bijvoorbeeld clustering, of de cache(s) op een andere machine dan de webserver) kan zich nog even uitleven, maar voor een standaardconfiguratie is dit voldoende.