Drupal Performance I

Hier werden in den nächsten Tagen Wochen Beiträge zu Drupal Performance und Optimierung kommen… fangen wir doch mal mit den Basics an.

Die Modularität hat ihren Preis. Wenn man ein paar Module im Einsatz hat, dann wird eine Drupal Installation schnell einmal langsam. Es werden unmengen von SQL Queries abgesetzt, um die notwendigen Seite zusammenzustellen (einige hundert bis einige tausend). Das schlägt sich natürlich in der Geschwindigkeit nieder. Gut ist es sicher, dies zu vermeiden, was aber nicht wirklich immer möglich ist, bzw. mit Funktionseinbussen verbunden ist, denn über hook_nodeapi hat jedes Modul die Möglichkeit, beim Nodeload den Node zu modifizieren. Dadurch kann doch eine beachtliche Anzahl an Abfragen entstehen. Einige Module setzen dafür einen Cache ein, andere wiederum nicht. Das heisst: Ein node_load ist nicht ein grosser Query mit einigen Joins, sondern besteht aus vielen kleinen Queries. Das heisst, wenn jetzt auf einer Seite einige Nodes geladen werden müssen (Teaser, Übersichtsseiten, Nodeblöcke usw), dann kann sich das schnell kumulieren.

Lässt sich das ändern? Es lässt sich sicher vermeiden, indem die Module sorgfältig ausgewählt werden, aber die Grundproblematik bleibt bestehen. Die Flexibilität, welche dadurch entsteht ist dafür fantastisch.

Auswege. Liegen eigentlich beim Caching. Hier gibt es diverse Strategien, aber erst einmal gilt es, die Drupal Board Mittel zu benützen, welche für kleine Seiten durchaus ausreichend sind:

  • CSS Aggregation ist ein Muss
  • JS Aggregation eigentlich auch, aber führt jeweils bei deutschsprachigen Seiten zu Problemen. Also ich habe da immer Probleme mit einem File, welches nicht gefunden werden kann. Dafür gibt es ein nettes kleines Modul und schon klappts wieder.
  • Drupal Cache. Der ist eigentlich super genial, aber funktioniert nur für den anonymen Besucher. In manchen Fällen mag das ausreichend sein, aber manchmal auch nicht.
  • Blockcache ist mein Held.Wie weiter, wenn die Seite wächst und wächst. Es gibt diverse Module, mit welchen ich in den letzten Tagen/Wochen Erfahrungen gesammelt habe. Diese beschränken sich momentan auf die folgenden drei Module:
  • Boost
  • Cacherouter
  • APC

Boost
Super einfach zum einsetzen. Es lässt sich auch sehr gut auf einem shared hoster einsetzen. Mein Blog hier wird von Boost unterstützt. Dabei wird die Datenbank für den anonymen Besucher entlastet, indem von der Seite eine statische Seite angelegt wird. Ein Besucher tangiert somit Drupal gar nicht, sondern wird direkt auf die statische Seite geleitet. Dies kann natürlich zu verfälschung von Statistiken führen.

Cacherouter
Ist eigentlich lediglich ein Abstraktionslayer nicht ein eigentlich Cache. Der Cacherouter kann sehr gut zusammen mit Authcache eingesetzt werden. Mit dem Cacherouter kann man jetzt bestimmen, wo sich der Cache befinden soll. Z.B. Memcache, APC, File, Datenbank usw.

Im Weiteren habe ich mir auch noch Authcache angeschaut, kam jedoch bisher noch nicht zum produktiven Einsatz. Authcache macht eigentlich etwas ähnliches wie Boost, jedoch für den Eingeloggten User. Die Seite wird als HTML gespeichert und in die DB abgelegt. Beim darauffolgenden Seitenaufruf kann der HTML fixfertig gerendert aus der DB genommen werden, zusätzlich wird die Möglichkeit geboten, Userzentrierte Blöcke mit Ajax entsprechend anzupassen.
Boost und Authcache lassen sich gut auch zusammen nützen, da man Authcache mitteilen kann, welche Rollen den Cache verwenden sollen.

Das sind relativ einfache Massnahmen. Boost läuft eigentlich auf jedem Hoster. Komisch -> bei uns haben wir noch Probleme mit dem Cache löschen?! Keine Ahnung, was da schief geht.