Beim Ausführen erhalten cat /proc/meminfo
Sie diese 3 Werte oben:
MemTotal: 6291456 kB
MemFree: 4038976 kB
Cached: 1477948 kB
Soweit ich weiß, handelt es sich bei dem Wert "Cached" um vom Linux-System erstellte Festplatten-Caches, die sofort freigegeben werden, wenn eine Anwendung mehr RAM benötigt. Daher wird Linux niemals der Arbeitsspeicher ausgehen, bis MemFree und Cached auf Null stehen.
Leider wird "MemAvailable" von / proc / meminfo nicht gemeldet, wahrscheinlich weil es auf einem virtuellen Server ausgeführt wird. (Kernel-Version ist 4.4)
Für alle praktischen Zwecke ist der für Anwendungen verfügbare RAM MemFree + Cached.
Ist diese Ansicht richtig?
MemAvailable
, es wurde in 3.14 hinzugefügt.Antworten:
Diese Ansicht kann in einer Reihe von Fällen aus der Praxis sehr irreführend sein.
Der Kernel liefert jetzt eine Schätzung für den verfügbaren Speicher im
MemAvailable
Feld. Dieser Wert unterscheidet sich erheblich vonMemFree + Cached
.1. MemAvailable Details
Wie oben erwähnt, können tmpfs und anderer
Shmem
Speicher nicht freigegeben, sondern nur zum Auslagern verschoben werden.Cached
In/proc/meminfo
kann sehr irreführend sein, da dieser austauschbareShmem
Speicher enthalten ist. Wenn Sie zu viele Dateien in einem tmpfs haben, könnte dies viel Speicherplatz beanspruchen :-).Shmem
kann auch einige Grafikspeicherzuordnungen enthalten , die sehr groß sein können.MemAvailable
Enthält absichtlich keinen austauschbaren Speicher. Zu viel Austausch kann zu langen Verzögerungen führen. Möglicherweise haben Sie sich sogar dafür entschieden, ohne Swap Space zu arbeiten, oder nur eine relativ begrenzte Menge zugelassen.Ich musste noch einmal überprüfen, wie es
MemAvailable
funktioniert. Auf den ersten Blick schien der Code diese Unterscheidung nicht zu erwähnen.Ich fand jedoch, dass es korrekt
Shmem
als "benutzter" Speicher behandelt wird. Ich habe mehrere 1 GB-Dateien in einem tmpfs erstellt. Jede Erhöhung um 1 GB wird um 1 GBShmem
verringertMemAvailable
. Die Größe der "Datei-LRU-Listen" enthält also keinen gemeinsam genutzten Speicher oder einen anderen austauschbaren Speicher. (Ich habe festgestellt, dass diese Seitenzahlen auch im Code verwendet werden, der das "Dirty Limit" berechnet .)Bei dieser
MemAvailable
Berechnung wird auch davon ausgegangen, dass Sie mindestens genügend Datei-Cache behalten möchten, um dem "niedrigen Wasserzeichen" des Kernels zu entsprechen. Oder die Hälfte des aktuellen Caches - je nachdem, welcher Wert kleiner ist. (Dies gilt auch für wiederverwendbare Platten). Das "niedrige Wasserzeichen" des Kernels kann optimiert werden, beträgt jedoch normalerweise etwa 2% des System-RAM . Wenn Sie also nur eine grobe Schätzung wünschen, können Sie diesen Teil ignorieren :-).Wenn Sie
firefox
mit ca. 100 MB Programmcode im Seitencache arbeiten, möchten Sie diese 100 MB im Allgemeinen im RAM behalten :-). Andernfalls treten im besten Fall Verzögerungen auf, im schlimmsten Fall verbringt das System seine gesamte Zeit damit, zwischen verschiedenen Anwendungen zu wechseln . ErlaubtMemAvailable
also einen kleinen Prozentsatz RAM dafür. Es könnte nicht genug erlauben, oder es könnte zu großzügig sein. "Die Auswirkungen dieser Faktoren variieren von System zu System."Für viele PC-Workloads ist der Punkt "Viele Dateien" möglicherweise nicht relevant. Trotzdem habe ich derzeit 500 MB wiederverwendbaren Plattenspeicher auf meinem Laptop (von 8 GB RAM). Dies liegt an
ext4_inode_cache
(über 300.000 Objekten). Es ist passiert, weil ich kürzlich das gesamte Dateisystem scannen musste, um herauszufinden, was meinen Speicherplatz belegt :-). Ich habe den Befehl verwendetdf -x / | sort -n
, aber z. B. würde Gnome Disk Usage Analyzer dasselbe tun.2. [Bearbeiten] Speicher in Kontrollgruppen
Sogenannte „Linux - Container“ sind aufgebaut aus
namespaces
,cgroups
und verschiedene andere Funktionen je nach Geschmack :-). Sie bieten möglicherweise eine Umgebung, die überzeugend genug ist, um so etwas wie ein vollständiges Linux-System auszuführen. Hosting-Services können solche Container erstellen und als "virtuelle Server" verkaufen :-).Hosting-Server können auch "virtuelle Server" mit Funktionen erstellen, die nicht in Mainline-Linux enthalten sind. OpenVZ- Container datieren Hauptgruppen-Gruppen um zwei Jahre vor und können "Beancounters" verwenden, um den Speicher zu begrenzen. Sie können also nicht genau verstehen, wie diese Speicherbeschränkungen funktionieren, wenn Sie nur Dokumente lesen oder Fragen zum Linux-Kernel stellen.
cat /proc/user_beancounters
zeigt die aktuelle Nutzung und Grenzen.vzubc
präsentiert es in einem etwas freundlicheren Format. Die Hauptseite von Beancounters dokumentiert die Zeilennamen .Zu den Kontrollgruppen gehört die Möglichkeit, Speicherbeschränkungen für die darin enthaltenen Prozesse festzulegen. Wenn Sie Ihre Anwendung in einer solchen Gruppe ausführen, steht der Anwendung nicht der gesamte Systemspeicher zur Verfügung :-). Wie können wir in diesem Fall den verfügbaren Speicher sehen?
Die Schnittstelle hierfür unterscheidet sich in vielerlei Hinsicht, je nachdem, ob Sie cgroup-v1 oder cgroup-v2 verwenden .
Meine Laptop-Installation verwendet cgroup-v1. Ich kann laufen
cat /sys/fs/cgroup/memory/memory.stat
. Die Datei zeigt verschiedene Felder einschließlichtotal_rss
,total_cache
,total_shmem
. shmem, einschließlich tmpfs, zählt zu den Speichergrenzen. Ich denke, Sie könnentotal_rss
als inverses Äquivalent von betrachtenMemFree
. Und es gibt auch die Dateimemory.kmem.usage_in_bytes
, die den Kernelspeicher einschließlich der Platten darstellt. (Ich gehe davon aus, dassmemory.kmem.
auchmemory.kmem.tcp.
zukünftige Erweiterungen enthalten sind, obwohl dies nicht explizit dokumentiert ist). Es gibt keine separaten Zähler zum Anzeigen des wiedergewinnbaren Plattenspeichers. Wird das Dokument für cgroup-v1 sagt die Speichergrenzen trifft nicht auslösen reclaim jeder Platte Speicher. (Das Dokument enthält außerdem den Haftungsausschluss, dass es "hoffnungslos veraltet" ist und dass Sie den aktuellen Quellcode überprüfen sollten.)cgroup-v2 ist anders. Ich denke, die Stammgruppe (oberste Ebene) unterstützt keine Speicherabrechnung. cgroup-v2 hat noch eine
memory.stat
Datei. Alle Felder summieren sich über untergeordnete Gruppen, sodass Sie nicht nachtotal_...
Feldern suchen müssen . Es gibt einfile
Feld, was bedeutet, dass dasselbe getancache
wurde. Ärgerlicherweise sehe ich kein Gesamtfeld wierss
innenmemory.stat
; Ich denke, Sie müssten einzelne Felder addieren. Es gibt separate Statistiken für wiedergewinnbaren und nicht wiedergewinnbaren Plattenspeicher. Ich denke, eine v2-Gruppe wurde entwickelt, um Platten zurückzugewinnen, wenn der Speicher knapp wird.Linux-Gruppen gruppieren nicht automatisch
/proc/meminfo
(oder eine andere Datei in/proc
), sodass die Werte für den gesamten Computer angezeigt werden. Dies würde VPS-Kunden verwirren. Es ist jedoch möglich, Namespaces zu verwenden, um sie/proc/meminfo
durch eine Datei zu ersetzen, die von der jeweiligen Containersoftware gefälscht wurde . Wie nützlich die gefälschten Werte sind, hängt davon ab, was diese spezielle Software tut.systemd
glaubt, dass cgroup-v1 nicht sicher delegiert werden kann, z. B. an Container. Ich habe in einensystemd-nspawn
Container auf meinem cgroup-v1-System geschaut. Ich kann die cgroup sehen, in der es platziert wurde, und den Speicher, der darauf abrechnet. Andererseitssystemd
richtet das Enthaltene nicht die üblichen pro-Service-Gruppen für die Ressourcenabrechnung ein. Wenn die Speicherabrechnung in dieser Gruppe nicht aktiviert wäre, könnte der Container sie vermutlich nicht aktivieren.Ich nehme an, wenn Sie sich in einem cgroup-v2-Container befinden, sieht dieser anders aus als das Stammverzeichnis eines echten cgroup-v2-Systems, und Sie können sehen, dass der Speicher für die cgroup der obersten Ebene verantwortlich ist. Wenn für die angezeigte cgroup die Speicherabrechnung nicht aktiviert ist, wird Ihnen hoffentlich die Berechtigung delegiert, damit Sie die Speicherabrechnung in
systemd
(oder einer gleichwertigen Version) aktivieren können .quelle
git describe --contains
). Fand es als TL; DR durch eine SU-Frage verknüpft, die nur den Abschnitt zitierte, der zu proc.txt hinzugefügt wurde. Aber für diese Frage ist die Commit-Beschreibung einfach perfekt, IMO :-).