Die Standarddateien / -tools, die 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 Speichermenge abrufen - ohne Swap -, die für meine Software zu einem bestimmten Zeitpunkt verfügbar ist? Vermutlich wird dies in der Ausgabe von free
und cat /proc/meminfo
in Arch als "verfügbar" und "MemAvailable" angezeigt, aber wie bekomme ich dasselbe in Ubuntu oder einer anderen Distribution?
awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}') '{a[$1]=$2}END{m=a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]; print a["MemAvailable:"],m-low}' /proc/meminfo
dem ich die gleiche Nummer erhalten soll, die zweimal gedruckt wurde. Die zweite Zahl (mein Verständnis des von Ihnen vorgeschlagenen Algorithmus) ist jedoch höher als dieMemAvailable
in/proc/meminfo
. Was mache ich falsch?/proc/zoneinfo
zählt Seiten, die meistens 4 KB groß sindamd64
; Sie vermissen auch die zusätzliche Sicherheit, die dem Seitencache und dem wiedergewinnbaren Speicher hinzugefügt wurde. Wenn wir letzteres vereinfachen, können wir das niedrige Wasserzeichen dreimal subtrahieren, sodassm-12*low
(3 × 4 KB) auf meinem System das richtige Ergebnis liefert. (Diese Vereinfachung unterschätzt den verfügbaren Speicher, wenn der Seiten-Cache oder der wiedergewinnbare Speicher kleiner als das Doppelte des niedrigen Wasserzeichens ist, aber Sie möchten in dieser Situation ohnehin nicht viel Speicher verwenden, sodass dies ein vernünftiger Kompromiss zu sein scheint.)(file)
Entires noch denSReclaimable
Eintrag haben? Auf einer älteren Centos-Box mit Kernel v 2.6.18-348.16.1.el5xen (peruname -r
) ist dies die Ausgabe, die ich erhalte: pastebin.com/iFWiM1kX . Ihre Berechnung zieht nur dasMemFree
TeilWährend Stephens Antwort völlig ausreichend ist und Vorsicht geboten ist, habe ich beschlossen, die vollständige Logik einschließlich der minimalen Vergleiche aufzuschreiben. Informationen werden zuerst aus / proc / meminfo gelesen und in einer Variablen gespeichert, damit die Speicherdetails konsistent sind.
Das in der Variablen gespeicherte Ergebnis wird in Bytes angegeben.
quelle