/proc/meminfo

Anhand der beiden exemplarischen Ausgaben von /proc/meminfo wird der Aufbau und Inhalt dieser Datei erläutert.

Im Laufe der Kernelentwicklung wurde dieser Inhalt mehrfach überarbeitet und erweitert. Deshalb gibt es ein älteres und ein neueres Beispiel.

Am Anfang von /proc/meminfo stehen die allgemeinen Informationen wie zum Beispiel die gesamte Größe des Arbeitsspeichers sowie die Größe des freien und den genutzten Teils. Darauf folgen Detailinformationen zu einzelnen Aspekten der Speicherverwaltung.

Als anonym wird Speicher bezeichnet, wenn dieser durch eine Anwendung mit malloc(3) oder mmap(2) angefordert wurde. Speicher der mit mmmap(2) den Inhalt einer Datei darstellt, ist kein anonymer Speicher.

Die Verwaltung des virtuellen Speichers teilt den Speicherseiten in aktiven und inaktiven Speicher ein. Aktiver Speicher wird aktuell von einem Prozeß genutzt. Inaktiver Speicher wurde allokiert, wird aber aktuell nicht genutzt. Bei Bedarf verschiebt der Kernel den am wenigsten benutzen Speicher eines Prozesses von der Liste mit dem aktiven Speicher in die Liste mit dem inaktive Speicher. Beim Swapping werden zuerst die Bereiche auf der Liste mit dem inaktiven Speicher ausgelagert.

Beispielausgabe Kernel 2.6.19

   1 # cat /proc/meminfo
   2         total:    used:    free:  shared: buffers:  cached:
   3 Mem:  6141509632 6122868736 18640896        0 25358336 5993361408
   4 Swap: 2097307648        0 2097307648
   5 MemTotal:      5997568 kB
   6 MemFree:         18204 kB
   7 MemShared:           0 kB
   8 Buffers:         24764 kB
   9 Cached:        5852892 kB
  10 SwapCached:          0 kB
  11 Active:          68292 kB
  12 ActiveAnon:      16336 kB
  13 ActiveCache:     51956 kB
  14 Inact_dirty:   4481176 kB
  15 Inact_laundry: 1248512 kB
  16 Inact_clean:     96004 kB
  17 Inact_target:  1178796 kB
  18 HighTotal:     2097148 kB
  19 HighFree:         1232 kB
  20 LowTotal:      3900420 kB
  21 LowFree:         16972 kB
  22 SwapTotal:     2048152 kB
  23 SwapFree:      2048152 kB
  24 CommitLimit:   5046936 kB
  25 Committed_AS:   281504 kB
  26 HugePages_Total:     0
  27 HugePages_Free:      0
  28 Hugepagesize:     2048 kB

Beispielausgebe Kernel 3.14

   1 # cat /proc/meminfo
   2 MemTotal:       32747144 kB
   3 MemFree:        30678692 kB
   4 MemAvailable:   32023400 kB
   5 Buffers:          252724 kB
   6 Cached:          1376112 kB
   7 SwapCached:            0 kB
   8 Active:          1000044 kB
   9 Inactive:         692912 kB
  10 Active(anon):      64500 kB
  11 Inactive(anon):    16604 kB
  12 Active(file):     935544 kB
  13 Inactive(file):   676308 kB
  14 Unevictable:           0 kB
  15 Mlocked:               0 kB
  16 SwapTotal:       8388604 kB
  17 SwapFree:        8388604 kB
  18 Dirty:              1720 kB
  19 Writeback:             0 kB
  20 AnonPages:         64172 kB
  21 Mapped:            36760 kB
  22 Shmem:             16996 kB
  23 Slab:             134580 kB
  24 SReclaimable:      97396 kB
  25 SUnreclaim:        37184 kB
  26 KernelStack:        3008 kB
  27 PageTables:         5716 kB
  28 NFS_Unstable:          0 kB
  29 Bounce:                0 kB
  30 WritebackTmp:          0 kB
  31 CommitLimit:    24762176 kB
  32 Committed_AS:     319212 kB
  33 VmallocTotal:   34359738367 kB
  34 VmallocUsed:      332116 kB
  35 VmallocChunk:   34341910524 kB
  36 HardwareCorrupted:     0 kB
  37 AnonHugePages:     24576 kB
  38 HugePages_Total:       0
  39 HugePages_Free:        0
  40 HugePages_Rsvd:        0
  41 HugePages_Surp:        0
  42 Hugepagesize:       2048 kB
  43 DirectMap4k:      137328 kB
  44 DirectMap2M:     5070848 kB
  45 DirectMap1G:    28311552 kB

Allgemeine Statistiken

Die ältere Kernelversionen zeigen am Anfang von /proc/meminfo drei Zeilen an, die die ganz grobe Unterteilung des Speichers darstellen.

        total:    used:    free:  shared: buffers:  cached:
Mem:  6141509632 6122868736 18640896        0 25358336 5993361408
Swap: 2097307648        0 2097307648

Die sechs Zahlen der zweiten Zeile (Mem:) zeigen die Aufteilung des physikalischen Arbeitsspeicher in Bytes

  1. Gesamtmenge an Arbeitsspeicher
  2. genutzer Speicher
  3. freier Speicher
  4. gemeinsam genutzer Speicher (siehe MemShared)

  5. temporärer Puffer für Plattenzugriffe (siehe Buffers)

  6. Dateisystem-Cache

Die Zahlen der dritten Zeile (Swap:) zeigen die Nutzung des Swap Spaces in Bytes

  1. Gesamtmenge an Swap Space
  2. genutzer Swap Space
  3. freier Swap Space

Die nachfolgenden allgemeinen Werte sind bei (fast) allen Kernelversionen sichtbar:

MemTotal
Gesamte Arbeitsspeicher in Kilobytes abzüglich einiger kleinerer reservierter Bereiche und Kernelcode

Summe aus LowTotal und HighTotal

MemFree
Gesamter freie Arbeitsspeicher

Summe aus LowFree und HighFree

MemShared
immer 0
Wird ab Kernel 2.4 nicht mehr benutzt und nur aus Kompatibilitätsgründen mit angezeigt sowie ab Kernel 3.X nicht mehr angezeigt.
MemAvailable
Schätzung, wie viel Speicher für den Start neuer Anwendungen zur Verfügung steht, ohne Seiten in den Swap Space auslagern zu müssen.
Buffers
Menge des Arbeitsspeicher, der zur temporären Zwischenspeicherung von "rohen" Blöcken der Festplatte verwendet wird.

Der Cache für Dateisysteme zählt nicht dazu und wird unter Cached aufgeführt.

Dieser Bereich sollte mit ca. 20 MB nicht sonderlich groß werden und ist heutzutage wenig aussagekräftig.
Cached
Die Menge des Arbeitsspeicher, welcher als Zwischenspeicher für Dateisysteme verwendet wird.

SwapCached ist nicht enthalten.

SwapCached
Speicher, der ausgelagert und bereits wieder eingelagert wurde und im Swapbereich noch nicht überschrieben ist. Wird neuer freier Speicher benötigt, muss der Speicher im Swap-Cache nicht erneut auf Platte geschrieben werden. Damit wird Platten-I/O gespart.

Detailstatistiken

Active
Die Gesamtmenge des Puffer oder Page-Cache-Speicher in Kilobyte, der aktiv verwendet wird.
Dies ist Speicher der erst kürzlich benutzt wurde und für gewöhnlich nicht für andere Zwecke zurückgefordert wird.

Summe aus Active(anon) und Active(file)

Inactive
Nicht mehr benutzter Speicher

Summe aus Inactive(anon) und Inactive(file)

ActiveAnon bzw. Active(anon)
Aktiver Speicher der in Nutzerprozesse abgebildet wird und Swap Cache
Inactive(anon)
Nicht mehr benutzter anonymer Speicher
Active(file)
Aktiver Page Cache
Inactive(file)
Inaktiver Page Cache
ActiveCache
Aktiver Speicher, der für das Cachen von Dateien verwendet wird und nicht in den Speicher des Nutzers gemappt wurde
Inact_dirty
Nicht mehr benutzter Speicher, der ein Kandidat für die Rückforderung ist
Inact_laundry
Speicher der zur Rückforderung markiert ist, dessen Inhalt aber noch nicht auf die Festplatte geschrieben wurde
Inact_clean
Speicher der zur Rückforderung markiert ist und dessen Inhalt schon auf die Festplatte geschrieben wurde. Dieser Speicher kann nun neu zugeteilt werden.
Inact_target
Spezifiziert die Zielgröße des inaktiven freien Speichers. Ist die Menge des inaktiven freien Speichers kleiner als diese Zielgröße versucht der Kernel durch Paging aktive Seiten auszulagern.
Unevictable
Festgepinnter Speicher, mit dem nicht gemacht werden kann. Dieser Speicher kann nicht ausgelagert oder wiederverwendet werden.

Hierzu zählen Kernel Pages und mit mlock(2) festgepinnte Seiten.

Mlocked
Gesamtmenge des Speichers der nur im RAM gehalten wird und somit nicht auch ausgelagert werden darf.

Speicher kann mit mlock(2) bzw. mlockall(2) im RAM festgepinnt werden.

HighTotal und HighFree
Die Gesamtmenge und der freie Speicher in Kilobytes, die nicht direkt in den Kernelbereich gemappt werden.

Die Werte von HighTotal können von Kernel zu Kernel anders sein.

LowTotal und LowFree
Die Gesamtmenge und der freie Speicher, die direkt in den Kernelbereich gemappt werden.

Die Werte von LowTotal können von Kernel zu Kernel anders sein.

SwapTotal
Gesamtmenge des Swap-Speichers

Summe aus SwapFree und SwapCached

SwapFree
Freier verfügbare Swap-Speicher
Dirty
Geänderte Seiten im Page Cache, die noch auf die Platte geschrieben werden müssen
Writeback
Menge der als "Dirty" markierten Daten, die gerade auf Platte geschrieben werden
AnonPages
Menge der anonymen Seiten inkl. Hugepages

In neuen Kernel werden die anonymen Hugepages in AnonHugePages gezählt.

Mapped

Menge der mit mmap(2) in den Speicher abgebildeten nicht-anonymen Seiten

Shmem

Mit mmap(.., MAP_SHARED|MAP_ANONYMOUS) genutzter Shared Memory

Slab
Komplette vom Slab genutzter Speicher

Summe von SReclaimable und SUnreclaim

siehe auch proc/slabinfo

SReclaimable
Slab-Speicher, der sich zurückgewinnen läßt, d.h. die Objekte inaktiv sind
SUnreclaim
mit aktiven Objekten gefüllter Slab-Speicher
KernelStack
Seiten, die für den Kernel Stack genutzt wurden
PageTables
Größe der Page Tables.
NFS_Unstable

Writeback für NFS-Seiten

NFS-Seiten, die zum NFS-Server übertragen wurden, aber von diesem noch nicht mit "COMMIT" bestätigt - d.h. auf Platte geschrieben wurden.
Bounce
Menge der genutzten "Bounce Buffer". "Bounce Buffer" werden als Zwischenspeicher für verschiedene Geräte benutzt.
Sie kommen zum Beispiel bei Geräten zum Einsatz, die nicht auf den vollen Speicherbereich, der der CPU zur Verfügung steht, zugreifen können.
Sie werden weiterhin z.B. auch bei Blockspeicher genutzt, damit sich Seiten nicht ändern, für die eine Prüfsumme berechnet und zusammen mit den Daten auf Platten geschrieben wird.
WritebackTmp

Writeback für FUSE

CommitLimit
Gesamtmemge des Speichers der aktuell zugewiessen werden kann, basierend dem Verhältnis der Überbuchung des Speichers (overcommit ratio)
Commited_AS
Die Gesamtmenge von geschätztem Speicher in Kilobyte, welcher zur Ausführung der Arbeitslast benötigt wird. Dieser Wert repräsentiert den Wert im schlimmsten Fall und beinhaltet ebenso Swap-Speicher.
VmallocTotal

Menge an Speicher, die der Kernel mit vmalloc(3) allokieren kann

VmallocUsed

Genutzter vmalloc()-Speicher How much the kernel has vmalloc()'ed.

VmallocChunk

Längste kontinuierliche frei Block im vmalloc()-Bereich

HardwareCorrupted
Seiten im ECC-Fehlern

Hugepages

Hugepages müssen am Stück im Speicher liegen. Bereits fragmentierter Speicher kann nicht für Hugepages genutzt werden. Unter Umständen muß der Server gebootet werden, um die benötigte Menge an Hugepages nutzen zu können.

AnonHugePages
Anzahl der transparenten Hugepages die gerade im System genutzt werden.
HugePages_Total
Gesamtzahl von Hugepages für das System.

Die Anzahl ergibt sich aus der Größe einer Hugepage (Hugepagesize) in MB und der für den Hugepage Pools reservierten Größe (/proc/sys/vm/hugetlb_pool).

Diese Statistik erscheint lediglich auf x86-, Itanium- und AMD64-Architekturen.
HugePages_Free
Anzahl der ungenutzten von Hugepages im Pool.
Diese Statistik erscheint lediglich auf x86-, Itanium- und AMD64-Architekturen.
HugePages_Rsvd

Anzahl der "reservierten" Hugepages. Als reserviert zählt eine Hugepage, wenn sie zum Beispiel mit malloc(3) oder mmap(2) angefordert wurde aber nicht nicht genutzt wurde.

Genutzte Hugepages werden nicht hier nicht mitgezählt.
Es ist garantiert, dass reservierte Hugepages bei Bedarf durch die Anwendung später genutzt werden kann.
HugePages_Surp

Anzahl von Hugepages im Pool, die über den Wert in /proc/sys/vm/nr_hugepages hinausgeht.

Das Überangebot ("surplus") wird duch den Wert in /proc/sys/vm/nr_overcommit_hugepages gesteuert.

Hugepagesize
Die Größe einer Hugepage in Kilobytes. Der Standardwert ist 4096 KB auf Uniprocessor-Kernels für 32-Bit Architekturen. Für SMP und Hugemem-Kernel ist der Standardwert 2048 KB. Für 64-Bit Architekturen ist der Standardwert 262144 KB. Diese Statistik erscheint lediglich auf x86-, Itanium- und AMD64-Architekturen.

x86-spezifisch

DirectMap*
x86-spezifischer Wert, der die direkt abbildbaren Slots in der entsprechenden Größe angibt.
Diese Werte sind primär für Entwickler gedacht und nicht direkt für Nutzer.

Weiterführende Informationen / Quellen

RHEL 7 Beta - System Administrators Reference Guide

https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/7-Beta/html/System_Administrators_Reference_Guide/sect-proc-topfiles.html

The /proc Filesystem

linux/Documentation/filesystems/proc.txt

http://lxr.linux.no/linux/Documentation/filesystems/proc.txt

DebianWiki - Hugepages

https://wiki.debian.org/Hugepages

proc(5) - Linux manual page

http://man7.org/linux/man-pages/man5/proc.5.html

"Free", "buffer", "swap", "dirty" /proc/meminfo Explained

http://www.reddit.com/r/linux/comments/1hk5ow/free_buffer_swap_dirty_procmeminfo_explained/ bzw. http://redd.it/1hk5ow

Linux memory leak detection

http://blog.thewebsitepeople.org/2011/03/linux-memory-leak-detection/

proc/meminfo (zuletzt geändert am 2019-05-13 15:09:53 durch CarstenGrohmann)