Drupal Performance Tuning Guide

Dieser Artikel soll euch helfen, eure Drupal-Website so richtig in Schwung zu bringen.

Um den Artikel nicht zu lang und umfangreich werden zu lassen, werde ich mich kurz fassen, was einzelne Punkte angeht.

Wenn ihr genauere Fragen zum Inhalt habt, schreibt bitte einfach einen Kommentar.

PHP Performance Tuning (Drupal-Unabhängig)

Serverseitig

  • OP-Code Cache aktivieren (APC, eAccelerator, Zend Server (CE, ...), Achtung: Zend Optimizer optimiert nur den Code, ist aber kein OP-Code Cache!)
  • mod_expires einsetzen, um dem Browser Caching von Inhalten, sowie Bildern, css, js - Dateien und Co zu ermöglichen (wird von Drupal standardmäßig mit einer passenden Einstellung in der .htaccess angesprochen ohne Anpassungen vornehmen zu müssen).
  • mod_gzip oder mod_deflate einsetzen, um die Übertragung vom Server zum Client zu komprimieren (Drupal ist für mod_gzip optimiert, mod_deflate gilt allerdings als performanter). Drupal cached standardmäßig nur die Seite aber keine CSS und JS-Dateien (http://drupal.org/node/101227).
  • memory_limit auf mindestens 128MB erhöhen, dies beugt auch Fehlern vor.
  • PHP und MySQL-Konfiguration optimieren (das Thema ist zu komplex und zu individuell um es hier im Detail zu beschreiben, wenn ihr euch damit nicht auskennt, behaltet besser die Standard-Konfiguration bei).
  • Einige interessante Tipps gibt es außerdem hier: http://phplens.com/lens/php-book/optimizing-debugging-php.php (Aber Achtung, einige Punkte sind nur für Profis!! Auch hier gilt, nur das anpassen, was ihr versteht und wirklich in eurem Fall sinnvoll ist.)

Anwendungsseitig

Website Performance Tuning (Drupal-Unabhängig)

  • Unnütze Inhalte auf der Website vermeiden (Schmeißt eure Besucher nicht mit Content zu, den sie ohnehin nicht lesen. Jeder Inhalt der übertragen werden muss, kostet Ladezeit!)
  • Grafiken komprimieren und nicht mit voller Qualität ausliefern (Guter Wert liegt meist zwischen 80 und 90%), auch das Bildformat (jpg, png, gif) kann hier Vor- und Nachteile in der Dateigröße bringen.
  • JavaScript und CSS zusammenführen und in einer großen Datei ausliefern. Hier bewährt sich beispielsweise "minify".
  • JavaScript bei Bedarf zusätzlich minimieren. Dafür gibt es zahlreiche Generatoren und für Drupal das Modul: http://drupal.org/project/javascript_aggregator (dem ich allerdings aufgrund der nötigen Anpassung von Template-Dateien kritisch gegenüberstehe und daher die hier empfohlene Variante vorschlage. Noch besser wäre, wenn keine manuelle Modifikation nötig wäre). Ich persönlich verzichte daher auf das Modul.
  • Verwendet sauberen, (X)HTML-Konformen Quellcode, damit der Browser diesen nicht aufwändig im Quirks-Mode reparieren und "erraten" muss.
  • Entfernt nicht benötigtes CSS und JavaScript. Häufig befinden sich nicht mehr benötigte Schnipsel in euren Dateien.

Drupal Performance Tuning (Rein Drupal-Bezogen)

  • Seiteninhalte cachen (Noch besser als der Drupal-Interne Cache ist hier http://drupal.org/project/boost mit sehr vielen Konfigurationsmöglichkeiten. Auf Aggressives Caching verzichte ich ganz, minimale Cache-Dauer ist bei häufig ändernden Inhalten auch negativ zu betrachten).
  • Komprimierung aktiveren ("Einstellungen >> Leistung"), was allerdings nur Auswirkungen hat, wenn mod_gzip auf dem Server installiert ist. Für mod_deflate müsst ihr den folgenden Code-Schnippsel in eure .htacces-Datei setzen:
    1. <IfModule mod_deflate.c>
    2.      AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript application/javascript
    3.      BrowserMatch ^Mozilla/4 gzip-only-text/html
    4.      BrowserMatch ^Mozilla/4.0[678] no-gzip
    5.      BrowserMatch bMSIE !no-gzip !gzip-only-text/html
    6.      SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
    7. </IfModule>
  • Zusammenfassen von CSS und JS aktiveren (unter "Einstellungen >> Leistung"), ist diese Option deaktiviert, kann es bei der Einbindung vieler JS und CSS-Dateien auch zu Darstellungsfehlern im Internet Explorer kommen, da dieser nur eine begrenzte Anzahl verarbeitet! Daher sollte diese Option immer aktiviert sein, wenn ihr nicht gerade in den Stylesheets oder JavaScript arbeitet.
  • Einen interessanten Ausblick gibt noch das Modul http://drupal.org/project/parallel welches ein Content Delivery Network aufbaut, indem es die Daten von mehreren URLs parallel lädt. Der Ansatz ist sehr interessant und sinnvoll, allerdings möchte ich es nicht empfehlen, bevor ich es selbst getestet habe. Sicherlich auch nur für WIRKLICH große Websites sinnvoll. Ansonsten eher schießen mit Kanonen auf Spatzen Wink
  • Für sehr erfahrene Entwickler und Administratoren ist das Modul Memcache http://drupal.org/project/memcache interessant, welches dafür sorgt, dass Drupal Daten in den Zwischenspeicher geladen werden und somit schneller zugreifbar sind. Achtung, nichts für Anfänger und nicht in jedem Fall sinnvoll!)
  • Wenn ihr sehr viele registrierte Benutzer habt und das Drupal-Caching somit für diese nicht greifen kann, hilft euch vielleicht das Modul http://drupal.org/project/authcache - allerdings habe ich dies selbst auch noch nicht getestet, bitte also um Vorsicht und Feedback.
  • Sollte euch das noch nicht reichen, findet ihr weitere Drupal-Bezogene Tipps findet ihr außerdem hier (beachtet aber meine Hinweise unterhalb): http://wimleers.com/article/improving-drupals-page-loading-performance, http://www.reizkraft.com/content/webseite-wesentlich-schneller-machen-ni..., http://drupal.org/node/326504, http://2bits.com/articles/drupal-performance-tuning-and-optimization-for..., http://drupal.org/node/97347, http://blog.windfluechter.net/index.php?/archives/320-Performance-Tweaki...

Weitere Hinweise:

Ich persönlich rate von Optimierungen ab, die von anderen Seiten empfohlen werden, meiner Meinung nach aber für nicht gerade extrem hoch belastete Websites (seid ehrlich zu euch selbst!) ein Tropfen auf dem heißen Stein sind und nur zu mehr Wartungsaufwand und Arbeit führen (wenn sie nicht 100%ig automatisiert sind), beispielsweise:

Zu unterscheiden ist also immer zwischen Optimierungen, bei denen man Vor-und Nachteile abwägen muss und Optimierungen, die außer einer kleinen Ersteinrichtung keine weiteren Nachteile oder weitere Arbeit bedeuten.

Und zum Schluss:

Die Optimierung ist auch immer von Einzelfällen abhängig. Daher ist es manchmal nicht sinnvoll, alle Optimierungen vorzunehmen, die theoretisch möglich wären.
Wird die Optimierung mit viel Wartungsaufwand erkauft, lasst die Finger davon.
Tools wie Firebug, YSlow und Live HTTP Headers unterstützen euch bei der Optimierung und helfen, Ergebnisse zu prüfen.
Mit LORI könnt ihr die Ladezeit in eurem Browser clientseitig messen.

Ergänzungen sind willkommen Smile

Einordnung:

Comments

Jan Kammerath's picture

MySQL wird häufig unterschätzt

Ich habe mal einen Artikel geschrieben, da ich denke, dass viele PHP Entwickler die Energie von MySQL falsch einsetzen und das System unterschätzen. Ich habe gerade eine solche Erfahrung mit WordPress gemacht: http://www.kammerath.net/php-performance-tuning.html

Vg,

Jan

Post new comment

The content of this field is kept private and will not be shown publicly. If you have a Gravatar account associated with the e-mail address you provide, it will be used to display your avatar.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Internal paths in single or double quotes, written as "internal:node/99", for example, are replaced with the appropriate absolute URL or path. Paths to files in single or double quotes, written as "files:somefile.ext", for example, are replaced with the appropriate URL that can be used to download the file.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd><blockquote>
  • Lines and paragraphs break automatically.
  • Pairs of<blockquote> tags will be styled as a block that indicates a quotation.
  • You can enable syntax highlighting of source code with the following tags: <c>, <cpp>, <css>, <drupal5>, <drupal6>, <java>, <javascript>, <mysql>, <php>, <python>, <ruby>, <smarty>, <xml>. The supported tag styles are: <foo>, [foo]. PHP source code can also be enclosed in <?php ... ?> or <% ... %>.
  • Textual smileys will be replaced with graphical ones.
  • Each email address will be obfuscated in a human readable fashion or (if JavaScript is enabled) replaced with a spamproof clickable link.

More information about formatting options

Type the characters you see in this picture. (verify using audio)
Type the characters you see in the picture above; if you can't read them, submit the form and a new image will be generated. Not case sensitive.