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

Wenn ein Zwischenspeicher falsch herum wächst

Im Zwischenspeicher dieses Dienstes liegen vier kleine Dateien. Die größte hat 35 Byte. Zusammen enthalten sie drei Zählernummern, und sie werden bei jedem einzelnen Zähleraufruf gelesen.

Es gibt sie, damit der Zählpfad der Datenbank nicht vier Fragen stellen muss, die er fast immer mit „nein" beantwortet. Schließt dieser Zähler die eigenen Besuche des Betreibers aus? Zählt er ausgehende Klicks? Verfolgt er Wege durch die Seite? Lädt er sich selbst neu? Für über 99 % der Zähler lautet jede Antwort nein, und eine Datei mit der Handvoll Nummern, bei denen sie ja lautet, ist billiger zu befragen als vier Abfragen mit Index.

Sie ist billiger. Sie ist auch die Art von billig, die sich umdreht.

2 10 100 1.000 10.000 100.000 alle 2.218 aktiven Zähler: 0,43 ms die Datei: 0,02 ms bei 3 Nummern, 21,4 ms bei 100.000 eine Abfrage mit Index: 0,16 ms bei jeder Größe

Was gemessen wurde

Dieselbe Frage — „steht dieser Zähler in der Liste?" — auf zwei Wegen gestellt, bei sechs Listenlängen. Der Dateiweg: lesen, JSON entschlüsseln, die Nummer suchen. Der Datenbankweg: eine vorbereitete Abfrage gegen eine Spalte mit Index. Je zweitausend Wiederholungen, fünf Runden, Median genommen.

Bei der heutigen Größe gewinnt die Datei um das Achtfache: 0,0202 Millisekunden gegen 0,1630. Bei tausend Nummern sind beide gleichauf. Bei zehntausend kostet die Datei zwölfmal so viel, und bei hunderttausend das 135-Fache, weil dann 578 Kilobyte bei jedem Treffer gelesen und entschlüsselt werden müssen.

Die Linie der Datenbank bewegt sich nicht. 0,16 Millisekunden bei zwei Zeilen und 0,16 Millisekunden bei hunderttausend: dafür ist ein Index da, und man vergisst leicht, wie viel Arbeit hinter dieser langweiligen Linie steckt.

Der unangenehme Teil

Der Kipppunkt liegt zwischen 100 und 1.000 Nummern. Dieser Dienst hat 2.218 Zähler, die in den letzten dreißig Tagen Zugriffe hatten.

Wäre der Ausschluss also ein Erfolg — schaltete jeder, der einen Zähler hat, „meine eigenen Besuche nicht mitzählen" ein — dann enthielte die Datei 2.218 Nummern, wöge 11 Kilobyte und kostete 0,43 Millisekunden je Treffer statt 0,02. Bei den 18.423 Treffern von gestern sind das acht Sekunden Arbeit am Tag, um eine Abfrage zu vermeiden, die drei gebraucht hätte.

Die Optimierung ist am schnellsten, wenn die Funktion am wenigsten benutzt wird. Sie wird nicht allmählich schlechter unter Last, wie eine langsame Abfrage. Sie wird schlechter mit der Verbreitung, und das ist die eine Achse, auf die niemand schaut, weil steigende Verbreitung die gute Nachricht sein soll.

Warum es trotzdem so bleibt

Weil es heute richtig ist, und „heute richtig" darf der Grund für etwas sein, solange jemand aufgeschrieben hat, wann es aufhört, wahr zu sein.

Drei Nummern in drei Dateien. Achtmal billiger als die Alternative, auf einer Maschine, bei der der Zählpfad das Einzige ist, was schnell sein muss. Das jetzt durch die Abfrage zu ersetzen, die es schlägt, wäre ein schlechteres System, begründet mit einer Möglichkeit.

Was fehlt, ist der Stolperdraht, nicht der Umbau. Die Datei wird ohnehin aus der Datenbank geschrieben, von dem Code, der eine Einstellung ändert — genau dort merkt man, dass die Liste über ein paar hundert Einträge gewachsen ist, und sagt es. Ein Zwischenspeicher mit aufgeschriebener Obergrenze ist eine Entscheidung. Einer ohne ist eine Wette, der niemand zugestimmt hat.

Die allgemeine Form

Das ist kein Argument gegen das Zwischenspeichern in einer Datei. Es ist ein Argument dafür, zu wissen, in welche Richtung der Zwischenspeicher wächst.

Die meisten Zwischenspeicher werden unter Last besser: mehr Anfragen, mehr Treffer, bessere Quote. Dieser ist von der anderen Sorte. Seine Kosten je Anfrage hängen davon ab, wie viel er enthält, und was er enthält, wächst mit genau der Sache, die der Dienst fördern will. Jedes Lesen bezahlt für jeden Eintrag, auch für die 2.215, die mit dem Besucher, der gerade gezählt wird, nichts zu tun haben.

Die Frage an jede Nachschlagliste im Speicher oder in einer Datei lautet nicht „wie schnell ist sie", sondern „wodurch wächst sie, und was passiert, wenn diese Sache gut läuft". Lautet die Antwort „sie wird langsamer", dann gehört die Größengrenze in den Code, neben die Stelle, die die Datei schreibt, an dem Tag, an dem man sie baut.

Anzeige