Transparente riesige Seiten und alternative Speicherzuordnungen: Eine warnende Geschichte

Kürzlich wurde unser Team für die Entwicklung der Zuverlässigkeit der Site über den Speicherdruck einiger unserer Redis-Instanzen, die sehr kleine Arbeitssätze haben, alarmiert *1. Als wir anfingen, uns mit dem Problem zu beschäftigen, wurde klar, dass es Probleme beim Freigeben von Speicher nach der anfänglichen Zuweisung gab, da eine relativ kleine Anzahl von Schlüsseln, aber eine vergleichsweise große Menge an Speicher von `Redis-Server`-Prozessen zugewiesen wurde. Obwohl es anfangs wie ein Leck aussah, war das Problem tatsächlich ein Problem zwischen einem alternativen Speicherzuordner und transparenten riesigen Seiten.

Hintergrund
Wenn Sie bereits wissen, was transparente riesige Seiten sind und wie `madvise(2)` funktioniert, können Sie diesen Abschnitt überfliegen. Für diejenigen, die dies nicht tun, lesen Sie weiter.

Warte mal – was sind Seiten?
Eine Seite ist ein Speicherblock, den ein Prozessor zur Verwendung zuweist, normalerweise in Blöcken von 4 KB. Wenn eine Anwendung auf virtuellen Speicher zugreifen muss, muss sie ihre virtuelle Speicheradresse in die physikalische Adresse der Seite auflösen. Der Vermittler zwischen physikalischen Adressen und dem abgebildeten virtuellen Speicher wird als Seitentabelle bezeichnet. Für jedes 1 GB Speicher, der in 4-KB-Seiten zugewiesen wird, gibt es 262.144 Einträge in der Seitentabelle – und natürlich dauert die Übersetzung von Adressen umso länger, je mehr Seiten in der Seitentabelle sind.

Der virtuelle Speicher macht die Seitenverwaltung noch komplizierter, indem er es Anwendungen ermöglicht, Seiten zu adressieren, die nicht im Hauptspeicher vorhanden sind. In diesem Fall wird ein Fehler verursacht, aber der Kernel weiß, wie er mit Fehlern im virtuellen Speicher umgeht und zieht Seiten aus dem sekundären Speicher (z. B. lokaler Rost oder Flash, NAS usw.), ohne dass die Anwendung den Fehler erkennt.

Okay, was sind (transparente) riesige Seiten?
Riesige Seiten sind genau das, wonach sie klingen – Seiten, die viel größer als 4 KB sind. Sie reduzieren die Anzahl der Einträge in der Seitentabelle und reduzieren dadurch die Anzahl der Tabellensuchvorgänge, die erforderlich sind, um herauszufinden, wo ein bestimmter Bereich des virtuellen Speichers abgebildet ist.

Linux implementiert Unterstützung für riesige Seiten *2, die Änderungen in der Software erfordert, die im Benutzerbereich ausgeführt wird, um diese potenziellen Leistungsvorteile zu nutzen. Sie sind in zwei Varianten erhältlich (2 MB und 1 GB – die verfügbaren Größen hängen von der verwendeten CPU ab) und müssen beim Booten über Parameter konfiguriert werden, die an den Kernel übergeben werden.

Die Implementierung von riesigen Seiten selbst ist ziemlich langweilig, also sprechen wir über transparente riesige Seiten. Hier beginnt der Spaß.

User-Space-Software musste traditionell ihre eigene Unterstützung für riesige Seiten implementieren, aber dies ist schwierig und erfordert viele Tests, um effektiv genutzt zu werden. Anstatt dass diese User-Space-Anwendungen ihre Interaktionen mit riesigen Seiten verwalten, ermöglichen transparente riesige Seiten Anwendungen, riesige Seiten zu verwenden…. na ja, transparent. Dies manifestiert sich darin, dass der Kernel eine zusätzliche Speicherverwaltung durchführt, die zugewiesen, markiert und anschließend mit (in unserem Fall) 2 MB darunterliegenden Seiten freigegeben wird.

Das klingt alles nützlich, aber es stellt sich heraus, dass einige alternative Speicherzuweisungen nicht gut mit transparenten riesigen Seiten spielen.

About the author

Leave a Reply

Your email address will not be published.