Active Defrag in Redis: Speicherfragmentierung automatisch im Hintergrund reduzieren
AI generated
SET
TTL
Redis / Performance-Tuning
Active Defrag
Speicherfragmentierung automatisch im Hintergrund reduzieren

used_memory sinkt nach dem Löschen tausender Keys nicht immer im gleichen Maß wie erwartet, weil der zugrunde liegende Speicher-Allocator fragmentiert. Active Defrag ist der Mechanismus, mit dem Redis diese Fragmentierung inkrementell und ohne spürbare Latenzspitzen im laufenden Betrieb wieder abbaut.

10 Min. Lesezeit Active Defrag Fragmentierung jemalloc Allocator Speicherverwaltung

1. Wie fragmentierter Speicher trotz gelöschter Keys entsteht

Redis verwaltet seinen Arbeitsspeicher nicht selbst byteweise, sondern delegiert die eigentliche Speicherallokation an einen Allocator wie jemalloc, der Speicher in Blöcken fester Größenklassen vergibt. Wird ein kleines Objekt angefordert, wird es in eine passende Größenklasse eingeordnet, etwa 64 Byte oder 128 Byte, selbst wenn das eigentliche Objekt kleiner ist. Das beschleunigt Allokation und Freigabe erheblich, führt aber dazu, dass Speicher nicht beliebig fein zusammenhängend verwaltet wird.

Werden nun viele Objekte unterschiedlicher Größe in wechselnder Reihenfolge angelegt und wieder gelöscht, etwa durch ständig wechselnde Session-Daten oder ein Cache mit hoher Umschlagshäufigkeit, entstehen Lücken innerhalb der vom Allocator reservierten Speicherseiten. Diese Lücken sind zwar als frei markiert und stehen für neue Allokationen derselben Größenklasse zur Verfügung, können aber vom Betriebssystem nicht zurückgefordert werden, solange irgendein anderes, noch lebendes Objekt in derselben Speicherseite liegt. Das Resultat ist ein used_memory-Wert, der trotz sinkender tatsächlicher Datenmenge kaum oder gar nicht sinkt.

2. Fragmentierung messen: mem_fragmentation_ratio

Der zentrale Indikator für Speicherfragmentierung ist das Feld mem_fragmentation_ratio in der Ausgabe von INFO Memory. Es beschreibt das Verhältnis zwischen dem tatsächlich vom Betriebssystem an den Redis-Prozess vergebenen Speicher (Resident Set Size) und dem von Redis selbst als logisch benötigt gemeldeten Speicher. Ein Wert von 1.0 bedeutet keine messbare Fragmentierung, ein Wert von 1.5 zeigt, dass Redis fünfzig Prozent mehr physischen Speicher belegt, als für die eigentlichen Daten nötig wäre.

Werte deutlich über 1.5 gelten als Warnsignal und sollten Anlass sein, Active Defrag zu aktivieren oder dessen Tuning zu überprüfen. Interessant ist auch der umgekehrte Fall: Ein Verhältnis deutlich unter 1.0 deutet nicht auf effiziente Speichernutzung hin, sondern meist darauf, dass Redis mehr Speicher benötigt, als das Betriebssystem aktuell bereitstellt, etwa weil ein Teil des Speichers ausgelagert wurde, was ein eigenständiges, ernsteres Problem darstellt.


redis-cli INFO memory | grep -E "used_memory:|used_memory_rss:|mem_fragmentation_ratio"
# used_memory:2147483648
# used_memory_rss:3221225472
# mem_fragmentation_ratio:1.50

3. Wie der Active-Defrag-Mechanismus inkrementell umkopiert

Active Defrag läuft als periodischer Hintergrund-Zyklus innerhalb des Haupt-Threads von Redis, bewusst so gestaltet, dass er sich in kleine, unterbrechbare Arbeitsschritte aufteilt, statt den Server für eine längere zusammenhängende Zeitspanne zu blockieren. In jedem Zyklus untersucht Redis eine begrenzte Anzahl von Keys, prüft anhand interner Allocator-Statistiken, ob das jeweils zugrunde liegende Speicherobjekt stark fragmentiert vorliegt, und kopiert es bei Bedarf in eine frisch allozierte, kompaktere Speicherstelle um.

Nach dem Umkopieren wird der alte, fragmentierte Speicherbereich freigegeben, was dem Allocator ermöglicht, zusammenhängende Speicherseiten wieder vollständig frei zu bekommen und letztlich an das Betriebssystem zurückzugeben. Weil dieser Prozess in vielen kleinen Schritten abläuft und zwischen den Schritten immer wieder die Kontrolle an die reguleare Command-Verarbeitung zurückgibt, bleibt die Latenz für normale Client-Requests während des Defragmentierens praktisch unverändert, ganz im Gegensatz zu einem hypothetischen einmaligen, vollständigen Kompaktierungslauf.

4. Active Defrag aktivieren und Voraussetzungen

Active Defrag ist standardmäßig deaktiviert und muss über activedefrag yes explizit eingeschaltet werden, entweder in der redis.conf oder zur Laufzeit über CONFIG SET. Eine wichtige technische Voraussetzung: Der Mechanismus funktioniert nur zuverlässig mit jemalloc als Speicher-Allocator, weil er auf dessen interne Fragmentierungs-Statistiken pro Speicherseite angewiesen ist. Wird Redis mit libc als Allocator kompiliert, was in manchen minimalen Container-Images vorkommt, steht Active Defrag nicht zur Verfügung.

Wer unsicher ist, welcher Allocator aktiv ist, findet die Information direkt in der Ausgabe von INFO Server unter dem Feld mem_allocator. Offizielle Redis-Docker-Images verwenden standardmäßig jemalloc, sodass Active Defrag dort ohne zusätzliche Maßnahmen einsatzbereit ist, sobald es konfiguriert wird.


# Allocator prüfen
redis-cli INFO server | grep mem_allocator
# mem_allocator:jemalloc-5.3.0

# Active Defrag zur Laufzeit aktivieren
redis-cli CONFIG SET activedefrag yes

# Dauerhaft in redis.conf
activedefrag yes

5. Schwellenwerte: ab wann Active Defrag eingreift

Active Defrag arbeitet nicht kontinuierlich, sondern erst, sobald die gemessene Fragmentierung bestimmte konfigurierbare Schwellenwerte überschreitet. active-defrag-ignore-bytes legt eine absolute Mindestmenge an fragmentiertem Speicher fest, unterhalb derer sich ein Defrag-Lauf noch nicht lohnt, standardmäßig 100 Megabyte. active-defrag-threshold-lower definiert den prozentualen Fragmentierungsgrad, ab dem Active Defrag überhaupt zu arbeiten beginnt, standardmäßig zehn Prozent.

active-defrag-threshold-upper legt fest, ab welchem Fragmentierungsgrad Redis mit maximaler konfigurierter Intensität arbeitet, standardmäßig 100 Prozent. Zwischen diesen beiden Schwellenwerten skaliert die Aggressivität des Defrag-Prozesses linear: Je höher die gemessene Fragmentierung, desto mehr CPU-Zeit investiert Redis pro Zyklus in das Umkopieren, bis die obere Grenze erreicht ist und die konfigurierte Maximalintensität greift.


# Schwellenwerte anpassen
redis-cli CONFIG SET active-defrag-ignore-bytes 50mb
redis-cli CONFIG SET active-defrag-threshold-lower 5
redis-cli CONFIG SET active-defrag-threshold-upper 80

6. Tuning der CPU-Grenzen für den Defrag-Prozess

Zwei weitere Parameter steuern direkt, wie viel CPU-Zeit Active Defrag pro Sekunde verbrauchen darf: active-defrag-cycle-min legt die Mindest-CPU-Auslastung fest, die der Defrag-Prozess selbst bei niedriger Fragmentierung einsetzt, standardmäßig ein Prozent. active-defrag-cycle-max begrenzt die maximale CPU-Auslastung bei sehr hoher Fragmentierung, standardmäßig 25 Prozent. Diese Grenzen bestimmen den Kompromiss zwischen schneller Aufräumung und der CPU-Last, die für die eigentliche Command-Verarbeitung übrig bleibt.

In Umgebungen mit knapper CPU-Kapazität, etwa kleineren Cloud-Instanzen, die ohnehin nahe ihrer CPU-Grenze arbeiten, empfiehlt sich ein niedrigerer active-defrag-cycle-max-Wert, um zu vermeiden, dass Defrag-Aktivität mit dem eigentlichen Anwendungs-Traffic um CPU-Zeit konkurriert. Auf großzügig dimensionierter Hardware mit viel freier CPU-Reserve kann ein höherer Wert die Fragmentierung deutlich schneller abbauen, ohne dass produktive Requests darunter spürbar leiden.


# Konservatives Tuning für CPU-knappe Umgebungen
redis-cli CONFIG SET active-defrag-cycle-min 1
redis-cli CONFIG SET active-defrag-cycle-max 15

# Aggressiveres Tuning bei reichlich freier CPU-Kapazität
redis-cli CONFIG SET active-defrag-cycle-min 5
redis-cli CONFIG SET active-defrag-cycle-max 50

7. Wann sich Active Defrag lohnt und wann nicht

Active Defrag lohnt sich besonders bei Workloads mit hoher Schreib- und Löschfrequenz auf Keys unterschiedlicher Größe, etwa Session-Speicher mit ständig wechselnden Nutzern, Rate-Limiting-Zählern mit kurzer Lebensdauer, oder Cache-Ebenen mit häufiger Invalidierung. Bei überwiegend statischen Datenbeständen, die selten geändert werden, fällt kaum relevante Fragmentierung an, sodass der zusätzliche CPU-Verbrauch durch Active Defrag keinen messbaren Nutzen bringt.

In einem Magento-Setup mit Redis als Session- und Full-Page-Cache-Backend ist die Schreib- und Löschfrequenz typischerweise hoch genug, um von Active Defrag zu profitieren, insbesondere während verkaufsstarker Zeiten mit vielen parallelen Sessions und häufiger Cache-Invalidierung nach Preis- oder Bestandsänderungen. Ein aktiviertes Active Defrag mit moderatem Tuning verhindert dort, dass der Speicherverbrauch über Wochen hinweg kontinuierlich wächst, ohne dass die eigentliche Datenmenge im gleichen Maß zunimmt.

8. Grenzen von Active Defrag und alternative Maßnahmen

Active Defrag reduziert Fragmentierung, verhindert sie aber nicht grundsätzlich, und bei extrem hoher Schreiblast kann die Fragmentierung schneller entstehen, als der Prozess sie mit den konfigurierten CPU-Grenzen wieder abbauen kann. In solchen Fällen bleibt mem_fragmentation_ratio dauerhaft erhöht, selbst mit aktiviertem Active Defrag, und ein höheres active-defrag-cycle-max ist dann oft der wirksamste nächste Schritt, sofern die verfügbare CPU-Kapazität das zulässt.

Für Fälle, in denen Active Defrag nicht ausreicht oder aus Kompatibilitätsgründen nicht verfügbar ist, etwa bei einem Allocator ungleich jemalloc, bleibt als letztes Mittel ein manueller, kontrollierter Neustart der Redis-Instanz mit anschließendem Laden aus einem RDB-Snapshot oder AOF-Log, wodurch der gesamte Speicher frisch und ohne jede Fragmentierung neu aufgebaut wird. Das ist allerdings mit einer kurzen Downtime verbunden und sollte nur als geplante Wartungsmassnahme eingesetzt werden, nicht als Ersatz für laufendes Defrag-Tuning.

9. Praxis-Fazit: moderates Tuning als guter Startpunkt

Für die meisten produktiven Redis-Instanzen mit jemalloc als Allocator ist die Aktivierung von Active Defrag mit den Standardwerten bereits ein sinnvoller erster Schritt, der ohne spürbare Latenz-Nebenwirkungen kontinuierlich für geringere Speicherfragmentierung sorgt. Regelmäßiges Monitoring von mem_fragmentation_ratio über INFO Memory zeigt zuverlässig, ob die Standardwerte ausreichen oder ob ein Nachjustieren der CPU-Grenzen nötig ist.

Wer nach der Aktivierung weiterhin dauerhaft hohe Fragmentierungswerte beobachtet, sollte zunächst active-defrag-cycle-max schrittweise erhöhen, bevor tiefergehende Maßnahmen wie ein geplanter Neustart in Betracht gezogen werden. Die Kombination aus korrekt konfiguriertem jemalloc, aktivem Defrag und regelmäßigem Monitoring deckt die große Mehrheit der Fragmentierungsprobleme in produktiven Redis-Umgebungen zuverlässig ab.

Parameter Bedeutung Standardwert Empfehlung
activedefrag Aktiviert den Mechanismus no yes bei jemalloc-basierten Instanzen
active-defrag-threshold-lower Fragmentierung, ab der Defrag startet 10 Prozent 5-10 Prozent je nach Workload
active-defrag-threshold-upper Fragmentierung für maximale Intensität 100 Prozent 60-80 Prozent bei starker Fragmentierung
active-defrag-cycle-min Minimale CPU-Auslastung 1 Prozent 1 Prozent, selten erhöhen
active-defrag-cycle-max Maximale CPU-Auslastung 25 Prozent 15-50 Prozent je nach freier CPU-Kapazität

Mironsoft

Cache-Layer-Setup und Magento-Redis-Integration

Magento-Cache, der nicht richtig greift oder falsch konfiguriert ist?

Wir richten Redis als Cache- und Session-Backend für Magento sauber ein, tunen Speicherverbrauch und Eviction-Strategien und sorgen dafür, dass Full Page Cache und Session-Storage zuverlässig zusammenspielen.

Redis-Setup

Cache-, Session- und FPC-Backend produktionsreif für Magento konfigurieren.

Memory-Tuning

Speicherverbrauch und Eviction-Policies auf die tatsächliche Shop-Last abstimmen.

High-Availability-Setup

Redis Sentinel oder Cluster für ausfallsichere Magento-Umgebungen einrichten.

10. Zusammenfassung

Active Defrag

Allocator-bedingte Lücken

Größenklassen im Allocator hinterlassen freie, aber unzusammenhängende Speicherlücken.

Inkrementelles Umkopieren

Active Defrag kopiert fragmentierte Objekte in kleinen Schritten um, ohne den Server zu blockieren.

Nur mit jemalloc verfügbar

Der Mechanismus benötigt die internen Fragmentierungs-Statistiken des jemalloc-Allocators.

CPU-Grenzen bewusst setzen

active-defrag-cycle-min und -max bestimmen den Kompromiss zwischen Aufräumtempo und CPU-Last.

11. FAQ: Active Defrag

1Warum sinkt used_memory nicht, obwohl ich viele Keys gelöscht habe?
Das liegt an der Speicherverwaltung des Allocators, der Speicher in festen Größenklassen vergibt. Freie Lücken innerhalb belegter Speicherseiten können nicht ans Betriebssystem zurückgegeben werden, solange dort noch andere lebende Objekte liegen, wodurch used_memory trotz weniger Daten hoch bleibt.
2Was bedeutet ein mem_fragmentation_ratio von 1.5 konkret?
Es bedeutet, dass der Redis-Prozess fünfzig Prozent mehr physischen Speicher vom Betriebssystem belegt, als für die aktuell gespeicherten Daten logisch nötig wäre. Ein Wert nahe 1.0 zeigt geringe Fragmentierung, deutlich höhere Werte signalisieren Handlungsbedarf.
3Blockiert Active Defrag den Redis-Server während des Umkopierens?
Nein, das ist der zentrale Designgrund für den Mechanismus. Active Defrag arbeitet in vielen kleinen Schritten und gibt die Kontrolle zwischen den Schritten immer wieder an die normale Command-Verarbeitung zurück, sodass keine spürbaren Latenzspitzen entstehen.
4Funktioniert Active Defrag mit jedem Speicher-Allocator?
Nein, der Mechanismus ist auf jemalloc angewiesen, weil er dessen interne Fragmentierungs-Statistiken pro Speicherseite nutzt. Mit libc als Allocator, wie es in manchen minimalen Container-Images vorkommt, steht Active Defrag nicht zur Verfügung.
5Wie aktiviere ich Active Defrag ohne einen Neustart des Servers?
Über redis-cli CONFIG SET activedefrag yes lässt sich der Mechanismus zur Laufzeit aktivieren, ohne den Server neu starten zu müssen. Für eine dauerhafte Aktivierung sollte die Option zusätzlich in der redis.conf gesetzt werden.
6Welcher Parameter beeinflusst am stärksten, wie schnell Fragmentierung abgebaut wird?
active-defrag-cycle-max hat den größten Einfluss, da er die maximale CPU-Zeit begrenzt, die Active Defrag bei hoher Fragmentierung pro Sekunde einsetzen darf. Ein höherer Wert beschleunigt den Abbau, erhöht aber auch die CPU-Last durch den Defrag-Prozess selbst.
7Kann Active Defrag die Fragmentierung vollständig auf null reduzieren?
In der Praxis selten vollständig, da laufender Schreib- und Löschbetrieb kontinuierlich neue kleinere Fragmentierung erzeugt. Ziel ist ein stabiler, niedriger Fragmentierungsgrad im laufenden Betrieb, nicht ein einmaliger Nullwert.
8Ist Active Defrag für eine Magento-Session-Redis-Instanz sinnvoll?
Ja, gerade Session-Speicher mit ständig wechselnden Nutzern und kurzlebigen Keys erzeugt typischerweise viel Fragmentierung. Active Defrag mit moderatem Tuning verhindert dort ein unkontrolliertes Wachstum des Speicherverbrauchs über Wochen hinweg.
9Was passiert, wenn die Fragmentierung schneller entsteht, als Active Defrag sie abbauen kann?
Dann bleibt mem_fragmentation_ratio dauerhaft erhöht, selbst mit aktiviertem Mechanismus. In diesem Fall hilft meist eine Erhöhung von active-defrag-cycle-max, sofern ausreichend freie CPU-Kapazität vorhanden ist, andernfalls bleibt ein geplanter Neustart mit Neuladen aus RDB oder AOF die letzte Option.
10Verbraucht Active Defrag zusätzlichen Speicher während des Umkopierens?
Kurzzeitig ja, da ein Objekt erst in eine neue Speicherstelle kopiert werden muss, bevor der alte Speicherbereich freigegeben wird. Dieser zusätzliche Bedarf ist aber auf die Größe des jeweils gerade bearbeiteten Objekts begrenzt und für den Gesamtspeicherverbrauch praktisch vernachlässigbar.