Forum: PC Hard- und Software Linux-Frage zu Kommando "free -m"


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Frank E. (Firma: Q3) (qualidat)


Angehängte Dateien:

Lesenswert?

Ich benötige in einer App den noch freien RAM. Wenn ich auf der Konsole 
schreibe "free -m" bekomme ich - rein optisch - alles was ich wissen 
will.

Möchte ich dieses Ergebnis programmtechnisch auswerten, muss mich mich 
aufwändig durch den Text parsen. Kennt jemand eine Variation von "free" 
(oder einem anderen Kommando, was auf dem Raspi NICHT zusätzlich 
installiert werden muss), das einfach nur eine Zahl für "frei" 
zurückgibt und sonst (möglichst) nichts?

Wenn möglich auch unbahängig von der eingestellten Sprache ...  Danke!

von (prx) A. K. (prx)


Lesenswert?

cat /proc/meminfo
MemTotal:       131901212 kB
MemFree:        35571576 kB
MemAvailable:   40435812 kB
Buffers:          455452 kB
Cached:          5151988 kB
SwapCached:            0 kB
Active:          1430812 kB
Inactive:       93672304 kB
Active(anon):       1824 kB
Inactive(anon): 89496820 kB
Active(file):    1428988 kB
Inactive(file):  4175484 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:        974844 kB
SwapFree:         974844 kB
Dirty:               608 kB
Writeback:             0 kB
AnonPages:      89462908 kB
Mapped:           529024 kB
Shmem:              2968 kB
KReclaimable:     508984 kB
Slab:             733124 kB
SReclaimable:     508984 kB
SUnreclaim:       224140 kB
KernelStack:       79872 kB
PageTables:       215124 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    66925448 kB
Committed_AS:   84468800 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       95492 kB
VmallocChunk:          0 kB
Percpu:            36960 kB
HardwareCorrupted:     0 kB
AnonHugePages:  85866496 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      722816 kB
DirectMap2M:    60094464 kB
DirectMap1G:    75497472 kB

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

> awk -F' ' '$1 ~ /^MemFree/ {print $2/1024}' /proc/meminfo
34725.2
Das war jetzt kein RasPi, awk dürfte aber auch da drauf sein.

: Bearbeitet durch User
von Alexander S. (alesi)


Lesenswert?

Das geht auch mit awk alleine (ohne grep wie zu Beginn im mehrmals 
korrigierten Beitrag zuvor):
1
$ awk '/^MemFree:/ {print $2}' /proc/meminfo

von (prx) A. K. (prx)


Lesenswert?

Ja, awk gehört zu den Tools, die ich nur alle paar Jahre mal verwende.

von Vanye R. (vanye_rijan)


Lesenswert?

> Ja, awk gehört zu den Tools, die ich nur alle paar Jahre mal verwende.

Verstaendlich! Nimmt man das jeden Tag wird man schnell wirr in der 
Ruebe. :-D

Vanye

von (prx) A. K. (prx)


Lesenswert?

Vanye R. schrieb:
> Verstaendlich! Nimmt man das jeden Tag wird man schnell wirr in der
> Ruebe. :-D

Bin ich schon. Ich präferiere sei jeher perl.

von Εrnst B. (ernst)


Lesenswert?

(prx) A. K. schrieb:
> /^MemFree/

Sollte er nicht eher MemAvailable nehmen?
Sonst verweigert seine Software immer den Dienst sobald der Disk-Cache 
gefüllt ist, obwohl eigentlich massig RAM zur Verfügung steht...

von (prx) A. K. (prx)


Lesenswert?

Εrnst B. schrieb:
> Sollte er nicht eher MemAvailable nehmen?

Das ist eine andere Frage. Er wollte das, was bei "free -m" unter "frei" 
steht. Kann er haben.

Über die Hintergründe dieser Zahlen sind schon einige gestolpert, 
inklusive externe Entwickler und Sysadmins, denen beim Sizing von 
Maschinen die Düse ging, weil ihnen bei sowas wie unten zu wenig "free" 
erschien. Hiess dann "MEHR RAM, NOCH MEHR RAM!" :)
1
free -m
2
              total        used        free      shared  buff/cache   available
3
Mem:          64403        1419        9925           6       53058       62293
4
Swap:         33718         131       33587
Ich konnte sie dann nach einiger Überzeugungsarbeit über die Bedeutung 
etwas runterhandeln, aber da ist noch viel Luft nach unten.

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

Ohne Awk (setzt aber einen gleichbleibenden Aufbau der Ausgabe von free
voraus):
1
a=($(free -m)); echo ${a[9]}

Mit der einzeiligen Ausgabe (-L) von free:
1
a=($(free -Lm)); echo ${a[7]}

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Frank E. schrieb:
> Ich benötige in einer App den noch freien RAM.

Nö. Denn was immer dir ausgegeben wird kann in der nächsten Millisekunde 
schon von einem anderen Prozess weggeschnappt worden sein.

Sich auf den Wert zu verlassen ist Pfusch. Der korrekte Weg ist so viel 
Speicher anzufordern wie man gerne hätte und dann zu testen ob man ihn 
bekommen hat.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Alexander S. schrieb:
> Das geht auch mit awk alleine (ohne grep wie zu Beginn im mehrmals
> korrigierten Beitrag zuvor):
> $ awk '/^MemFree:/ {print $2}' /proc/meminfo

Ok, danke, funzt.

Ich nutze das, um Fehler aufzuspüren, wenn selbstgeschriebene Apps 
(jeweils die Einzige auf dem Raspi neben dem System) immer mehr Speicher 
benötigen ...

von Εrnst B. (ernst)


Lesenswert?

Frank E. schrieb:
> Ich nutze das, um Fehler aufzuspüren, wenn selbstgeschriebene Apps
> (jeweils die Einzige auf dem Raspi neben dem System) immer mehr Speicher
> benötigen ...

Dafür ist "MemFree" nicht der richtige "Messwert".

Schau dir lieber mal "/proc/<pid>/statm" an.

(Dokumentation dazu 
https://www.kernel.org/doc/Documentation/filesystems/proc.txt)

von Ein T. (ein_typ)


Lesenswert?

Εrnst B. schrieb:
> Dafür ist "MemFree" nicht der richtige "Messwert".

Zum Finden von Memory Leaks ist valgrind [1] eine sinnvolle Lösung.


[1] https://valgrind.org/docs/manual/quick-start.html

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.