3.7. memory

Das memory-Subsystem erstellt automatische Berichte zu Speicherressourcen, die von den Aufgaben in einer Kontrollgruppe verwendet werden und setzt Grenzwerte für den Speicherverbrauch durch diese Aufgaben fest.
memory.stat
zeigt eine größere Bandbreite von Speicher-Statistiken an, wie in der folgenden Tabelle beschrieben:

Tabelle 3.1. Werte, die von memory.stat angezeigt werden

Statistik Beschreibung
cache Seiten-Cache, inklusive tmpfs (shmem), in Bytes
rss anonymer und Swap-Cache-Speicher, exklusive tmpfs (shmem), in Bytes
mapped_file Größe von Memory-Mapped Dateien, inklusive tmpfs (shmem), in Bytes
pgpgin Anzahl der in den Seitenspeicher geschriebenen Seiten
pgpgout Anzahl der aus dem Seitenspeicher gelesenen Seiten
swap Swap-Verwendung, in Bytes
active_anon anonymer und Swap-Cache-Speicher auf aktiver least-recently-used (LRU) Liste, inklusive tmpfs (shmem), in Bytes
inactive_anon anonymer und Swap-Cache-Speicher auf inaktiver LRU-Liste, inklusive tmpfs (shmem), in Bytes
active_file Dateigestützter Speicher auf aktiver LRU-Liste, in Bytes
inactive_file Dateigestützter Speicher auf inaktiver LRU-Liste, in Bytes
unevictable Speicher, der nicht zurückgefordert werden kann, in Bytes
hierarchical_memory_limit Speichergrenze für die Hierarchie, welche die memory-Kontrollgruppe enthält, in Bytes
hierarchical_memsw_limit Grenze für Speicher plus Swap für die Hierarchie, welche die memory-Kontrollgruppe enthält, in Bytes
Zusätzlich verfügt jede dieser Dateien (mit Ausnahme von hierarchical_memory_limit und hierarchical_memsw_limit) über ein Gegenstück mit vorangestelltem total_, das nicht nur über die Kontrollgruppe berichtet, sondern auch über alle zugehörigen Untergruppen. Zum Beispiel zeigt swap den Swap-Verbrauch einer Kontrollgruppe an, und total_swap zeigt den gesamten Swap-Verbrauch einer Kontrollgruppe einschließlich aller untergeordneten Gruppen an.
Wenn Sie die von memory.stat angezeigten Werte interpretieren, beachten Sie, wie die verschiedenen Statistiken zusammenhängen:
  • active_anon + inactive_anon = anonymer Speicher + Datei-Cache für tmpfs + Swap-Cache
    Demzufolge gilt: active_anon + inactive_anonrss, da rss nicht tmpfs einschließt.
  • active_file + inactive_file = Cache - Größe von tmpfs
memory.usage_in_bytes
zeigt den aktuellen gesamten Speicherverbrauch von Prozessen in der Kontrollgruppe an (in Bytes).
memory.memsw.usage_in_bytes
zeigt die Summe des aktuellen Speicherverbrauchs plus Swap-Space-Verbrauch von Prozessen in der Kontrollgruppe an (in Bytes).
memory.max_usage_in_bytes
zeigt den maximalen Speicherverbrauch von Prozessen in der Kontrollgruppe an (in Bytes).
memory.memsw.max_usage_in_bytes
zeigt den maximalen Swap- und Speicherverbrauch von Prozessen in der Kontrollgruppe an (in Bytes).
memory.limit_in_bytes
legt die maximale Menge an Benutzerspeicher fest (inklusive Datei-Cache). Falls keine Einheiten angegeben werden, wird dieser Wert als Bytes interpretiert. Es ist jedoch möglich, Suffixe zur Darstellung von größeren Einheiten zu verwenden — k oder K für Kilobytes, m oder M für Megabytes und g oder G für Gigabytes.
Sie können memory.limit_in_bytes nicht dazu verwenden, um die Root-Kontrollgruppe zu begrenzen; nur Gruppen an niedrigerer Stelle in der Hierarchie können Sie Werte zuordnen.
Schreiben Sie -1 in memory.limit_in_bytes, um jegliche vorhandene Grenzen zu entfernen.
memory.memsw.limit_in_bytes
legt die maximale Menge für die Summe von Speicher und Swap-Space fest. Falls keine Einheiten angegeben werden, wird dieser Wert als Bytes interpretiert. Es ist jedoch möglich, Suffixe zur Darstellung von größeren Einheiten zu verwenden — k oder K für Kilobytes, m oder M für Megabytes und g oder G für Gigabytes.
Sie können memory.memsw.limit_in_bytes nicht dazu verwenden, um die Root-Kontrollgruppe zu begrenzen; nur Gruppen an niedrigerer Stelle in der Hierarchie können Sie Werte zuordnen.
Schreiben Sie -1 in memory.memsw.limit_in_bytes, um jegliche vorhandene Grenzen zu entfernen.
memory.failcnt
zeigt an, wie oft der in memory.limit_in_bytes festgelegte Wert für die Speichergrenze erreicht wurde.
memory.memsw.failcnt
zeigt an, wie oft der in memory.memsw.limit_in_bytes festgelegte Grenzwert für die Summe von Speicher und Swap-Space erreicht wurde.
memory.force_empty
wenn auf 0 gesetzt, wird der Speicher von allen Seiten gelöscht, die von Aufgaben in dieser Kontrollgruppe verwendet werden. Diese Schnittstelle kann nur benutzt werden, wenn die Kontrollgruppe keine Aufgaben besitzt. Falls kein Speicher freigesetzt werden kann, wird es in eine übergeordnete Kontrollgruppe verschoben, falls möglich. Verwenden Sie memory.force_empty, bevor Sie eine Kontrollgruppe verschieben, um das Verschieben von nicht mehr verwendeten Seiten-Caches auf die übergeordnete Kontrollgruppe zu vermeiden.
memory.swappiness
spezifiziert die Tendenz des Kernels, Prozessspeicher, der von Aufgaben in dieser Kontrollgruppe beansprucht wird, aus dem Speicher auszulagern (Swap), anstatt die Seiten vom Seiten-Cache zurückzufordern. Dies entspricht der Tendenz, wie sie auch für das gesamte System in /proc/sys/vm/swappiness definiert wird und wird genauso berechnet. Der Standardwert ist 60. Werte unter 60 verringern die Tendenz des Kernels, Prozessspeicher auszulagern. Werte über 60 erhöhen die Tendenz des Kernels, Prozessspeicher auszulagern und bei Werten größer als 100 beginnt der Kernel, Seiten auszulagern, die Teil des Adressraums der Prozesse in dieser Kontrollgruppe sind.
Beachten Sie, dass der Wert 0 nicht verhindert, dass Prozessspeicher ausgelagert wird; die Auslagerung kann nach wie vor erfolgen, wenn Systemspeicher knapp wird, da die globale Logik zur Verwaltung des virtuellen Speichers den Wert der Kontrollgruppe nicht liest. Um Seiten vollständig zu sperren, verwenden Sie mlock() anstelle von Kontrollgruppen.
Sie können Tendenz zur Auslagerung (Swappiness) für die folgenden Gruppen nicht ändern:
  • die Root-Kontrollgruppe, welche die Swappiness-Angabe aus /proc/sys/vm/swappiness verwendet.
  • eine Kontrollgruppe, die über untergeordnete Gruppen verfügt.
memory.use_hierarchy
beinhaltet ein Flag (0 oder 1), das definiert, ob Speicherverbrauch in einer Hierarchie von Kontrollgruppen berücksichtigt werden soll. Falls aktiviert (1), fordert der Speicher-Controller Speicher von untergeordneten Prozessen sowie von solchen Prozessen, die ihre Speichergrenze überschreiten, zurück. Standardmäßig (0) fordert der Controller keinen Speicher von untergeordneten Aufgaben zurück.