Auf dem Systemspeicher ... speziell der Unterschied zwischen "tmpfs", "shm" und "hugepages"


16

Ich war in letzter Zeit neugierig auf die verschiedenen speicherbasierten Linux-Dateisysteme.

Note:Was mich betrifft, sollten die folgenden Fragen im Vergleich zu den im Titel gestellten Fragen als mehr oder weniger fakultativ angesehen werden. Ich frage sie weiter unten, weil ich glaube, dass die Beantwortung mir dabei helfen kann, die Unterschiede besser zu verstehen, aber da mein Verständnis zugegebenermaßen begrenzt ist, kann es sein, dass andere es besser wissen. Ich bin bereit, jede Antwort zu akzeptieren, die mein Verständnis der Unterschiede zwischen den drei im Titel genannten Dateisystemen bereichert.

Letztendlich denke ich, dass ich ein brauchbares Dateisystem bereitstellen möchte, hugepages,obwohl ein wenig Lichtforschung (und noch leichteres Basteln) dazu geführt hat, dass ich glaube, dass a rewritable hugepage mountkeine Option ist. Irre ich mich Was sind die Mechaniker hier zu spielen?

Auch in Bezug auf hugepages:

     uname -a
3.13.3-1-MANJARO \
#1 SMP PREEMPT \
x86_64 GNU/Linux

    tail -n8 /proc/meminfo
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:     8223772 kB
DirectMap2M:    16924672 kB
DirectMap1G:     2097152 kB

(Hier sind Volltextversionen von / proc / meminfo und / proc / cpuinfo )

Was ist oben los? Bin ich schon vergeben? hugepages?Gibt es einen Unterschied zwischen DirectMapSpeicherseiten undhugepages?

Update Nach einigem Anstupsen von @Gilles habe ich 4 weitere Zeilen hinzugefügt und es scheint, dass es einen Unterschied gibt, obwohl ich noch nie davon gehört hatte, DirectMapbevor ich das tailgestern gezogen habe ... vielleicht DMIoder so?

Nur noch ein bisschen mehr ...

Wenn das hugepagesBestreben nicht zum Erfolg führt und Festplatten-Backups von Image-Dateien vorausgesetzt werden, wie hoch ist das Risiko, dass Schleifen aus tmpfs?meinem Dateisystem gemountet werden swapped? Ich verstehe, dass tmpfsein gemounteter Dateisystem-Cache vorliegt. Kann mein gemountetes Loopfile nicht genügend Speicher haben? Gibt es mildernde Maßnahmen, die ich ergreifen kann, um dies zu vermeiden?

Zuletzt - genau was ist das überhaupt shm,? Inwiefern unterscheidet es sich von oder schließt entweder hugepagesoder ein ?tmpfs?


1
Was ist mit den vorherigen Zeilen /proc/meminfo, die diese enthalten HugePage(oder hat Ihre Kernel-Version diese nicht)? Auf welcher Architektur ist das (x86_64, nehme ich an)?
Gilles 'SO - hör auf böse zu sein'

Ich werde sie hinzufügen. Ich machte mir nur Sorgen, dass es zu lange dauern könnte.
mikeserv

@ Gilles - Ich habe oben auf einfachen Text verlinkt. Ich hoffe das ist ok Danke, dass Sie gefragt haben - ich hätte es an erster Stelle aufnehmen sollen -, ich weiß nicht, wie ich das verpasst habe.
mikeserv

Antworten:


13

Es gibt keinen Unterschied zwischen tmpfs und shm. tmpfs ist der neue Name für shm. shm steht für SHaredMemory.

Siehe: Linux tmpfs .

Der Hauptgrund, warum tmpfs auch heute noch verwendet wird, ist dieser Kommentar in meiner / etc / fstab auf meiner Gentoo-Box. BTW Chromium wird nicht mit der fehlenden Linie bauen:

# glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for 
# POSIX shared memory (shm_open, shm_unlink). 
shm                     /dev/shm        tmpfs           nodev,nosuid,noexec     0 0 

das kam aus der Linux-Kernel-Dokumentation

Zitat:

tmpfs hat die folgenden Verwendungen:

1) Es gibt immer einen kernelinternen Mount, den Sie überhaupt nicht sehen werden
. Dies wird für gemeinsam genutzte anonyme Zuordnungen und gemeinsam genutzten SYSV-
Speicher verwendet.

Dieser Mount hängt nicht von CONFIG_TMPFS ab. Wenn CONFIG_TMPFS nicht festgelegt ist, wird der vom Benutzer sichtbare Teil von tmpfs nicht erstellt. Aber die internen
Mechanismen sind immer vorhanden.

2) glibc 2.2 und höher erwartet, dass tmpfs für
POSIX Shared Memory (shm_open, shm_unlink) in / dev / shm gemountet werden. Das Hinzufügen der folgenden
Zeile zu / etc / fstab sollte dafür sorgen:

tmpfs / dev / shm tmpfs ist standardmäßig 0 0

Denken Sie daran, das Verzeichnis zu erstellen, in das Sie tmpfs bei Bedarf einbinden möchten.

Dieser Mount wird für SYSV Shared Memory nicht benötigt.
Dafür wird der interne Mount verwendet. (In den 2.3-Kernelversionen musste
der Vorgänger von tmpfs (shm fs) eingehängt werden, um SYSV-
Shared Memory zu verwenden.)

3) Einige Leute (einschließlich mir) finden es sehr praktisch, es zu mounten,
zB auf / tmp und / var / tmp und haben eine große Swap-Partition. Und jetzt
funktionieren auch Loop-Mounts von tmpfs-Dateien, sodass mkinitrd, das von den meisten
Distributionen geliefert wird, mit einem tmpfs / tmp erfolgreich sein sollte.

4) Und wahrscheinlich noch viel mehr, von dem ich nichts weiß :-)

tmpfs bietet drei Mount-Optionen zur Größenanpassung:

size: Das Limit der zugewiesenen Bytes für diese tmpfs-Instanz. Die Standardeinstellung ist die Hälfte Ihres physischen Arbeitsspeichers ohne Swap. Wenn Sie Ihre tmpfs-Instanzen überdimensionieren, blockiert der Computer, da der OOM-Handler diesen Speicher nicht freigeben kann.
nr_blocks: Entspricht der Größe, jedoch in Blöcken von PAGE_CACHE_SIZE.
nr_inodes: Die maximale Anzahl von Inodes für diese Instanz. Der Standardwert ist die Hälfte der Anzahl Ihrer physischen RAM-Seiten oder (auf einem Computer mit HighMem) die Anzahl der LowMem-RAM-Seiten, je nachdem, welcher Wert niedriger ist.

Aus dem Transparent Hugepage Kernel Doc:

Transparenter Hugepage-Support maximiert die Nützlichkeit des freien Speichers im Vergleich zum Reservierungsansatz von hugetlbfs, indem alle nicht verwendeten Speicher als Cache oder andere bewegliche (oder sogar unbewegliche) Einheiten verwendet werden können. Es ist keine Reservierung erforderlich, um zu verhindern, dass Fehler bei der Zuweisung großer Seiten vom Benutzerland bemerkt werden. Damit können Paging und alle anderen erweiterten VM-Funktionen auf den riesigen Seiten verfügbar gemacht werden. Es sind keine Änderungen erforderlich, damit Anwendungen davon profitieren können.

Anwendungen können jedoch weiter optimiert werden, um diese Funktion zu nutzen, wie sie beispielsweise zuvor optimiert wurden, um eine Flut von mmap-Systemaufrufen für jeden malloc (4k) zu vermeiden. Die Optimierung des Benutzerlandes ist bei weitem nicht obligatorisch, und khugepaged kann bereits für langlebige Seitenzuordnungen sorgen, selbst für Anwendungen, die keine großen Seiten erkennen und viel Speicher benötigen.


Neuer Kommentar nach einigen Berechnungen:

HugePage-Größe: 2 MB
HugePages-Verwendung: Keine / Aus, wie durch die Nullen belegt, aber gemäß den obigen 2 MB aktiviert.
DirectMap4k: 8,03
GB
DirectMap2M: 16,5 GB DirectMap1G: 2 GB

Unter Verwendung des obigen Abschnitts zur Optimierung in THS sieht es so aus, als würden 8 GB Ihres Speichers von Anwendungen verwendet, die mit Mallocs mit 4 KB und 16,5 GB arbeiten. Anwendungen, die Mallocs mit 2 MB verwenden, forderten dies an. Die Anwendungen, die Mallocs von 2M verwenden, ahmen den HugePage-Support nach, indem sie die 2M-Abschnitte in den Kernel auslagern. Dies ist die bevorzugte Methode, da nach der Freigabe des malloc durch den Kernel der Speicher für das System freigegeben wird, während das Mounten von tmpfs mit hugepage erst nach einem Neustart des Systems zu einer vollständigen Bereinigung führt. Als letztes, das einfache, hatten Sie 2 Programme geöffnet / ausgeführt, die ein Malloc von 1 GB verlangten

Für diejenigen unter Ihnen, die nicht wissen, dass ein Malloc eine Standardstruktur in C ist, die für Memory ALLOCATION steht. Diese Berechnungen dienen als Beweis dafür, dass die OP-Korrelation zwischen DirectMapping und THS möglicherweise korrekt ist. Beachten Sie auch, dass das Mounten von NUR RIESIGEN Fs nur zu einem Zuwachs von Inkrementen von 2 MB führen würde, wohingegen das Verwalten des Speichers mithilfe von THS hauptsächlich in 4-KB-Blöcken erfolgt ), damit ein anderer Prozess verwendet wird.


2
Das ist wirklich gut - ist das THS meine DirectMap ?
mikeserv

Das kann ich nicht beantworten, da ich DirectMapping gegoogelt habe und nichts in Bezug auf tmpfs usw. gefunden habe. Das einzige, was ich finden konnte, war die Konfiguration des HugeMem-Supports für Oracle-Datenbanken, die unter Linux ausgeführt werden, was bedeutet, dass sie HugePages anstelle des THS verwenden Ich bezog mich auf. Alle Kernel in der 2.6-Verzweigung unterstützen jedoch THS. Als Ahnung, siehe meinen neuen Kommentar oben.
Eyoung100

Ja, ich bin auch sehr wenig aufgetaucht. Ich habe etwas über HP, THP gelesen. Ich bin ziemlich fasziniert von Ihrem Kommentar. Das entwickelt sich wirklich, Mann. Dieser letzte Teil - HP nur - sollte ich das interpretieren, dass ich kann ein Lese- / Schreib - Dateisystem auf einem hugepage Halterung montieren? Wie eine Bilddatei, die von einem Riesen-Seiten-Mount geloopt wurde? Schreibbar?
mikeserv

Ja, und es ist beschreibbar, wenn es ordnungsgemäß gemountet wird. Beachten Sie jedoch Folgendes: 1. Seitdem Sie es gemountet haben, sind Sie für die Bereinigung verantwortlich die Charaktere: Hallo, ich heiße Mike. Angenommen, jedes Zeichen ist 1k groß, wird diese Datei als 23k gespeichert. Sie haben 2025k verschwendet, als die Hugepage Ihnen 2MB gab. Dieses verschwenderische Verhalten ist der Grund, warum Speicherverwaltung in den Kernel eingebaut wurde. Es verhindert auch , uns von einer Wrapper - DLL wie kernel32 benötigen
eyoung100

und zuletzt 3. Sie verlieren Ihr Mount beim Neustart oder Absturz.
Eyoung100

4

Um das "DirectMap" -Problem zu beheben: Der Kernel verfügt über eine lineare ("direkte") Zuordnung des physischen Speichers , die von den virtuellen Zuordnungen getrennt ist, die jedem Benutzerprozess zugewiesen sind.

Der Kernel verwendet die größtmöglichen Seiten für diese Zuordnung, um den TLB-Druck zu verringern.

DirectMap1G ist sichtbar, wenn Ihre CPU 1-GB-Seiten unterstützt (ab Barcelona; einige virtuelle Umgebungen deaktivieren sie) und wenn im Kernel aktiviert - die Standardeinstellung ist 2.6.29+.


3

Es gibt keinen Unterschied zwischen shmund tmpfs(eigentlich tmpfsist nur der neue Name des früheren shmfs). hugetlbfsist ein auf tmpfsdem Kernel basierendes Dateisystem, das seinen Speicherplatz auf riesigen Seiten des Kernels verteilt und eine zusätzliche Konfiguration benötigt (die Verwendung wird in Documentation / vm / hugetlbpage.txt erklärt ).


Dies war ein guter Versuch, und ich hatte diese Dokumente natürlich gelesen. Oder vielleicht auch nicht natürlich - aber ich denke , ich werde dies für eine 100rep Prämie löschte, aber bevor ich das tue, werde ich es Ihnen anbieten , wenn Sie auf diese erweitern. Bisher musst du mein Verständnis noch bereichern - das meiste wusste ich bereits, außer dass die beiden nur Synonyme waren. In jedem Fall, wenn Sie dies bis morgen früh besser beantworten können, liegt die 100-prozentige Prämie bei Ihnen. Besonders interessant für mich ist, dass ich DirectMapauf der procfs manSeite überhaupt keine Erwähnung finde . Woher?
mikeserv

1
@mikeserv - Ich fand diesen Unterschied, der zeigt, aus welcher Funktion die DirectMaps berechnet werden: lkml.org/lkml/2008/11/6/163
slm
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.