Im Rahmen einer Studienausarbeitung habe ich Testfälle analysiert um die TYPO3 Performance zu messen und zu definieren. Ich werden in den nächsten Tagen/Wochen einige Texte aus dieser Arbeit veröffentlichen. Um den Grundstoff für weitere Testfälle und Diskussionen zu liefern, veröffentliche ich nun das „Grundlage“ Kapitel!
PS: Die Texte wurde leicht an den Blog-Slang (gibt es das) angepasst.
Bevor die exakten Testfälle analysiert und ausgewertet werden, wird der Ablauf einer Client-Anfrage an eine TYPO3 Webseite erläutert. Für jeden Prozessschritt werden Optimierungspotentiale definiert, anhand denen man die Performance Tests ansetzen kann, um die Geschwindigkeit der Webseite zu steigern. Diese Übersicht dient den nachfolgenden Analysen, um aufzuzeigen welche Möglichkeiten zur Optimierung gegeben sind.
Hinweis: Das Optimierungspotential ist stichpunktartig formuliert und kann weiter definiert werden.
Die Performance einer Webseite baut auf viele verschiedene Prozesse auf. Bei einem Request an einen Webserver müssen nicht zwingend alle Prozesse abgearbeitet werden. Durch das Cachen von Daten auf den verschiedenen Ebenen der Anfrage, kann man die Reaktionszeit der Webseite verkürzen. Die Abbildung (s.o.) verdeutlicht den Weg der zurück gelegt werden muss, wenn eine Webseite geladen wird. Das Schaubild ist dabei ausschließlich auf TYPO3 bezogen, ähnelt aber einer normalen Webseiten-Anfrage sehr stark.
DNS
Das „Domain Name System“ ist ein zentrales Element des heutigen Internet. Die DNS-Server kümmern sich um die Zuweisung von Hostnamen (z.B. www.google.de) auf IP Adressen. Dieser Schritt ist somit der erste Schritt der bei einer Anfrage gemacht wird. Bei einem ersten Zugriff auf eine Webseite ist die Auflösung des Hostnames ein unvermeidbarer Vorgang. Die dazugehörige IP Adresse wird im Anschluss lokal und auch beim Provider gespeichert und nur im Fehlerfall erneut mit einem DNS-Server verifiziert.
Optimierungspotential:
- Die TTL („Time to Live“) Zeit der Domain herauf setzen. Die TTL wird vom Master Nameserver definiert und legt fest, wie lange andere Namensserver die IP mit der dazugehörigen Domain speichern dürfen. (DNS Cache)
Apache (Webserver)
Nachdem der Client die IP Adresse erhalten hat, beginnt die eigentliche Anfrage an den Webserver. Der Apache(The Apache Software Foundation) ist das Webserver System, welches weltweit am meisten verbreitet ist. Der Apache wird vorzugsweise auf UNIX Plattformen betrieben. Durch zahlreiche Module lässt sich der Funktionsumfang des Apaches ausbauen, um z.B. Daten zu komprimieren oder Weiterleitungen durchzuführen. Die Aufgabe des Apache ist es, die Anfragen des Benutzers (Clients) entgegen zu nehmen und den passenden internen Prozess anzustoßen. Dabei geht es nicht ausschließlich um TYPO3 Anfragen, sondern auch um alle anderen Arten von Anfragen, die der Apache verwaltet (Bilder, Cascading Style Sheets, Javascript, Flash etc.).
Optimierungspotential:
- Den Request-Overhead reduzieren, indem man nicht benutze Apache-Module deaktiviert.
- PHP mit einem anderen Mechanismus laden. Es gibt mehrere Wege PHP in den Apache zu integrieren. Als Modul, FastCGI oder CGI. FastCGI stellt die modernste Methode dar.
- HTTP Cache Headers bzw. Expires Header um gesendete Dateien dauerhaft beim Client zu Cachen.
- TYPO3 nicht laden, indem man TYPO3-Seiten in statische Dateien ablegt und diese direkt vom Apache ausliefern lässt.
PHP (Skriptsprache)
Die interpretierte Skriptsprache PHP (Rekursives Akronym für ‚PHP: Hypertext Preprocessor‘) ist das Modul, welches der Apache direkt nach dem Request lädt, wenn es zu einem normalen TYPO3 Request kommt. TYPO3 ist komplett in PHP programmiert worden und ist somit erforderlich für den Betrieb des Content Management Systems.
Optimierungspotential:
- PHP Beschleuniger interpretieren PHP einmalig und cachen PHP in einer Art Byte-Code, der deutlich schneller in der Ausführungszeit ist, weil ein erneutes interpretieren nicht notwendig ist.
- PHP interne Optimierung in Schleifen, Strings und Funktionen. Bestimmte Schleifenkonstrukte und Funktionen laufen schneller als andere, trotz des gleichen Ergebnisses.
- Programmstrukturen oder Design Patterns benutzen die Arbeitsspeicher beim durchlaufen einsparen. So kann man z.B. mittels des Singleton Patterns Objekte einmalig machen, anstatt bei jedem gebrauch des Objektes eine neue Instanz zu erstellen.
- Cachen von Ausgaben, um unnötiges Durchlaufen von Funktionen zu verhindern.
TYPO3
TYPO3 ist der Flaschenhals der serverseitigen Performance. Es ist in PHP entwickelt und interagiert mit der MySQL Datenbank. TYPO3 wird dabei in das Frontend (FE) und in das Backend (BE) unterteilt, die bei der Optimierung separat betrachtet werden.
TYPO3 – Frontend
Das Frontend von TYPO3 stellt die eigentliche Ausgabe zum Browser dar. Die Ausgabe ist Format unabhängig, erfolgt aber in 99% der Fälle in einem von Webbrowsern lesbaren Format (XML oder XHML). Bilder und andere Elemente wie Javascript und CSS, werden vom TYPO3 Frontend generiert und statisch im Dateisystem abgelegt.
Optimierungspotential:
- PHP Optimierung (siehe PHP Optimierungspotential).
- TYPO3 Caches spielen eine Größe Rolle, um die Performance zu steigern. TYPO3 Caches gibt es sowohl für die TYPO3 interne Konfigurationssprache TypoScript als auch auf Seitenebene für Contentelemente.
- Der TYPO3 Static File Cache legt die komplette Ausgabe von TYPO3 im Dateisystem ab, damit der Apache TYPO3 bei einer Anfrage nicht mehr laden muss.
TYPO3 – Backend
Das Backend dient der Verwaltung der TYPO3-Webseite. Das Cachen von Inhalten ist hier nur sehr schwer möglich, weil die Ansicht eines Redakteurs immer aktuell sein muss.
Optimierungspotential:
- Cachen von Icon’s (Grafiken), Javascript und CSS für das TYPO3 Backend.
- Technologien wie Google Gears implementieren, um eventuell sogar Datenbanken beim Client zu speichern.
MySQL (Datenbank)
MySQL ist das primäre Datenbank-System hinter TYPO3. Durch die TYPO3 Datenbankabstraktion ist es möglich andere Datenbanken an das Content Management System anzubinden. Von diesem Schritt wird aber abgeraten, weil es zu Komplikationen kommen kann, wenn Extensions benutzt werden, die nicht die TYPO3 API (Application Programming Interface, de. „Programmierschnittstelle“) benutzen. Damit der Abstraktionslayer die Datenbankabfragen für verschiedene Systeme zusammen bauen kann, ist man dazu gezwungen, Kompromisse in SQL einzugehen, weshalb man nicht alle Queries perfektionieren kann.
Optimierungspotential:
- Queries weitestgehend optimieren. Evtl. eine native angepasste Implementierung für MySQL als Hauptdatenbanksystem.
- Query Cache aktivieren. Seit der MySQL Version 4.x ist der Query Cache standardmäßig eingeschaltet. Durch TYPO3 wird aber die Funktionsweise zur Nichte gemacht, weil nahezu jede Query mit einem aktuellen Timestamp abgefragt wird.
- Redundante Query eliminieren, die im Rendering Prozess auftreten können.
- Query Resultsets cachen, um das Abfragen der Datenbank teilweise zu reduzieren.
Verbindung
Die Verbindung stellt ein großes Problem bei Webseiten dar, weil HTTP ein zustandsloses Protokoll ist. Das bedeutet, dass wenn eine Webseite viele Dateien enthält, der Aufbau der Webseite deutlich länger dauert, unabhängig davon wie groß diese Dateien sind. Das liegt dadran, dass ein HTTP Request einen sehr großen Overhead erzeugt und gegebenenfalls sogar das synchrone Laden der Webseite unterbinden kann. Man bedenke das eine Webseite die z.B. ein grafisches Menü besitzt, schnell an die 100 Anfragen generieren kann.
Optimierungspotential:
- HTTP Cache Headers bzw. Expires Header (siehe Apache).
- Javascript und CSS Dateien zusammenführen und komprimieren, um sowohl die HTTP Requests, als auch das Dateivolumen zu reduzieren.
- Wenn der anfragende Client GZip unterstützt, sollte man dies unbedingt nutzen um Javascript, CSS und XHTML zu komprimieren.
Rendering
Das Rendering im Browser des Clients stellt den letzten Schritt bei einer Anfrage an eine TYPO3 Seite (auch normalen Webseite 😉 ) dar. Beim Rendering ist ausschließlich die Leitung des Clients entscheidend. Dennoch kann man helfen ein möglichst schnelles und fehlerfreies Rendering zu gewährleisten.
Browser Rendering Engines unterscheiden zwei verschiedene Modi. Den „Standard mode“ und den „Quirks mode“. Der Standard Modus ist deutlich schneller und beschreibt das Rendern von XHTML Seiten. Alle anderen Doctype Definitionen (HTML) fallen in den Quirks Modus zurück, der langsamer ist, weil er weitestgehend abwärtskompatibel ist.
Optimierungspotential:
- Valides XHTML, um den Standard Modus zu benutzen, der ein schnelleres Rendern verspricht.
- Valides CSS, um das Rendern der Webseite weiter zu beschleunigen.
- Javascript sollte am Ende des XHTML Dokuments geladen werden. Während es geladen wird, lädt der Browser keine anderen Dateien mehr, weil Javascript evtl. das HTML Dokument manipulieren könnte.