Facebook hat Patches veröffentlicht, die den Slab-Speichercontroller unter Linux verbessern

Romano Gushchin (ein Software-Ingenieur von Facebook) meldete eine Reihe von Patches für die Speicherverwaltungsanwendung (einen Speichercontroller) des Slab-Treibers auf der Mailingliste für Linux-Kernel-Entwickler an.

Der neue Treiber zeichnet sich dadurch aus , dass er die Slab-Verwaltung von der Ebene der Speicherseiten auf die Ebene der Kernel-Objekte verlagert. Dadurch wird es möglich, Slab-Seiten über verschiedene C-Gruppen hinweg gemeinsam zu nutzen, anstatt für jede C-Gruppe separate Slab-Caches zuzuweisen.

Roman fand einen "sehr schwerwiegenden Fehler" in der vorhandenen Plattenspeichersteuerung, der heutzutage bei cgroups zu einer geringen Auslastung führt.

„Der wahre Grund, warum das vorhandene Design zu einer geringen Auslastung der Platten führt, ist einfach: Platten-Seiten werden ausschließlich von einem Speicherpool verwendet.

Wenn nur wenige Zuordnungen einer bestimmten Größe von einer cgroup vorgenommen wurden oder wenn nach dem Entfernen der cgroup noch einige aktive Objekte vorhanden sind oder die cgroup eine einzelne Thread-Anwendung enthält, die kaum Kernelobjekte zuweist, jedoch jedes Mal eine neue CPU: In all diesen Fällen ist die resultierende Plattenauslastung sehr gering.

Wenn die kmem-Abrechnung deaktiviert ist, kann der Kernel freien Speicherplatz auf Deckblattseiten für andere Zuordnungen verwenden. «

Der von Romano Gushchin im letzten Jahr vorgeschlagene Slab-Speichercontroller war vielversprechend, da er eine höhere Effizienz bei der Slab-Nutzung ermöglicht , die Größe des für Slab verwendeten Speichers um 30-45 % reduziert und den gesamten Speicherverbrauch des Kerns deutlich verringert.

Darüber hinaus haben die implementierten Patches ergeben , dass Facebook den Code bereits produktiv auf seinen Servern einsetzt und dadurch unter anderem ~650-700 MB+ für Front-End-Webserver, Datenbank-Caching und DNS-Server einspart .

Die Reduzierung der Anzahl nicht verschiebbarer Slabs wirkt sich ebenfalls positiv auf die Speicherfragmentierung aus. Der neue Speichercontroller vereinfacht den Code zur Slab-Verwaltung erheblich und macht komplexe Algorithmen zum dynamischen Erstellen und Löschen von Slab-Caches für jede C-Gruppe überflüssig.

Alle cgroups für den Speicher in der neuen Implementierung verwenden einen gemeinsamen Satz von Slab-Caches, und die Lebensdauer von Slab-Caches ist nicht mehr an die Lebensdauer der durch cgroup festgelegten Speicherbeschränkungen gebunden.

Die genauere Ressourcenabrechnung, die in der neuen Plattensteuerung implementiert ist, sollte theoretisch die CPU stärker belasten, aber in der Praxis erwiesen sich die Unterschiede als vernachlässigbar.

Insbesondere wurde der neue Slab-Controller mehrere Monate lang auf Live-Facebook-Servern unter verschiedenen Lastbedingungen eingesetzt, und bisher wurden keine signifikanten Regressionen festgestellt.

Der Patch enthält einige halbunabhängige Teile, die auch außerhalb des Speichercontrollers der Platte verwendet werden können:

  • Die Subpage Load API, mit der in Zukunft andere Objekte gezählt werden können, die nicht die Größe einer Seite haben, z. B. Percpu-Zuordnungen
  • Die mem_cgroup_ptr-API, bei der Zeiger auf ein memcg gezählt werden, kann zur effizienten Reparatur anderer Objekte, z. B. des Seitencaches, wiederverwendet werden.

Gleichzeitig ist eine deutliche Verringerung des Speicherverbrauchs zu verzeichnen : Auf einigen Rechnern konnten bis zu 1 GB Speicher eingespart werden, dieser Wert hängt jedoch stark von der Art der Last, der Gesamtgröße des Arbeitsspeichers, der CPU-Leistung und den Eigenschaften der Speichernutzung ab.

Anstatt für jede Speicher-Gruppe einen separaten Satz von kmem_caches zu erstellen, werden zwei globale Sätze verwendet: der Stammsatz für ungezählte und die Stammgruppen-Gruppenzuweisungen und der zweite Satz für alle anderen Zuweisungen. Dies ermöglicht eine vereinfachte Lebensdauerverwaltung einzelner kmem_caches.

Wenn Sie schließlich mehr über die neuen 19 Patches erfahren möchten, finden Sie diese auf der Mailingliste des Kernels.


Als bevorzugte Quelle in Google hinzufügen