Zum Inhalt
GlobalNet
Strategies

Software & Entwicklung · LOG / 761

Cloudflare: Was die Einsparung von 100 TB RAM lehrt

Cloudflare sparte mit kompakteren Rust-Datenstrukturen und weniger Consistent-Hashing-Punkten global mehr als 100 TB RAM. Daraus lässt sich ein sicherer Optimierungs- und Rolloutprozess ableiten.

Cloudflare hat bei einem Pingora-basierten Routingdienst weltweit mehr als 100 Terabyte Arbeitsspeicher freigesetzt. Der Effekt entstand nicht durch eine einzelne spektakuläre Neuentwicklung. Zuerst wurde die Speicherung von Hash und Index in Rust kompakter gestaltet. Danach reduzierte das Team mathematisch begründet die Zahl der Consistent-Hashing-Punkte pro Server. Der Fall zeigt, wie sich kleine Kosten pro Eintrag durch große Datenmengen und viele Maschinen zu einem erheblichen Infrastrukturposten multiplizieren.

Die bestätigten Ergebnisse sind konkret: Die kompaktere Datenstruktur senkte den Speicherbedarf der Consistent-Hashing-Struktur um 25 Prozent. Anschließend ließ sich die Zahl der erzeugten Hashes pro Server um 90 Prozent reduzieren, ohne dass Cloudflare einen relevanten Genauigkeitsverlust feststellte. Zusammen ergaben die Optimierungen global mehr als 100 Terabyte zurückgewonnenen RAM.

Zwei Optimierungen mit unterschiedlicher Wirkung

Der erste Hebel lag im Speicherlayout. Wenn logisch zusammengehörige Werte mit unnötigem Verwaltungsaufwand, Ausrichtungslücken oder größeren Typen als erforderlich gespeichert werden, entstehen zusätzliche Bytes je Eintrag. Bei einer kleinen Struktur wirkt das unbedeutend. Wird sie jedoch für viele virtuelle Punkte, Server und Prozesse repliziert, vervielfacht sich der Overhead.

Der zweite Hebel war algorithmisch. Consistent Hashing verteilt Aufgaben über einen Hash-Ring; zusätzliche virtuelle Punkte können die Verteilung gleichmäßiger machen. Mehr Punkte benötigen aber auch mehr Speicher. Cloudflare prüfte deshalb mathematisch, wie viele Punkte für die gewünschte Genauigkeit tatsächlich nötig waren, und reduzierte die Menge um 90 Prozent. Dieser Schritt wirkt stärker als reine Byte-Optimierung, weil er die Anzahl der gespeicherten Elemente selbst senkt.

Die nachvollziehbare Ableitung für Unternehmen lautet: Erst die Kosten eines einzelnen Elements reduzieren, dann hinterfragen, ob alle Elemente überhaupt erforderlich sind. Ein effizienterer Datentyp hilft, doch oft steckt der größere Hebel in Stichprobengröße, Replikationsfaktor, Indexdichte, Cache-Granularität oder einer historisch gewachsenen Sicherheitsmarge.

Wann sich Low-Level-Optimierung geschäftlich lohnt

Nicht jede Anwendung braucht eine Rust- oder Hashing-Initiative. Bei kleinen Systemen kann Entwicklungszeit teurer sein als eingesparter Speicher. Relevant wird die Untersuchung, wenn eine Struktur dauerhaft in vielen Prozessen liegt, mit Kundenwachstum linear oder stärker wächst oder zusätzlichen Kapazitätsausbau auslöst. Entscheidend ist die gesamte Kostenkette, nicht nur der RAM-Preis.

  • Hoher Hebel: häufig replizierte In-Memory-Strukturen mit Millionen Einträgen und stabiler Nutzung.
  • Mittlerer Hebel: wachsende Indizes oder Caches, deren Dichte sich ohne Qualitätsverlust reduzieren lässt.
  • Niedriger Hebel: selten geladene Strukturen, geringe Instanzzahl oder bereits dominierende Netzwerk- und Speicherkosten.
  • Warnsignal: Optimierung spart RAM, erhöht aber CPU-Zeit, Latenz, Fehlverteilung oder operativen Aufwand deutlich.
  • Business Gate: erwartete Kapazitäts- und Betriebskostensenkung übersteigt Entwicklung, Test, Migration und langfristige Wartung.

Vor einer Umsetzung sollte das Team deshalb Bytes pro Eintrag, Anzahl der Einträge, Replikationen pro Knoten, Zahl der Knoten und Wachstum messen. Hinzu kommen Spitzenlast, Garbage-Collection- oder Allokationskosten, CPU-Effekt und die Kosten reservierter Kapazität. Erst diese Werte zeigen, ob ein vermeintlich kleiner Overhead ein finanziell relevanter Multiplikator ist.

Fünf Schritte vom Profiling zur belastbaren Änderung

  1. Baseline sichern: realen Speicherverbrauch, Allokationen, Latenz, CPU, Cache-Trefferrate, Verteilungsqualität und Ursprungslast unter repräsentativem Traffic messen.
  2. Layout isolieren: kompaktere Typen und Datenanordnung gegen die bisherige Struktur benchmarken, ohne gleichzeitig den Algorithmus zu verändern.
  3. Algorithmus variieren: Punktzahl oder vergleichbaren Dichteparameter stufenweise reduzieren und Verteilungsfehler, Hotspots sowie Ausfallverhalten messen.
  4. Gesamteffekt prüfen: Speichergewinn gegen CPU, Latenz, Cache-Verhalten, Wartbarkeit und Rollback-Komplexität bewerten.
  5. Nur mit Freigabegates ausrollen: messbare Grenzwerte für Abweichung, Ursprungslast und Fehler festlegen und bei Überschreitung automatisch stoppen.

Diese Trennung ist wichtig, weil zwei gleichzeitig ausgerollte Änderungen eine Ursachenanalyse erschweren. Liefert die neue Version eine schlechtere Verteilung, muss klar sein, ob das Speicherlayout, die reduzierte Punktzahl oder die Migration selbst verantwortlich ist. Ein sauberer Versuchsaufbau schafft zudem belastbare Zahlen für Investitions- und Kapazitätsentscheidungen.

Warum der Hash-Ring nicht abrupt wechseln durfte

Cloudflare musste den Wechsel schrittweise durchführen. Ein harter Austausch der Hash-Ringe hätte viele Anfragen anderen Cache-Servern zugeordnet. Vorhandene Cache-Inhalte wären dann zwar physisch noch vorhanden, für die neue Zuordnung aber weitgehend wertlos gewesen. Die Folge hätte eine starke Belastung der Ursprungssysteme sein können.

Das ist ein allgemeines Migrationsrisiko zustandsbehafteter Systeme: Eine technisch korrekte neue Verteilung kann betrieblich gefährlich sein, wenn sie den warmen Zustand entwertet. Das betrifft nicht nur Content-Caches, sondern auch Sharding, Session-Zuordnung, Suchindizes und verteilte Warteschlangen. Der Rollout muss daher den Übergangszustand als eigenes Systemdesign behandeln.

  • Neue Zuordnung zunächst im Schatten berechnen und Abweichung zur alten Verteilung messen.
  • Kleine Traffic-Anteile oder ausgewählte Knoten migrieren, bevor der globale Ring verändert wird.
  • Cache-Trefferrate, Ursprungslast, Fehlerquote, Latenz und Verteilungsschiefe gemeinsam überwachen.
  • Änderungsrate so begrenzen, dass verdrängte Cache-Inhalte kontrolliert neu aufgebaut werden.
  • Alten Zustand und eindeutigen Rollbackpfad erhalten, bis die neue Verteilung stabil ist.
  • Kapazitätsreserve für den unvermeidbaren temporären Cache-Miss-Anstieg einplanen.

Was Entscheider aus dem Fall mitnehmen sollten

Der Cloudflare-Fall ist kein Argument, jedes System in Rust neu zu schreiben. Die 25-prozentige Layoutverbesserung zeigt den Nutzen präziser Datenstrukturen; die anschließende Reduktion der Hashes zeigt, dass der größere Hebel häufig im Algorithmus und seinen Annahmen liegt. Sprache, Bibliothek und Mathematik wirken zusammen, aber der Business Case entsteht erst durch Skalierung und Messung.

Für DACH-Unternehmen ist die praktikable Reihenfolge deshalb klar: teure, vielfach replizierte Strukturen identifizieren, pro Einheit und im Gesamtsystem messen, Dichteparameter mit Qualitätsgrenzen testen und zustandsbehaftete Änderungen langsam migrieren. Wer nur auf den Speicherwert nach dem Benchmark schaut, übersieht Cache-Wärme, Ursprungslast, Rollback und Wartung. Wer alle vier Dimensionen berücksichtigt, kann aus kleinen technischen Verbesserungen belastbare Kapazitäts- und Kostenvorteile machen.

Quellen

  1. Cloudflare: Saving another 100TB of RAM with math (and Rust)