Output von free

Hi,

bin grade mal dabei den Output von free ganzheitlich zu verstehen. Dabei hab ich auch schon viel gegooglet, lese aber teilweise widersprüchliches:

Code:
mathias@ironman:~$ free 
             total       used       free     shared    buffers     cached
Mem:       5783804    5749784      34020          0      32452    5486148
-/+ buffers/cache:     231184    5552620
Swap:      7812492        792    7811700
mathias@ironman:~$

Soweit bin ich bisher:

Mem - total: gesamter physikalischer Hauptspeicher
Mem - used: alloziierter Hauptspeicher
Mem - free: total - used
Mem - buffers: input und output queues für Prozesse
Mem - cached: disk cache
Swap - total: Summe aller swap Partitionen
Swap - used: benutzer Swap
Swap - free: total - used

Der Wert Mem - shared steht wahrscheinlich für RAM den sich Prozesse teilen - wohl meistens in Form von Shared Libraries würde ich vermuten. Wenn das so ist irritiert mich aber der Wert von 0!

Mit der "-/+ buffers/cache" hab ich noch Probleme:

Die Zeile mit -/+ buffers/cache zeigt an, wie viel Speicher aus Anwendungssicht frei beziehungsweise belegt ist. In diesem Beispiel belegen auf meinem System laufende Anwendungen 278 MB, während 606 MB frei zur Verfügung stehen.

The -/+ buffers/cache line shows how much memory is used and free from the perspective of the applications. Generally speaking, if little swap is being used, memory usage isn't impacting performance at all.

The second line of data, which begins with -/+ buffers/cache, shows the amount of physical memory currently devoted to system buffer cache. This is particularly meaningful with regard to application programs, as all data accessed from files on the system that are performed through the use of read() and write() system calls1 pass through this cache. This cache can greatly speed up access to data by reducing or eliminating the need to read from or write to the HDD or other disk.

Das passt doch irgendwie nicht zusammen oder? Was stimmt denn nun? Ist das überhaupt richtig, was ich oben zusammengeschrieben habe?

cu
serow
 
ich kann dir nur ne indirekte lösung bieten :P
nimm
Code:
free -o
:D das blendet die zeile aus ;)

ansonst schliese ich mich hiermit der frage an :D
 
Die buffers/cache-Zeile zeigt nur den Disk-I/O-Cache an, wobei used der von aktuell laufenden Programmen genutzte Cache ist und free der Cache, der aktuell nicht benutzt wird, aber reserviert ist. Im Prinzip ist der Wert für die Laufzeit des Systems aber irrelevant, da dieser Speicher jederzeit für Programme freigegeben werden kann.
 
Hi,

wenn das wirklich stimmt habe ich folgendes Problem damit: Du sagtest used ist der Disk-I/O-Cache, der gerade von Programmen benutzt wird. Jetzt sollte sync ja genau diesen Cache auf Platte schreiben und damit sollte der Wert doch auf 0 fallen oder?

Code:
mathias@mini:~$ free
             total       used       free     shared    buffers     cached
Mem:       2803344     706756    2096588          0      54904     228216
-/+ buffers/cache:     423636    2379708
Swap:      3334140          0    3334140
mathias@mini:~$ sync
mathias@mini:~$ free
             total       used       free     shared    buffers     cached
Mem:       2803344     706756    2096588          0      54904     228216
-/+ buffers/cache:     423636    2379708
Swap:      3334140          0    3334140
mathias@mini:~$

Tut er leider nicht ...

ciao
serow
 
Hi,

stimmt, der Lesebuffer wird von sync nicht geleert. Dennoch müsste der Wert doch absinken oder?

Ich hab nochmal was getestet:

Code:
mathias@mini:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2737        995       1741          0        105        405
-/+ buffers/cache:        484       2252
Swap:         3255          0       3255
mathias@mini:~$ dd if=/dev/zero of=./out bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.0159818 s, 656 MB/s
mathias@mini:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2737       1006       1731          0        105        415
-/+ buffers/cache:        485       2252
Swap:         3255          0       3255
mathias@mini:~$ sync
mathias@mini:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2737       1007       1730          0        105        415
-/+ buffers/cache:        485       2252
Swap:         3255          0       3255
mathias@mini:~$

Nach dem sync ist absolut nichts passiert obwohl das dd ja den Buffer Cache hätte füllen sollen.

cu
serow
 
Als Schreibbuffer wird zumeist der in der Festplatte vorhandene Cache genutzt und nur äußerst selten der RAM.
 
Hmm ich hab das immer als doppelte Cache Architektur gesehen ... Der Festplatten-Cache ist ja auch vllt 16MB oder so und damit doch sehr klein.

cu
serow
 
Es wird ja nicht alles, was geschrieben wird, in einem Cache gehalten, gerade wenn es um große Datenmengen/Dateien geht.
 
Die buffers/cache-Zeile zeigt nur den Disk-I/O-Cache an, wobei used der von aktuell laufenden Programmen genutzte Cache ist und free der Cache, der aktuell nicht benutzt wird, aber reserviert ist. Im Prinzip ist der Wert für die Laufzeit des Systems aber irrelevant, da dieser Speicher jederzeit für Programme freigegeben werden kann.

Ich denke das dies nicht so ist und ein kleiner blick in die free.c sollte dies bestätigen.

Erstmal mit meminfo (/proc/meminfo) alle werte auslesen und dann ausgeben:

PHP:
meminfo();
printf("             total       used       free     shared    buffers     cached\n");
printf(
            "%-7s %10Lu %10Lu %10Lu %10Lu %10Lu %10Lu\n", "Mem:",
            S(kb_main_total),
            S(kb_main_used),
            S(kb_main_free),
            S(kb_main_shared),
            S(kb_main_buffers),
            S(kb_main_cached)
        );

und weiter unten geschieht folgendes wenn der Parameter -o nicht gesetzt wurde:
PHP:
if(!old_fmt){
            unsigned KLONG buffers_plus_cached = kb_main_buffers + kb_main_cached;
            printf(
                "-/+ buffers/cache: %10Lu %10Lu\n", 
                S(kb_main_used - buffers_plus_cached),
                S(kb_main_free + buffers_plus_cached)
            );
}

Somit Präferiere ich folgendes Zitat:
The -/+ buffers/cache line shows how much memory is used and free from the perspective of the applications.

Die Sourcen findet ihr hier.

Falls jemand doch noch andere infos und quellen hat wäre ich auch dran Interessiert.

mfg
 
Zurück
Oben