/proc/meminfo
Inhaltsverzeichnis
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
- Gesamtmenge an Arbeitsspeicher
- genutzer Speicher
- freier Speicher
gemeinsam genutzer Speicher (siehe MemShared)
temporärer Puffer für Plattenzugriffe (siehe Buffers)
- Dateisystem-Cache
Die Zahlen der dritten Zeile (Swap:) zeigen die Nutzung des Swap Spaces in Bytes
- Gesamtmenge an Swap Space
- genutzer Swap Space
- 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
- The /proc Filesystem
linux/Documentation/filesystems/proc.txt
http://lxr.linux.no/linux/Documentation/filesystems/proc.txt
- DebianWiki - Hugepages
- proc(5) - Linux manual page
- "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/