Support kontaktieren

Wir melden uns per E-Mail. Meist innerhalb von zwei Tagen.

Zum Schutz vor Missbrauch prüft Google reCAPTCHA diese Einsendung. Dabei werden Daten an Google übertragen. Das Skript wird erst geladen, wenn Sie dieses Formular öffnen.

← Alle Beiträge

Jeder Aufruf lädt ganz lib/

Zeile 46 der einen Eingangsdatei dieses Dienstes:

foreach (glob(__DIR__ . '/lib/*.php') as $f) { require_once $f; }

Das sind 65 Dateien und 1,5 Megabyte, geladen bei jedem Aufruf. Ein Zählerbild, eine Statistikseite, ein 404 — alles gleich. Gestern ist das 20.734-mal passiert.

26 Zählerfamilien — 715 KB, eine wird gebraucht Flaggen 189 KB · Diagramme 158 KB · alles Übrige 470 KB kalt, ohne Opcode-Zwischenlager: 132 ms Opcodes von der Platte: 18,2 ms Opcodes im geteilten Speicher: 0,33 ms — glob und 65 stat 65 Dateien, 1,5 MB, 56 Klassen, bei jedem Aufruf

Die Zahl, auf die es ankommt, ist die kleine

Alles von Grund auf zu laden, mit ausgeschaltetem Opcode-Zwischenlager, dauert etwa 132 Millisekunden. Das ist die Zahl, die daraus einen Skandal machen würde, und es ist nicht die Zahl, die der Server zahlt.

Sind die Opcodes bereits übersetzt und liegen im geteilten Speicher, bleibt das Auflisten des Verzeichnisses und ein stat() je Datei, weil die Zeitstempelprüfung an ist: 0,33 Millisekunden. Bei den Zugriffen von gestern sind das keine sieben Sekunden Arbeit über den ganzen Tag.

Dazwischen liegt eine dritte Messung, 18,2 Millisekunden, mit einem Opcode-Zwischenlager, das von der Platte liest statt aus dem Speicher. Das ist eine obere Schranke und nicht der wirkliche Wert — es ist, was passiert, wenn es das Zwischenlager gibt, es aber langsamer ist als das echte. Es steht hier, weil es der einzige warme Wert ist, den man von der Kommandozeile messen kann, und etwas anderes zu behaupten wäre der bequeme Fehler.

Also: das kostet fast nichts, und es kostet fast nichts einzig wegen etwas anderem. Schaltet man das Opcode-Zwischenlager ab, kostet dieselbe Zeile das Vierhundertfache. Das ist eine echte Abhängigkeit, und es ist besser, davon zu wissen, als sie bei einer Aktualisierung zu entdecken.

Was in den 1,5 Megabyte wirklich steckt

Siebenundvierzig Prozent davon — 715 Kilobyte in 26 Dateien — sind Zählerfamilien. Ein Zählerbild zu zeichnen braucht genau eine davon. Die anderen 25 werden geladen, angemeldet und nie angefasst.

Danach: 189 Kilobyte Flaggendaten, gebraucht auf der Länderseite; 158 Kilobyte Diagrammbibliothek, gebraucht, wenn etwas ein Diagramm zeichnet. Keines von beiden ist am Zählerbild beteiligt, und das ist der Aufruf, den dieser Dienst häufiger beantwortet als jeden anderen.

Sichtbar wird das eher im Speicher als in der Zeit. Die Spitze je Aufruf steigt um rund vier Megabyte, und anders als die Opcodes — die sich alle Prozesse teilen — wird dieser Teil je Aufruf bezahlt, gleichzeitig, von jedem Arbeiter zugleich.

Jemand hat es schon gemerkt

Der glob lautet lib/*.php. Er geht nicht in die Tiefe, und zwei Verzeichnisse liegen direkt darunter: lib/live/ mit 229 Kilobyte und lib/recht/ mit 182 Kilobyte. Vierhundert Kilobyte, die früher im Ladepfad lagen und jetzt nicht mehr.

Sie wurden verschoben, weil sie groß und selten nötig sind: die Statistikabschnitte und die Rechtstexte. Eine Ebene tiefer zu liegen ist der ganze Mechanismus. Es gibt keine Einstellung, keinen Nachlader, keine Zuordnungstabelle — eine Datei ist im glob oder nicht.

Das ist eine echte Behebung, und das gehört gesagt, denn der naheliegende nächste Schritt wäre ein Autoloader, und ein Autoloader wäre hier eine große Änderung für ein Problem, das ein mkdir schon zweimal gelöst hat.

Warum es bleibt

Ein einzelner glob ist das Einfachste, was überhaupt funktionieren kann, und nach der Messung funktioniert es: ein Drittel einer Millisekunde, auf einem Raspberry Pi, auf dem Pfad, der schnell sein muss. Ersetzt man ihn durch einzelne Einbindungen, braucht jede neue Datei irgendwo eine Zeile, und die vergessene Zeile erzeugt einen Absturz im Betrieb statt einer etwas größeren Ladung.

Was fehlt, ist das, was es überhaupt erst tragbar gemacht hat, aufgeschrieben: wird eine Datei in lib/ groß, zieht sie in ein Unterverzeichnis und wird dort eingebunden, wo sie gebraucht wird. Genau dieser Regel folgten die beiden Verzeichnisse, und sie stand bis heute nirgends.

Die allgemeine Fassung ist langweiliger als die Messung. „Alles lädt alles" ist meistens die falsche Form, und es lohnt sich zu wissen, ob es einen etwas kostet, bevor man es umbaut. Hier kostet es 0,33 Millisekunden und vier Megabyte, und die vier Megabyte sind der Teil, den man im Auge behalten sollte, denn sie wachsen mit der Gleichzeitigkeit und die Millisekunden nicht.

Anzeige