Ich habe eine Maschine mit 62 GB RAM und einen Trunk mit nur 7 GB, also dachte ich, ich würde eine RAM-Disk erstellen und dort kompilieren. Ich bin kein Linux-Experte. Ich habe im Internet Anweisungen zum Erstellen der RAM-Disk gefunden:
mkfs -q /dev/ram1 8192
Ich habe die 8192 in 16777216 geändert, um 16 GB RAM-Datenträger zuzuweisen.
Ich habe folgende Fehlermeldung erhalten:
mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n)
An diesem Punkt wurde ich erschreckt und auf Kaution entlassen.
sudo dmidecode --type 17 | grep Size
zeigt an
8x8192MB + 2048MB = 67584 MB
aber du
auf /dev
gibt 804K
.
Ist das das Problem? Kann ich diese /dev
Größe überwinden ?
mount -o size=16G -t tmpfs none /mnt/tmpfs
Antworten:
Der beste Weg, eine RAM-Disk unter Linux zu erstellen, ist tmpfs. Es ist ein Dateisystem, das im RAM lebt, so dass ext2 nicht benötigt wird. Sie können einen tmpfs mit einer Größe von 16 GB erstellen mit:
quelle
tmpfs
Möglicherweise wird Swap verwendet, was Sie bei einer reinen RAM-Disk wahrscheinlich nicht wollen.Linux ist sehr effizient bei der Verwendung von RAM. Es ist keine Überraschung, dass Sie wenig oder gar keine Beschleunigung mit sehen
tmpfs
. Die größten Teile, die in den Speicher eingelesen werden müssen (und damit den Prozess verlangsamen können), sind die Tools (Compiler, Assembler, Linker). Letztendlich werdenmake
sie beim Start in den Speicher geladen und verlassen ihn nie. Was bleibt, ist das Einlesen der Quelle (das Ausschreiben der Ergebnisse wird Sie nicht verlangsamen, es sei denn, der Speicher ist stark eingeschränkt). Auch hier bleiben die Comon-Header-Dateien erhalten, nur die Quelle des Benutzers muss gelesen werden. Und das sind wahrscheinlich nicht mehr als ein paar Megabyte. Das Erstellen einer großen RAM-Disk (oder sogar die Verwendung einer großen RAM-Disktmpfs
) kann durchaus zu einer Verlangsamung führen (indem der Build-Speicher eingeschränkt wird, die Dateien auf der RAM-Disk odertmpfs
nicht) direkt von dort verwendet werden).quelle
tmpfs
nicht zum Speichern von ausführbaren Dateien verwendet werden (RAM-Disks sind ein Überbleibsel aus der guten alten Zeit quälend langsamer Disketten undtmpfs
für streng temporäre Daten gedacht), hat es niemand für wichtig genug gehalten, die erforderlichen hässlichen Hacks hinzuzufügen.Das Problem besteht darin, dass die maximale Größe einer Ramdisk, genauer gesagt der Speichergröße, auf die über den Ramdisk-Treiber zugegriffen werden kann, zur Startzeit überschrieben werden kann, aber festgelegt bleibt, sobald der Kernel in den Speicher geladen wird. Der Standardwert wird wahrscheinlich in Megabyte gemessen. Wenn ich mich richtig erinnere, ist der Speicher für eine RAM-Disk beim Laden des Treibers reserviert, alle RAM-Disks haben dieselbe Größe und es gibt standardmäßig 16 RAM-Disks. Also nicht mal du willst eine Ramdisk Größe von 16G :-)
Wie in der anderen Antwort angegeben, möchten Sie tmpfs verwenden. Außerdem werden Sie nicht viel gewinnen, wenn Sie Ihr gesamtes Betriebssystem auf einer Ramdisk / tmpfs haben. Kopieren Sie einfach Ihr builddir in ein tmpfs und kompilieren Sie es dann. Möglicherweise müssen Sie sicherstellen, dass alle temporären Ergebnisse an einen Speicherort geschrieben werden, der sich auch in den tmpfs befindet.
quelle
blockdev --flushbufs
.Documentation/blockdev/ramdisk.txt
in den Kernel-Quellen. Und zu meiner Antwort: Diese Datei besagt auch, dass die RAM-Disk mit zunehmendem Speicherverbrauch wächst, sodass nicht alle auf einmal zugewiesen werden.Es scheint zu funktionieren, nach dem Booten eine große RAM-Disk zu erstellen, ohne mit den Kernel-Parametern herumzuspielen. Verwenden Sie tmpfs, erstellen Sie eine Datei, mounten Sie sie über eine Schleife und mounten Sie sie über ein Dateisystem:
Wahrscheinlich ein bisschen Leistungseinbußen durch mehrere verschiedene Ebenen ... aber zumindest funktioniert es.
quelle
Neben
tmpfs
undramfs
ist eine weitere Option das/dev/ram0
Blockiergerät. In neueren Ubuntu-Versionen ist dieses Gerät nicht standardmäßig vorhanden, kann jedoch über erstellt werdenmodprobe brd
.Dieser Ansatz ist vorhersehbarer, da er ein reales
ext4
Dateisystem erstellt und den von Ihnen angegebenen Grenzwert nie überschreitet. Das Einrichten erfordert jedoch mehr Schritte und die Verwendung des Arbeitsspeichers ist weniger effizient.Verwenden des brd-Kernelmoduls (/ dev / ram0)
So erstellen und initialisieren Sie eine 4-GB-RAM-Disk:
Der
rd_nr
Parameter gibt an, wie viele RAM-Festplatten erstellt werden sollen (standardmäßig werden 16, dh/dev/ram0
bis, erstellt/dev/ram15
). Derrd_size
Parameter ist die Größe in Kilobyte . Mit der$(( ... ))
Syntax können Sie in der Shell arithmetisch arbeiten.Um die Zuordnung der RAM-Festplatte aufzuheben, heben Sie die Bereitstellung auf und entfernen Sie das
brd
Kernelmodul:Erstellen eines Blockgeräts im Inneren
ramfs
Alternativ können Sie ein Blockgerät erstellen in
ramfs
:Der
truncate
Befehl erstellt eine leere Datei einer bestimmten Größe, sodass sie bei Bedarf initialisiert wird (dh Speicherplatz verbraucht).Um die Zuordnung der RAM-Festplatte aufzuheben, müssen Sie die Bereitstellung aufheben und das Festplatten-Image löschen:
Vergleich mit
tmpfs
undramfs
Obwohl
tmpfs
undramfs
effizienter als die Verwendung eines Blockgeräts, sind im Folgenden einige ihrer Nachteile aufgeführt.tmpfs
kann auf die Festplatte tauschen. Dies ist effizienter, aber es kann vorkommen, dass Sie eine reine RAM-Festplatte benötigen:ramfs
Es ist einfach einzurichten, beansprucht Speicherplatz, sobald Sie Dateien löschen, und nutzt den Arbeitsspeicher effizienter (das System puffert die Dateien nicht, da es weiß, dass sie sich im Arbeitsspeicher befinden). Aber es hat seine eigenen Nachteile und Überraschungen:Das
df
Dienstprogramm gibt keinen Speicherplatzverbrauch an:Es gibt keinen Größenbegrenzungsparameter. Wenn Sie zu viel in die Ramdisk stecken, bleibt Ihr System hängen.
Spärliche Dateien können unsparend werden, wenn Sie es am wenigsten erwarten. Heute Morgen habe ich ein VM-Image (150 G, aber 49 G auf der Festplatte) nach
ramfs
(ich habe 128 G RAM) kopiert. Das hat funktioniert. Aber wenn ich kopierte von derramfs
an das Ziel, mein System reagiert nicht mehr. Dascp
Dienstprogramm füllte anscheinend die Lücken beim Lesen , aber nicht beim Schreiben.Beide
tmpfs
undramfs
verhalten sich möglicherweise anders als ein echtesext4
Dateisystem. Das Erstellen eines Blockgeräts im RAM und das Initialisieren mitext4
diesem verhindert dies.Für einen tieferen Vergleich: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
quelle
OP Die Größe des Arbeitsspeichers wird in MB angegeben. Alles, was Sie dort eingeben müssen, ist 16384. Und dann würden Sie im Geschäft sein.
quelle
mkfs.ext2
Sie können ein
ramfs
Dateisystem einbinden, Ihr Projekt in dieses kopieren und von dort aus arbeiten. Dies garantiert, dass Ihre Eingabedateien in den RAM geladen werden und nicht erneut von dem viel langsameren Laufwerk gelesen werden. Wie Sie jedoch festgestellt haben, ist dies im Allgemeinen keine nützliche Strategie. Sie erhalten bereits genau den gleichen Vorteil.- https://github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt
Sie können bereits darauf vertrauen, dass Ihre Eingabedateien beim ersten Lesen im RAM zwischengespeichert werden. Ihre Ausgabedateien werden ebenfalls zwischengespeichert, damit Sie nicht darauf warten, dass sie auf die Festplatte geschrieben werden.
Es gibt keine künstliche Beschränkung, wie viel Sie cachen können, wie lange es im Cache bleibt usw. Caches werden erst gelöscht, wenn Sie den RAM gefüllt haben. Welcher Cache zuerst gelöscht wird, wird durch erschreckend ausgearbeitete Algorithmen ausgewählt. Die erste Annäherung ist, wir beschreiben es als zuletzt verwendet. Weitere Informationen finden Sie unter Welche Seitenersetzungsalgorithmen werden im Linux-Kernel für den Dateicache des Betriebssystems verwendet?
Beachten Sie, dass Ihr Texteditor
fsync()
Dateien explizit auf der Festplatte speichert.Wenn Sie Tests eines entsprechenden Programms ausführen
fsync()
, können diese durch Ausführen in einem Dateisystem wie z. B.ramfs
beschleunigt werden. Eine andere Strategie ist, zu versuchen,fsync()
miteatmydata
/ zu deaktivierennosync.so
.Für einige andere Betriebssysteme gelten möglicherweise bestimmte Einschränkungen, die mit einer Ramdisk umgangen werden können. Das Fehlen jeglicher Zwischenspeicherung von Dateien ist einer der Gründe, warum RAM-Disks unter DOS populär waren .
tmpfs
tmpfs
Funktioniert genauso wieramfs
, außer dass Swap Space verwendet werden kann, wenn Sie eines haben. Das heißt, wenn Sie RAM für etwas anderes benötigen, können die zuletzt verwendeten Algorithmen Datenblöcke aus tmpfs auswählen und sie auf die Festplatte tauschen.Die meisten Leute bleiben dabei
tmpfs
, weil Sie damit auch die Gesamtgröße begrenzen und den Platz anzeigen können, der zdf
. B. im Befehl richtig verwendet wird . Ich bin nicht sicher, warum dieser Unterschied besteht. Die Größenbeschränkung intmpfs
schützt Sie davor, versehentlich den gesamten Arbeitsspeicher zu belegen und Ihr System zu töten. Der Standardwert ist die Hälfte Ihres Arbeitsspeichers.Andere Gründe, warum Schreibvorgänge langsamer werden können
Das Obige ist eine Vereinfachung, die auf Ihren Fall zugeschnitten ist. Die Schreibvorgänge in Dateien in Ihrem Fall sollten nicht auf die Festplatte warten müssen. Es gibt jedoch einige Fälle von Schreibvorgängen, die dies tun. Lesen Sie den ausgezeichneten Blog-Beitrag Warum gepufferte Schreibvorgänge manchmal blockiert werden . Der überraschendste Fall ist eine kürzlich erfolgte Änderung an Linux, die als "stabile Seitenschreibvorgänge" bezeichnet wird.
quelle