Die Standarddateien/-tools, die den Speicher melden, scheinen auf verschiedenen Linux-Distributionen unterschiedliche Formate zu haben. Zum Beispiel auf Arch und Ubuntu.
-
Bogen
$ free total used free shared buff/cache available Mem: 8169312 3870392 2648348 97884 1650572 4110336 Swap: 16777212 389588 16387624 $ head /proc/meminfo MemTotal: 8169312 kB MemFree: 2625668 kB MemAvailable: 4088520 kB Buffers: 239688 kB Cached: 1224520 kB SwapCached: 17452 kB Active: 4074548 kB Inactive: 1035716 kB Active(anon): 3247948 kB Inactive(anon): 497684 kB
-
Ubuntu
$ free total used free shared buffers cached Mem: 80642828 69076080 11566748 3063796 150688 58358264 -/+ buffers/cache: 10567128 70075700 Swap: 20971516 5828472 15143044 $ head /proc/meminfo MemTotal: 80642828 kB MemFree: 11565936 kB Buffers: 150688 kB Cached: 58358264 kB SwapCached: 2173912 kB Active: 27305364 kB Inactive: 40004480 kB Active(anon): 7584320 kB Inactive(anon): 4280400 kB Active(file): 19721044 kB
Wie kann ich also portabel (nur über Linux-Distributionen hinweg) und zuverlässig die Menge an Speicher abrufen – ohne Swap –, die für meine Software zu einem bestimmten Zeitpunkt verfügbar ist? Vermutlich wird das in der Ausgabe von free
als „available“ und „MemAvailable“ angezeigt und cat /proc/meminfo
in Arch, aber wie bekomme ich dasselbe in Ubuntu oder einer anderen Distribution?
Akzeptierte Antwort:
MemAvailable
ist in /proc/meminfo
enthalten ab Version 3.14 des Kernels; es wurde von Commit 34e431b0a hinzugefügt. Das ist der entscheidende Faktor für die von Ihnen gezeigten Ausgangsvariationen. Die Commit-Nachricht gibt an, wie der verfügbare Arbeitsspeicher ohne MemAvailable
geschätzt wird :
Derzeit kann die Menge an Arbeitsspeicher, die für eine neue Arbeitslast verfügbar ist, ohne das System in den Swap zu drängen, anhand von MemFree
geschätzt werden , Active(file)
, Inactive(file)
und SReclaimable
, sowie die „niedrigen“ Wasserzeichen aus /proc/zoneinfo
.
Die niedrigen Wassermarken sind das Niveau, unterhalb dessen das System wechselt. Also in Abwesenheit von MemAvailable
Sie können zumindest die für MemFree
angegebenen Werte addieren , Active(file)
, Inactive(file)
und SReclaimable
(je nachdem, welche in /proc/meminfo
vorhanden sind ) und subtrahieren Sie die niedrigen Wasserzeichen von /proc/zoneinfo
. Letzteres listet auch die Anzahl der freien Seiten pro Zone auf, was als Vergleich nützlich sein könnte…
Der vollständige Algorithmus ist im Patch zu meminfo.c
enthalten und scheint einigermaßen einfach anzupassen:
- die niedrigen Wassermarken über alle Zonen summieren;
- Nehmen Sie den identifizierten freien Speicher (
MemFree
); - subtrahieren Sie das untere Wasserzeichen (wir müssen es vermeiden, es zu berühren, um ein Vertauschen zu vermeiden);
- fügen Sie die Menge an Speicher hinzu, die wir aus dem Seitencache verwenden können (Summe von
Active(file)
). undInactive(file)
):Das ist die vom Seiten-Cache verwendete Speichermenge abzüglich entweder der Hälfte des Seiten-Cache oder des unteren Wasserzeichens, je nachdem, welcher Wert kleiner ist; - Fügen Sie die Speichermenge hinzu, die wir zurückfordern können (
SReclaimable
), nach demselben Algorithmus.
Wenn Sie all dies zusammenfassen, können Sie den Speicher für einen neuen Prozess verfügbar machen mit:
awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}')
'{a[$1]=$2}
END{
print a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]-(12*low);
}' /proc/meminfo