Samstag, den 21. Juli 2012 00:32 Alter: 5 Monat(e)
Kategorie: Messungen
Submitting your vote...
Rating: 5.0 von 5. 2 Stimme(n).
Artikel bewerten.

Ladezeiten der Webseite mit xdebug serverseitig analysieren

Die Ladezeit einer Webseite hängt zuallererst davon ab wie schnell die html-Inhalte auf dem Server bereit gestellt werden können. PHP-Anwendungen wie TYPO3 lassen sich mit Hilfe von xdebug nach Performance-Engpässen durchsuchen.


TYPO3 Webseite mit KCacheGrind analysieren

In den meisten Fällen sollte es ausreichen die Ladezeit einer Webanwendung statt auf dem Livesystem in einer Testumgebung zu untersuchen. In Einzelfällen (z.B. langsame Festplattenzugriffe, oder Engpässe beim Datenbankzugriff) kann auch die Analyse auf dem Livesystem nötig sein. Der Debugger sollte aber nicht dauerhaft aktiviert werden.

1) Testumgebung einrichten

Xdebug selbst gibt es für die meisten Distributionen als fertiges Paket. Unter Ubuntu oder Debian ist es beispielsweise mit

  1. apt-get install php5-xdebug

schnell installiert.

Nehmen wir an, dass ein Apache-Webserver php als Modul geladen hat. In diesem Fall findet sich die nötige Konfigurationsdatei unter
  1. /etc/php5/apache2/conf.d/xdebug.ini


Eine mögliche Beispielkonfiguration für die Analyse ist:

  1. zend_extension=/usr/lib/php5/20090626/xdebug.so
  2. xdebug.profiler_enable = 1
  3. xdebug.profiler_output_dir = "/var/log/debug"
  4. xdebug.profiler_output_name = "debug.out"


Es gibt noch weit mehr Möglichkeiten. Für die hier vorgestellten Analysen reicht jedoch der Profiler aus.

2) Ausgabe analysieren

In dem angegebenen Ordner (bei uns /var/log/debug) werden bei jedem Seitenaufruf Dateien nach dem Schema debug.out.xxx an. Auf einem Testsystem ist das einfachste vorgehen direkt vor einem Testaufruf das Verzeichnis zu leeren und dann die Datei debug.out für die Analysen zu verwenden.

Der Inhalt der Datei lässt sich kaum händisch auswerten.
100000 Zeilen Code nach dem Schema

  1. calls=1 0 0
  2. 5141 138
  3. cfl=php:internal
  4. cfn=php::substr
  5. calls=1 0 0
  6. 5148 4
  7. cfl=php:internal
  8. cfn=php::explode
  9. calls=1 0 0
  10. 5167 5
  11. cfl=php:internal
  12. cfn=php::count
  13. calls=1 0 0
  14. 5168 3
  15. cfl=php:internal
  16. cfn=php::class_exists
  17. calls=1 0 0
  18. 5171 4

würden etwas viel Fleiß erfordern.

Zum Glück gibt es Programme, welche die Daten für unserer Zwecke aufbereiten können.
Unter Linux gibt es Beispielsweise KcacheGrind oder für Windows WinCacheGrind.

Als erstes möchte ich eine größere TYPO3-Installation mit einigen Tausend Unterseiten, vielen Erweiterungen und einer 800 MB großen Datenbank betrachten. Bevor ich die Seite aufgerufen habe, habe ich im Backend den Cache gelöscht.

Da der Test auf einem Entwicklungsserver stattfindet ist die relative Ladezeit interessanter als die Zeit in Millisekunden.


Der Screenshot zeigt schön, dass bei dieser Seite fast 40% der Zeit dafür drauf gehen, das TYPO-Script zu parsen und die TCA-Daten der Erweiterungen zu verarbeiten. Zum Glück muss das nicht bei jedem Aufruf passieren.

Viele dürfte überraschen, dass auch bei einer großen TYPO3-Seite Datenbankzugriffe für die Geschwindigkeit kaum eine Rolle spielen. Ob mit oder ohne Cache werden nicht einmal 2% der Verarbeitungszeit mit Datenbankzugriffen verbracht.


Um zu zeigen, dass dies auch kein Messfehler ist, habe ich mal einen künstlich langen Query in einer der Erweiterungen eingebaut:

  1. SELECT BENCHMARK(100000000,ENCODE('hello','goodbye'));


Die Abfrage selbst dauert auf dem Testsystem knapp 30 Sekunden. In diesem Fall zeigt die Analyse mit Xdebug den künstlichen Flaschenhals deutlich.



Typische Performancekiller sind zum Beispiel Erweiterungen die auf externe RSS-Feeds oder SOAP-Server warten müssen, oder bei TYPO3 auch die Bildgenerierung.

3) Fazit

Eigentlich sollte jedes Webprojekt gelegentlich mal durch den Profiler gejagt werden. Gravierende Probleme lassen sich in der Regel auf den ersten Blick erkennen. Vielleicht ist das dann der Zeitpunkt den Einsatz von bestimmten Erweiterungen zu überdenken, oder externe Inhalte vor der Verarbeitung lokal zwischenzuspeichern.


keine Kommentare
Kommentar schreiben

* Bitte ausfüllen

*

*