htop meldet eine viel höhere Speichernutzung als free oder top

8

Die folgenden drei Ausgaben wurden im Wesentlichen gleichzeitig vorgenommen:

oben:

top - 02:54:36 up 2 days, 13:50,  3 users,  load average: 0.05, 0.05, 0.09
Tasks: 181 total,   1 running, 179 sleeping,   0 stopped,   1 zombie
%Cpu(s):  2.5 us,  0.8 sy,  0.0 ni, 96.6 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:  16158632 total, 11234480 used,  4924152 free,      844 buffers
KiB Swap: 16777212 total,        0 used, 16777212 free, 10640832 cached

frei -h:

             total       used       free     shared    buffers     cached
Mem:           15G        10G       4.7G         0B       844K        10G
-/+ buffers/cache:       578M        14G
Swap:          15G         0B        15G

htop: htop

frei und top scheinen zuzustimmen. Oben werden 11234480 KiB verwendet. Wenn 10640832 KiB zwischengespeichert werden, erhalten Sie 579,7 MiB, was ziemlich nahe an den kostenlosen Berichten unter den verwendeten +/- Puffern / Cache liegt.

Allerdings meldet htop 1836 (MiB) verwendet, was meines Erachtens weder hier noch dort ist. Woher kommt dieser Unterschied? htop enthält die zwischengespeicherten Daten eindeutig nicht, meldet jedoch immer noch mehr als das Dreifache der Speichernutzung von free oder top.

Ich bin mir bewusst, dass es viele ähnliche Fragen gibt, aber ich bin nicht auf eine gestoßen, die diese Diskrepanz erklärt (die Verwirrung scheint normalerweise nur die mit / ohne Cache-Zählung zu sein).

Bearbeiten: Ich sollte erwähnen, dass ich openSUSE ausführe und in Version 12.2 und 12.3 RC1 die gleiche Diskrepanz sehe.

Edit2: Die enthaltene Version von htop ist 1.0.1. Ich habe auch Version 1.0.2 aus dem Quellcode kompiliert und sehe dann auch die gleiche Diskrepanz.

Quantumboredom
quelle
hier nur raten, aber vielleicht summiert es den zwischen Prozessen geteilten Speicher?
foo

Antworten:

10

Eine vollständige Überarbeitung meines vorherigen Beitrags. Ich wurde ein bisschen neugierig und checkte weiter aus.

Kurz gesagt: Der Grund für den Unterschied ist, dass openSUSE eine gepatchte Version von top and free verwendet , die "zwischengespeichert" einige zusätzliche Werte hinzufügt .


A) Standardversion

top, kostenlos, htop , ...:

Die Nutzung wird berechnet, indem Daten gelesen werden aus/proc/meminfo :

Z.B:

#free:
Row   Column  | Corresponding /proc/meminfo entry
-----|--------|----------------------------------
Mem:

      total   : MemTotal
      used    : MemTotal - MemFree
      free    : MemFree
      shared  : MemShared
      buffers : Buffers
      cached  : Cached
-----|--------|----------------------------------
-/+ buffers/cache:

      used    : (MemTotal - MemFree) - (Buffers + Cached)
      free    :  MemFree             + (Buffers + Cached)

#htop:
    Used U*   : ((MemTotal - MemFree) - (Buffers + Cached)) / 1024

* Ich verwende den Namen Used Ufür den vom Benutzermodus verwendeten Speicher. Aka Verwendet Minus (zwischengespeichert + Puffer) .

In Wirklichkeit wird also dieselbe Berechnung verwendet.

htop Zeigen Sie Folgendes in der Speichermessung an:

[Used U % of total | Buffers % of total | Cached % of total ] UsedU MB

(MB ist eigentlich MiB.)


B) Gepatchte Version

Die Basis für freeund topauf Debian, Fedora, openSuse ist procps-ng . Jede Geschmacksrichtung fügt jedoch ihre eigenen Patches hinzu, die möglicherweise oder möglicherweise nicht Teil des Hauptprojekts werden.

Unter openSUSE finden wir verschiedene Ergänzungen zum Paket top / free (procps). Hier sind einige zusätzliche Werte zu beachten, die zur Darstellung des Cache-Werts verwendet werden. (Ich habe diese nicht in meinen vorherigen Beitrag aufgenommen, da mein System ein "sauberes" Procps verwendet.)

B.1) Ergänzungen

In / proc / meminfo haben wir Slab , einen Kernel-Datenstruktur-Cache. Als Unterkategorie finden wir SReclaimable, das Teil von Slab ist und möglicherweise sowohl vom Kernel als auch vom Benutzermodus für andere Zwecke zurückgefordert wird.

Außerdem haben wir SwapCached , einen Speicher, der einmal ausgelagert wurde, eingetauscht wird, sich aber auch in der Auslagerungsdatei befindet. Wenn man es also wieder austauschen muss, ist dies bereits erledigt.

Schließlich gibt es NFS_Unstable , Seiten, die an den Server gesendet, aber noch nicht für einen stabilen Speicher festgelegt wurden.

Die folgenden Werte werden cachein der gepatchten openSUSE-Version hinzugefügt :

SReclaimable
SwapCached
NFS_Unstable

(Zusätzlich gibt es einige Überprüfungen, dass die Summe größer als frei sein muss, verwendet größer sein muss als Puffer + Cache usw.)

B.2) Ergebnis

Wenn Sie frei betrachten , sind die folgenden Werte gleich : total, used, free and buffers.

Folgendes wird geändert : cached and "+/- buffers".

used    = MemTotal - MemFree

old:
    cached         : Cached
    +-/buffers-used: used - (Buffers + Cached)
    +/-buffers-free: free + (Buffers + Cached)

patched:
    cached         : Cached + SReclaimable + SwapCached + NFS_Unstable
    +/-buffers-used: used - (Buffers + Cached + SReclaimable +
                     SwapCached + NFS_Unstable)
    +/-buffers-free: free + (Buffers + Cached + SReclaimable +
                     SwapCached + NFS_Unstable)

Die gleichen Ergänzungen werden nach oben vorgenommen .

htop ist unverändert und stimmt daher nur mit älteren / oder nicht gepatchten Versionen von top / free überein.

Runium
quelle
Das zweite Snippet funktioniert nicht (die zweite Pipe mit grep -A12 ... gibt nichts zurück). Aber im Moment zeigt memo1 (dh htop) den Speicher als "[...] 2087 / 15779MB", während free -m 825 unter +/- Puffern / Cache anzeigt. Ich werde meine Frage mit dem Betriebssystem aktualisieren und so weiter.
Quantumboredom
Ja, das zweite Snipet ist ein schlechter Hack (der Versuch, die Ausgabe von ncurses zu analysieren, ist bestenfalls lustig). Es funktioniert hier, aber ich bin nicht überrascht, dass es anderswo nicht funktioniert.
Runium