Write Stall
Wenn eine LSM-basierte Datenbank eingehende Schreibvorgänge absichtlich bremst oder ganz stoppt, weil die Kompaktierung nicht mehr hinterherkommt. Die meistzitierte Ursache für Latenzspitzen in RocksDB.
Eine LSM-Engine nimmt Schreibvorgänge im Speicher entgegen und spült sie nach Level null, woraufhin Hintergrund-Threads die Daten weiter durch die Level nach unten schieben müssen. Kommen die Schreibvorgänge schneller herein, als die Kompaktierung sie verarbeiten kann, wächst die Schuld — und weil die Anzahl der Dateien auf Level null direkt bestimmt, an wie vielen Stellen eine Lesung suchen muss, kann das System sie nicht ungebremst wachsen lassen. Die Lösung besteht darin, das Problem sichtbar zu machen: ab einer Schwelle werden Schreiber auf eine feste Rate gedrosselt, ab einer höheren komplett gestoppt, bis sich die Lage erholt hat. Aus Sicht der Anwendung sieht es so aus, als sei die Datenbank für ein paar Sekunden eingefroren. Die Abhilfen sind alle auf ihre eigene Art unangenehm — mehr Kompaktierungs-Threads, größere Memtables, eine weniger schreiblastige Kompaktierungsstrategie oder schlicht weniger Last.