Time To First Byte optimieren

|
Für eine schnelle Auslieferung deines Projektes an den Besucher ist ein niedriger "Time To First Byte“ (TTFB)-Wert notwendig. In unserem Beitrag über Performance-KPIs haben wir erläutert, dass nutzerzentrierte KPIs deiner Webseite von diesem Wert direkt abhängig sind. Hier zeige ich dir nun Möglichkeiten, den Wert zu verbessern. Außerdem beleuchte ich häufige Gründe langsamer Auslieferungszeiten von PHP Anwendungen.

Laufzeitverhalten der Applikation

Generell gibt es verschiedene Möglichkeiten eine PHP-Anwendung in Bezug auf ihr Laufzeitverhalten zu analysieren. Jede bietet unterschiedliche Einblicke und Erkenntnisse. Allen ist gemein, dass die Messung Ressourcen benötigt und somit die Auslieferungszeit negativ beeinflusst — Rückschlüsse und Analysen beeinträchtigt das jedoch nicht. Besonders aussagekräftig, aber leider auch sehr
ressourcenintensiv, ist Xdebug. Deshalb wird es in Live-Umgebungen selten eingesetzt. Alternativ kann man messen, wann die Anwendung mit dem Betriebssystem kommuniziert. Diese System Calls bilden zwar nur einen Teil des Laufzeitverhaltens ab, sind allerdings minimalinvasiv: Sie sind ressourcenschonend, beeinflussen die Auslieferungszeit weniger und ermöglichen trotzdem sehr wertvolle Rückschlüsse auf die häufigsten Probleme.

Im mStudio kannst du unter Performance/TTFB Analyse  das Verhalten deines Projekts - bzw. eines einzelnen Seitenaufrufs - auf diese Art und Weise einmessen. Nach einer erfolgreichen Messung wirst du mit einer gruppierten Übersicht konfrontiert. Diese fasst zusammen, wie viele System Calls und wie viel Zeit der jeweiligen Gruppe zugeordnet werden kann. 

Hinweis

Damit wir eine Messung durchführen können, muss der Seitenaufruf einen PHP-Prozess erzeugen. Wenn du ein Caching-Plugin einsetzt, das einen HTML-Cache auf dem Dateisystem erzeugt, kannst du daher keine Messung durchführen. Solche Caches können zum Beispiel von staticfilecache (TYPO3) oder diversen Wordpress-Plugins wie WP Rocket und W3 Total Cache erzeugt werden. Deine Seite hat dann aber ohnehin eine sehr niedrige TTFB. Interessanter sind für dich dann eher die anderen Performance KPIs.

Und darin verbirgt sich das Optimierungspotential, auf das wir nachfolgend eingehen.

Im mStudio kannst du die TTFB anhand von 4 KPIs analysieren
Im mStudio kannst du die TTFB in 4 KPIs aufschlüsseln.

Dateisystem: Rückschlüsse auf Konfiguration

Es ist notwendig, dass Dateien von der Festplatte angefragt und geladen werden. Schließlich ist hier festgehalten, welcher Programmcode ausgeführt werden soll. Werden jedoch sehr viele Dateien angefragt, oder beansprucht dieser Block einen wesentlichen Teil der Anfrage, ist dies häufig auf ein nicht ausreichendes Caching zurückzuführen. Es kann dir auch wertvolle Informationen über mögliche Optimierungen liefern.

Anhand der beteiligten Dateien lassen sich über den angezeigten Dateinamen Rückschlüsse darüber ziehen, welche Komponenten für die Seitenauslieferung herangezogen werden müssen. Stellst du fest, dass viel Zeit auf ungenutzte Plugins oder Themes verwendet wird, solltest du diese aus der Konfiguration deiner Applikation entfernen oder gezielt optimieren.

Diese Systematik kannst du auch auf andere Kategorien anwenden: Wird beispielsweise bei WordPress viel Zeit für die Datei wp-includes/widgets.php verwendet, solltest du deine eingesetzten Widgets genauer unter die Lupe nehmen.

Dateisystem: Caching

Applikationsseitig stellen die verschiedenen Systeme (TYPO3, WordPress, etc.)
spezifische Möglichkeiten zum Caching bereit:

  • TYPO3 wird von Haus aus mit Caching angeboten. Du kannst dies im Backend konfigurieren.
  • Für WordPress stehen Plugins wie W3 Total Cache, WP Fastest Cache, WP
    Rocket oder WP Super Cache zur Verfügung.

Falls trotz aktivem Cache sehr viele Dateien eingelesen werden, kann das ein Hinweis auf ein Optimierungspotenzial in der Cache-Konfiguration sein. Ebenso ist es möglich, dass der OPCache nicht optimal eingerichtet ist. Der OPcache versucht häufig verwendete PHP-Dateien vorzuhalten, sodass diese nicht erst geöffnet und interpretiert werden müssen. Stellst du viele Aufrufe von PHP-Dateien fest, die zudem einen Großteil der Gesamtzeit ausmachen,
solltest du die Größe des OPcaches und seine Effektivität prüfen.

Dafür gibt es etliche Konfigurationsparameter für die php.ini, die wir uns jetzt genauer anschauen:

opcache.memory_consumption

Dieser Wert gibt an, wie viel Arbeitsspeicher der OPCache maximal belegen soll. Wähle hier einen Wert mit ausreichend Puffer, damit möglichst alle PHP-Scripte im OPCache vorgehalten werden. Die aktuelle Auslastung kannst du mit Hilfe von opcache_get_status() auslesen. Alternativ gibt es auch grafische Oberflächen wie
opcache-gui, die genutzt werden können. Achte dabei immer darauf, dass nur du auf diese Daten zugreifen kannst, indem zum Beispiel ein Verzeichnisschutz davor geschaltet wird.

opcache.validate_timestamps

Steht dieser Parameter auf 1, wird beim Zugriff auf den OPCache geprüft, ob sich die angesprochenen Dateien verändert haben. Das ermöglicht es während der Entwicklung, nicht immer den OPCache leeren zu müssen. Gleichzeitig wird für diese Prüfung Zeit benötigt. Dadurch verlangsamt sich die Ausführung. Im Live-Betrieb kann man diese Validierung daher ausschalten.

opcache.revalidate_freq

Sofern opcache.validate_timestamps aktiv ist, wird mit diesem Parameter definiert, in welchen Intervallen (in Sekunden) die Validierung stattfinden soll. Der Default-Wert ist 2 Sekunden, wodurch in diesem Intervall einzelne Aufrufe etwas langsamer sein können.

Preloading

Falls du auch noch das letzte Fünkchen Performance aus deiner Anwendung herausholen möchtest, lohnt sich ein Blick auf das Preloading. Damit können im OPCache Funktionen und Klassen etc. global verfügbar gemacht werden. Ohne Preloading erfolgt das Caching dateibasiert, was für die meisten Anwendungsfälle aber schon sehr schnell ist.

Weitere Einstellungsmöglichkeiten

Die hier aufgeführten Konfigurationsparameter sind natürlich nicht das Ende der Fahnenstange. Für Einzelfälle kann daher ein Blick in die Doku nicht verkehrt sein.

Dateisystem: Individuelle Probleme

Findest du in der Übersicht einzelne Dateien, die viel Zeit deiner TTFB in Anspruch nehmen, steht dies mit Programmausführungen in Verbindung. Zwar können wir an dieser Stelle nicht direkt in den Programmcode schauen. Du findest auf diesem Weg jedoch schneller den Verursacher.

Handelt es sich um PHP-Dateien, solltest du diese kritisch unter die Lupe nehmen und auf ineffiziente Programmierungen, blockierende Funktionsaufrufe oder unnötige Schleifen untersuchen. Handelt es sich um Assets wie Bilder, CSS-Dateien usw. werden diese in irgendeiner Form in deinem Programmcode verarbeitet. Zumindest bei einer gecachten Seite sollte das nur sehr selten passieren. Das liegt daran, dass Bilder und Co. direkt vom Webserver ausgeliefert werden. Die PHP-Prozesse sollten diese höchstens einmalig
verarbeiten, wenn beispielsweise ein Thumbnail generiert wird.

Generell gilt: Du kannst Dateioperationen nicht auf 0 reduzieren. Konzentriere dich lieber gezielt auf die obigen drei Bereiche, wenn eine langsame Seitenauslieferung vorliegt.

Serververbindungen

Für die meisten Webseiten sind zwei Verbindungen zu anderen Servern völlig normal: Einerseits zur Kommunikation mit der Datenbank und andererseits zur Kommunikation mit dem DNS-Server. Der Aufbau der Verbindung zu diesen sollte nie einen wesentlichen Anteil deiner TTFB darstellen.

Interessant wird es dann, wenn weitere Verbindungen auftauchen: Von all diesen ist die Auslieferungszeit deiner Seite abhängig. Ist ein Aufruf langsam, wirkt sich das direkt auf alle anderen Metriken deiner Webseite aus. Im Allgemeinen lässt sich sagen, dass die Kommunikation mit weiteren Servern auf Applikationsebene nur in seltenen Fällen überhaupt nötig ist. Identifiziere die Stellen und entferne die Verbindungen, wenn sie deine Seite negativ beeinträchtigen. Falls du Daten von externen Diensten auf deiner Webseite darstellen möchtest, sollten diese zum Beispiel separat im Frontend per Javascript nachgeladen werden. Die Datenverarbeitung kann dann in einem eigenen Prozess im Browser des Besuchers stattfinden, der nicht die initiale Generierungszeit auf dem Server beeinflusst.

Genaue Analyse deiner Serververbindungen und Datenbank-Querries im mStudio.
Genaue Analyse deiner Serververbindungen und Datenbank-Queries im mStudio.

Datenbank-Queries

Neben Caching sind nicht optimierte Queries die Hauptverdächtigen, wenn es um langsame Webseitenaufrufe geht. Aus diesem Grund findest du sie im mStudio explizit. Trügerisch dabei: In einem Produktivsystem mit einer gewachsenen Datenbank können sie über die Zeit deutlich langsamer werden und sich schlechter verhalten als in lokalen, puristischen Entwicklungsumgebungen. Wird die Datenbank größer, werden effektive Indizes wichtiger. Sticht eine Query in ihrer Ausführungszeit heraus, solltest du diese gezielt mit einem Index versehen und diesen im Deployment deiner Anwendung festhalten.

Herausfordernder zu optimieren sind hingegen sehr viele Queries, die einzeln vergleichsweise schnell, aber in ihrer Summe einen erheblichen Anteil der TTFB ausmachen oder identisch wiederholt ausgeführt werden. Dem zugrunde liegen häufig ineffiziente Programmschleifen, die jedes Mal die Datenbank anfragen. Optimiere solche Stellen gezielt dahingehend, dass die Datenbank weniger häufig angefragt wird.

Zusammenfassung

In diesem Beitrag haben wir dir Probleme und Lösungswege vorgestellt, die häufig in Verbindung mit einer langsamen Seitenauslieferung stehen. Mit unserer Messung der Systemeaufrufe über das mStudio kommst du diesen Problemen auch in Produktivumgebungen schnell und mit wenig Messinterferenz auf die Schliche.

Tipp!

Neben der TTFB kannst du im mStudio alle Web Vitals sowie den CO2-Verbrauch pro Website-Aufruf messen. Teste einfach den Space-Server 10 Tage kostenlos und nimm die Verwaltungsoberfläche unter die Lupe.

Ähnliche Artikel:

So optimierst du die Kennzahlen
Hosting

Performance KPIs im mStudio – So optimierst du die Kennzahlen

Die Hostingverwaltung mStudio zeigt dir zahlreiche Performance KPIs deiner Websites an. Hier liest du, wie du deine Werte optimierst.

Hosting

Performance-Boost (1): Darum sind deine Seiten bei Mittwald so schnell

Du hast dich schon öfter gefragt, warum wir so viel schneller sind als andere Hoster? Tobi hat die ausführliche Antwort im Blog.

Hosting

Performance-Boost (2): Web Vitals verstehen

Wenn ihr euch mit den Web Vitals beschäftigt, werden euch viele Begriffe um die Ohren fliegen. Performance Pro Hannes hilft euch, den Überblick zu behalten.

Hosting

Performance-Boost (3): Lighthouse vs. PageSpeed Insights

Lighthouse und Pagespeed Insights gehören zu den wichtigsten Tools der Performance. Hier erfährst du die Pros & Cons beider Anwendungen.

Hosting

Performance-Boost (4): Ladedauer und -reihenfolge mit Chrome DevTools analysieren

Ladedauer und -reihenfolge sind grundlegend für die Performance-Analyse deiner Webseite. Lies hier, was du in den DevTools dabei beachten solltest.

Hosting

Performance-Boost (5): Mehr Chrome DevTools − Performance Insights & JavaScript Profiler

Chrome stellt euch mächtige Tools zur Performance-Analyse zur Verfügung. Hannes zeigt, was mit Performance Insights & JavaScript Profiler möglich ist.

Kommentare

Gregor Wendland, Webentwickler am
Hallo Hannes, voll gut das Thema einmal aus eurer Perspektive beleuchtet zu sehen. Ich habe in WordPress sehr viele gute Erfahrungen mit den Plugins WP Fastest Cache, WP Rocket und W3 Total Cache gemacht. All diese Plugin Cachen Seiten, Posts und so wird alles noch mal schneller. Auch in Kombination mit Cloudflare habe ich gute Erfahrungen gemacht, um die TTFB in die Knie zu zwingen.
Wie ist eure Einstellung zu Cloudflare?
Viele Grüße aus Berlin
Gregor
Antworten
Hannes Strangmeier am
Hallo Gregor,

ich freue mich, dass dir mein Artikel gefallen hat :)

Zum Thema Cloudflare: In wenigen Sätzen lässt sich hier wohl kein vollständiges Bild zeichnen, zumal Cloudflare viel mehr leisten kann, als die Wordpress-Cache-Plugins (bspw. CDN, DDoS-Protection etc.).

Ich versuche es daher mal etwas überspitzt:
Wenn die Seite kein CDN benötigt (bspw. weil die User vor allem aus dem DACH-Raum kommen), das Budget klein ist und auch nicht sehr große Besucherzahlen erwartet werden, reicht ein Wordpress-Cache-Plugin vollkommen aus. Im Idealfall mit einem statischen HTML-Cache. Sofern viele Besucher erwartet werden, kann sich auch ein Blick auf Varnish (https://www.mittwald.de/produkte/varnish-hosting) lohnen.

Wenn die Seite international aufgestellt ist und viele Besucher hat, ist ein CDN wie Cloudflare in der Regel sinnvoll.

Man kann Cloudflare natürlich auch für alle anderen Anwendungsfälle nutzen. Allerdings stellt dann umso mehr die Frage, ob es wirtschaftlich sinnvoll ist - unter anderem, da man sich in allen Fällen damit auseinandersetzen muss, welche Auswirkungen die Nutzung eines US-Anbieters auf den eigenen Datenschutz hat. Aus meiner Erfahrung gibt es da sehr unterschiedliche Auffassungen, was die Vereinbarkeit mit der DSGVO und Co. angeht (bzw. was man alles beachten muss).

Disclaimer: Wir können hier keine Rechtsberatung geben, das verstehst du sicher. Welche Auswirkungen genau die Nutzung von Diensten wie Cloudflare für deinen individuellen Anwendungsfall hat, sollte der Datenschutzbeauftragte - ggf. in Zusammenarbeit mit einem Rechtsbeistand - klären.
Antworten
Gregor Wendland, Webentwickler am
Hallo Hannes,

danke für Dein Feedback! Ja, Cloudflare ist auf jeden Fall eine Diskussion wert ;D

Ich denke, Du hast völlig Recht mit Deiner Einschätzung und meine Erfahrungen decken sich auch damit: Was die Performance von deutschen Seiten für Deutsche Besucher angeht, ist ein Caching-Plugin meistens ausreichend. Wenn es irgendwelche TV-Ausstrahlungen oder Radio-Werbung gibt oder so was in der Art, dann kann ein CDN natürlich auch sinnvoll sein, um den Besucheransturm zu bewältigen.


Viele Grüße

Gregor
Antworten
Benjamin am
Schöner Beitrag, Hannes,

leider mit einigen Bezügen explizit auf das mStudio. Nach unserem mStudio-Desaster bei einem A-Kunden wissen wir nun, dass das Produkt noch einige Zeit brauchen wird und waren dankbar über den hervorragenden mittwald-Service, der die betreffenden Projekte wieder in die 'alte Welt' migrierte und so den SuperGAU beim Kunden noch abwenden konnte.

Darum interessieren mich hier explizite Anleitungen zum Agenturserver ungleich mehr als mStudio-bezogene Beiträge. Könntet Ihr hier strukturiert 2-gleisig vorgehen, um der (aktuell noch stabileren) alten Welt ebenfalls exakte Anleitungen und maximale Möglichkeiten aufzuzeigen? Das wäre super!
Antworten

Kommentar hinzufügen