TechSupport
Crownpeak employee
Crownpeak employee

Analyse und Optimierung der Generierungsgeschwindigkeit

Wenn die Generierung eines Projektes zu lange dauert, so muss man zwischen zwei grundsätzlichen Verhaltensweisen unterscheiden:

  • Einmalig langandauernde Generierung
  • Regelmäßig langandauernde Generierung

Einmalig langandauernde Generierung

Bei einer einmalig langandauernden Generierung liegt die Ursache normalerweise nicht an den Vorlagen, sondern wird durch andere, externe Umstände hervorgerufen.Wenn es sich bei der Generierung um eine Delta-Generierung handelt, so wurden wahrscheinlich viele Änderungen im Projekt durchgeführt (z.B. durch einen automatischen Import). Bei einer Teilprojekt-Generierung könnten es neu hinzugefügte Bilder sein, die beim ersten Gebrauch skaliert werden müssen. Beispielsweise würde eine Medien-Generierung, die 100 neue Bilder in 30 Auflösungen berechnen soll bei einer angenommenen Berechnungszeit von 7 Sekunden pro Auflösung 100*30*7 = 21000 Sekunden für die Berechnung benötigen. Bei (standardmäßig) zwei parallelen Skalierungen ergibt das ca. 3 Stunden zusätzliche Generierungszeit. Es könnte auch ein Problem auf dem Server sein (hohe Speicherauslastung, hohe I/O Last, o.ä.). Wenn ausgeschlossen werden kann, dass das Verhalten durch neue Inhalte hervorgerufen wird und das Problem mehrfach auftritt, kann eine Anfrage beim technischen Support gestellt werden.

Regelmäßig langandauernde Generierung

Dauert die Generierung eines Projektes regelmäßig lange, so kann dies unter anderem an ineffizient gestalteten Vorlagen liegen.In den FirstSpirit Log-Files finden sich standardmäßig nur Informationen zu der Gesamtdauer des Generierungsprozesses und der durchschnittlichen Dauer der Generierung einer Seite. Um konkrete Seiten zu identifizieren, die die Generierung verlangsamen, reicht dies jedoch nicht aus, weshalb das Einfügen entsprechenden Profiling Codes notwendig wird, um das Problem genauer zu identifizieren.Folgendes Beispiel misst die Zeit, die für die Generierung zwischen zwei Punkten im Template benötigt wird. Fügen sie den nachfolgenden Code einfach an den Stellen der Templates ein, an denen die Messung stattfinden soll (beim ersten Durchgang beispielsweise beginnend ganz am Anfang hinter dem schließenden </CMS_HEADER> Tag):$-- Fügen Sie diesen Block an den Anfang des Codeabschnittes ein, dessen Generierungszeit gemessen werden soll. Die aktuelle Zeit wird als Startzeit gespeichert --$$CMS_SET(set_pt_startTime,#global.now.milliseconds)$
$-- Hier folgt der Templatecode, dessen Generierungsdauer berechnet werden soll --$
$-- Ende der Zeitmessung. Wenn ein bestimmter Wert überschritten wird, soll eine WARN Meldung ausgegeben werden, die leicht im Logfile zu finden ist --$$CMS_SET(set_pt_bodyGenerationTime,#global.now.milliseconds - set_pt_startTime)$$CMS_IF(set_pt_bodyGenerationTime > 1000)$    $CMS_VALUE(#global.logWarning(“Langsam generierende Templatestelle erkannt. Bereich von ” + #global.page.getUid() + “ (ID=” + #global.page.getId() + “) in ” + set_pt_bodyGenerationTime + “ms generiert”))$$CMS_END_IF$
Berücksichtigen Sie im obigen Beispiel auch die folgenden Punkte:

  • Sie können das Log-Level anpassen (#global.logInfo anstelle von #global.logWarning) wenn sie keine Warnung loggen möchten oder die if-Abfrage erweitern, um Warnungen nur für sehr langsame Seiten zu loggen.
  • Sie können den Profiling-Code auch in einer Format-Vorlage speichern, um ihn in mehreren Templates wiederverwenden zu können.
  • In vielen Anwendungsfällen ist es nützlich, eine Variable statt einer hart codierten Grenze von 1s (1000ms) für das Logging zu verwenden.

Normalerweise wird der Code in Seitentemplates eingefügt, er kann aber auch bspw. in Absatzvorlagen verwendet werden, um die langsamen Templates bei der Generierung genauer zu identifizieren. Nun werden bei einer Generierung Warnungen für langsam generierte Seiten ausgegeben, welche bspw. so aussehen können:

WARN  24.08.2010 11:03:47.211 {seID=82232} (de.espirit.firstspirit.generate.SiteProduction): Langsam generierende Templatestelle erkannt. Bereich von index_1 (ID=1234) in 31837 ms generiert

Da der Referenzname und die ID der Seite geloggt werden (im Beispiel “index_1” und 1234), können Sie nun einfach im Projekt nach dieser Seite suchen, um zu prüfen, warum diese so lange für die Generierung benötigt. Es kann ebenfalls von Vorteil sein, das Profiling nochmal auf die in der Seite verwendeten Absatz-Vorlagen zu erweitern, um den konkreten verlangsamenden Code zu identifizieren. Beachten Sie, dass selbst wenige Zehntelsekunden Zeitersparnis pro generierter Seite die Gesamtdauer der Generierung, insbesondere bei komplexen Projekten, deutlich verringern können.

Labels (1)