Hilfe:Vorlagenbeschränkungen

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Hilfe > Bausteine > Vorlagen > Vorlagenbeschränkungen

Diese Hilfeseite stellt für Vorlagenprogrammierer Grenzen dar, die bei sehr großen Seiten oder solchen mit sehr vielen Vorlagen dazu führen können, dass die Seite nicht richtig angezeigt wird.

Man mag sich darüber streiten, ob ein Schwellenwert von 40 oder 50 der geeignete sei, oder ob es statt 500 lieber 1000 sein dürfen. Gleichwohl sind Begrenzungen notwendig:

  • Durch endlose Rekursion könnte eine einzelne Seite den gesamten Server zum Erliegen bringen.
  • Böswillige Attacken könnten einen Server damit bewusst flachlegen.
  • Die resultierenden HTML-Seiten sollen bei den Lesern noch in vertretbarer Zeit abgerufen werden und dargestellt werden. Eine Begrenzung der gesamten Seitengröße ist auch deshalb irgendwann unausweichlich.
  • Extrem ineffiziente und überflüssige Vorlagenprogrammierung muss nicht gefördert werden.

Auf dieser Hilfeseite wird der Begriff „Vorlage“ auch für beliebige eingebundene Wikitext-Seiten verwendet; er gilt weiterhin analog für die Programmierung in Lua wie für die klassische Vorlagensyntax.

Grenzwerte[Bearbeiten]

Grenzwerte und ihre Bedeutung
Bezeichnung Grenzwert Erläuterungen
CPU-Zeit (Sekunden)
CPU time usage
  • Die Echtzeitnutzung hat immer einen leicht größeren Wert als die CPU-Nutzung. Am Verhältnis der beiden Werte zueinander lässt sich die momentane Serverlast ablesen.
  • Es wird berichtet, dass bei großer Serverbelastung die Echtzeit den vierfachen Wert der CPU-Zeit annehmen könne. In ruhigen Zeiten ist der Unterschied geringfügig.
  • Es handelt sich um die Zeit, in der innerhalb der Server der Wikitext umgewandelt wird in HTML zwecks Ablage im Seiten-Cache; nicht zu verwechseln mit Antwortzeiten aus dem Netzwerk.
Echtzeitbedarf (Sekunden)
Real time usage
Besuchte Knotenanzahl des Präprozessors
Preprocessor visited node count
1000000
  • Bestimmte Syntaxelemente wie <nowiki> oder auch {{}} bilden einen oder mehrere Knoten.
  • Nicht wirksam gewordene Zweige von {{#if: etc. und {{#switch: zählen nicht als „besucht“.
Erzeugte Knotenanzahl des Präprozessors
Preprocessor generated node count
1500000
  • Alle Syntaxelemente der gesamten Seite auch außerhalb der Vorlagen, etwa Überschriften, werden ein- oder mehrfach als Knoten gezählt.
Einbindungsgröße nach dem Expandieren (Bytes)
Post-expand include size
2048000
  • Gesamtlänge der Seite, zuzüglich aller Quelltexte von Vorlagen und Untervorlagen; teils mehrfach zählend.
  • Kommentare und noinclude/onlyinclude zählen nicht mit. Damit spielt es in diesem Zusammenhang keine Rolle (mehr), ob die Dokumentation auf einer separaten Seite steht.
Vorlagenargumentgröße (Bytes)
Template argument size
2048000
  • Länge aller ersetzten Argumente der Vorlagen; teils mehrfach zählend.
Höchste Expansionstiefe
Highest expansion depth
40 Verschachtelungstiefe
  • Jede Seiteneinbindung innerhalb einer anderen.
  • Jeder Aufruf einer Parserfunktion.
  • Jede Parserfunktion, die eine andere Parserfunktion oder Seiteneinbindung als Parameter hat, führt zu tieferer Verschachtelung (insbesondere {{#if: etc. und {{#switch:).

Stellt man sich alle Seiteneinbindungen expandiert vor, ist es die maximale Anzahl nacheinander geöffneter geschweifter Klammerpaare {{ bis zur tiefsten Ebene.

Anzahl aufwändiger Parserfunktionen
Expensive parser function count
500 Typische Vertreter:
  • Abfrage der Existenz von Seiten und Dateien
  • Statistische Zählungen, wie Seitenanzahl in einer Kategorie oder Seitengröße
Lua-Zeit (Sekunden)
Lua time usage
10 Anteil der CPU-Zeit, in der ausschließlich Lua-Code ausgewertet wird.
Lua-Speichernutzung (MB)
Lua memory usage
50

In der Regel und bei normalen (und damit recht kleinen) Seiten werden die Grenzwerte bei weitem nicht erreicht. Nur wenn es Darstellungsprobleme gibt oder deshalb zu einer vorhandenen Vorlagenprogrammierung eine effizientere Struktur ausgetüftelt werden muss, sind die Daten zu analysieren.

Parser Profiling Report[Bearbeiten]

Der „PP Report“ gibt für die aktuelle Seite die benötigte Ressourcennutzung an.

HTML-Quelltext[Bearbeiten]

Der „NewPP limit report“ steht im HTML-Quelltext jeder aus Wikitext generierter Seiten (also außer Spezialseiten) als Kommentar am Ende des Content-Bereichs innerhalb des Portalrahmens.

  • Das durch die Skin vorgegebene Portal wird aus vorgefertigten Elementen je nach Namensraum, Benutzergruppe usw. als Grundgerüst der HTML-Seite erstellt und zählt bei den Begrenzungen nicht mit; nur der aus dem Wikitext generierte Content wird gewertet. Spezialseiten haben deshalb keine solche Auswertung.
  • Der „PP Report“ steht sowohl im Quelltext der statischen Seite (mit /wiki/) wie auch in der Seitenvorschau.
  • Dem LivePreview wird zurzeit kein PP Report mitgegeben, erst recht nicht aktualisiert.

Beispiel:

<!--
NewPP limit report
CPU time usage: 0.176 seconds
Real time usage: 0.213 seconds
Preprocessor visited node count: 172/1000000
Preprocessor generated node count: 1251/1500000
Post‐expand include size: 6349/2048000 bytes
Template argument size: 391/2048000 bytes
Highest expansion depth: 8/40
Expensive parser function count: 0/500
Lua time usage: 0.005s
Lua memory usage: 509 KB
-->

Seitenvorschau[Bearbeiten]

Im Fußbereich der Seitenvorschau wird eine ausklappbare Tabelle gezeigt, aus der Vorlagenprogrammierer die aktuellen Werte entnehmen können, ohne erst im HTML-Quelltext nachsehen zu müssen.

  • Für Normalbenutzer ist dies jedoch völlig belanglos.
  • Für den letzten Ausklappzustand wird ein Session-Cookie preview-limit-report angelegt mit den Werten collapsed oder expanded.

Die Tabelle hat .limitreport als CSS-Selektor.

  • Weil sie der weitaus überwiegenden Zahl der Benutzer nicht weiterhilft und auf den meisten Seiten die Werte völlig unkritisch sind, wird die Tabelle standardmäßig ausgeblendet.
  • Eine Einblendung wäre zu erreichen durch
/* [[Hilfe:Vorlagenbeschränkungen]] */
div.limitreport {
   display: block;
}

Lua[Bearbeiten]

Für Lua ist die Länge expandierter Zeichenketten und die Knotenanzahl wenig relevant.

  • Das #invoke und eine Handvoll Parameter tragen nicht auf; insbesondere wenn die Lua-Programmierung bereits in der Nähe der angezeigten Seite greift und dort komplexe Aufgaben löst und nicht erst vielfach in tieferen Schachtelungsebenen einsetzt.
  • Die Länge der Lua-Programmierung geht nicht in die Grenzwerte ein.

Maßgeblich ist die Begrenzung der Echtzeit.

  • Damit es auch in Spitzenzeiten nicht zu Problemen kommt, sollte die CPU-Zeit bei nicht mehr als gut zwei Sekunden gehalten werden.

Generell senkt der Einsatz von Lua den Ressourcenverbrauch einer stark mit Vorlagen bestückten Seite auf etwa ein Drittel.

  • Effizient ist die Nutzung von mw.loadData() für mehrfach in eine Seite eingebundene größere Datenmengen (keine Funktionen), die nur einmal ausgeführt wird.

Wartungskategorien[Bearbeiten]

Beim Überschreiten der Grenzwerte werden die Seiten in die folgenden Wartungskategorien der Seitenbeschränkung überschritten eingeordnet:

Kandidaten für gesprengte Limits finden sich unter Spezial:Längste Seiten.

Möglichkeiten der Abhilfe[Bearbeiten]

Wenn Grenzen überschritten werden, gibt es folgende Lösungsansätze:

  • Aufteilung der Seite
  • Verzicht auf Einbindung vieler selbstständiger Unterseiten in einer großen Zusammenstellung
  • Vereinfachung von Vorlagenprogrammierung
  • Ersatz von Vorlagen durch Lua

Weitere Informationen[Bearbeiten]