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

Der Zwischenspeicher, der im Arbeitsspeicher wohnt

Knapp ein Fünftel der Zählerbilder, die dieser Dienst zeichnet, ändert nichts mehr. Ein Mausverfolgungsskript aus der vorigen Fassung lädt das Bild bei jeder Bewegung neu, und seit diese Aufrufe nichts mehr erhöhen, ergeben zwei davon hintereinander dasselbe Bild, Byte für Byte.

Ein naheliegender Fall für einen Zwischenspeicher. Interessant waren die Entscheidungen, wohin damit und worauf der Schlüssel lautet.

Nicht auf die Platte

Das läuft auf einem Raspberry Pi, und die Platte ist eine SD-Karte. Gezeichnete Bilder dorthin zu speichern hätte rund 70 MB Schreiblast am Tag bedeutet, im Tausch gegen eine gemessene Ersparnis von 1,6 Minuten Rechenzeit am Tag.

Das ist ein schlechter Tausch. SD-Karten sterben am Schreiben, und gekauft wird ein Rundungsfehler auf einer Maschine, die nicht an der Rechenzeit hängt. Der Zwischenspeicher liegt deshalb in /dev/shm, also in tmpfs, also im Arbeitsspeicher. Dort gemessen: 0,027 ms lesen, 0,036 ms schreiben, 1,9 GB frei.

Nach einem Neustart ist alles weg. Für einen Zwischenspeicher ist das kein Verlust, sondern der Normalfall.

Auf demselben Pi läuft Redis. Es wurde nicht genommen, aus einem Grund, der mit Technik nichts zu tun hat: es gehört einer anderen Anwendung und ist für sie mit einem Passwort versehen. Eine gemeinsame Instanz würde zwei unverwandte Dienste aneinanderbinden, sodass ein schlechter Tag des einen zum schlechten Tag des anderen wird.

Der Schlüssel enthält die Zahlen

Der übliche Schlüssel ist eine Kennung plus ein Ablaufdatum, und das Ablaufdatum ist eine Wette: in den letzten fünf Minuten hat sich nichts Wichtiges geändert. Bei einem Zähler ist das, was sich ändert, genau das, was angezeigt wird.

Also wandern die angezeigten Werte in den Schlüssel. Ändert sich eine Zahl, ist es ein anderer Schlüssel, und das Bild wird neu gezeichnet. Die Wette verschwindet, statt sorgfältig abgeschlossen zu werden. Jeder gezählte Besuch erhöht mindestens den Gesamtstand, also kann kein gezählter Besuch ein veraltetes Bild bekommen. Das verbleibende Ablaufdatum ist nur noch eine Obergrenze für die Werte, die nicht im Schlüssel stehen — Wochen-, Monats- und Jahreszahlen.

Was vorher geprüft werden musste

Ein Zwischenspeicher ist nur dann sicher, wenn das Gespeicherte eine Funktion seines Schlüssels ist. Das ist eine Behauptung über jeden einzelnen Entwurf, und sie wurde geprüft statt angenommen:

  • kein Entwurf benutzt rand(), mt_rand(), shuffle() oder uniqid()
  • kein Entwurf liest die Uhr feiner als stundenweise
  • die Verfolgungsparameter des alten Skripts werden nirgends im Baum gelesen

Der letzte Punkt brachte den schönsten Fehlschlag der ganzen Übung hervor. Solange diese Parameter noch zum Schlüssel gehörten, trug jede Anfrage leicht andere Mauskoordinaten, also war jeder Schlüssel einmalig. Der Zwischenspeicher lief einen ganzen Tag und verzeichnete 13 Treffer. Er arbeitete einwandfrei und tat nichts, und das ist die am schwersten zu bemerkende Art von kaputt.

Und geht hier irgendetwas schief — unlesbares Verzeichnis, volle Platte, beschädigter Eintrag —, wird das Bild ganz normal gezeichnet. Ein Zwischenspeicher darf nie der Grund sein, dass kein Zähler erscheint.

Anzeige