Erstellen einer RAM-Disk unter Linux

70

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 duauf /devgibt 804K.

Ist das das Problem? Kann ich diese /devGröße überwinden ?

Frank
quelle
15
Hast du tmpfs ausprobiert? Es ist ein Dateisystem im RAM, keine Notwendigkeit für ext2. mount -o size=16G -t tmpfs none /mnt/tmpfs
T-8ch
Das hat funktioniert! Vielen Dank! Aber bis jetzt nicht viel Beschleunigung: Ich denke, die Tools, die ich zum Erstellen verwende, verwenden immer noch die reguläre Festplatte. Ich werde mehr Zeug auf die RAM-Scheibe legen.
Frank
3
Das Ablegen der Tools selbst auf der Ramdisk sollte keinen großen Unterschied machen, da der Kernel sie sowieso im RAM zwischenspeichert.
T-8ch
1
@goldilocks Es ist ein anekdotischer Beweis, aber wenn wir unsere Java-Projekte mit Maven kompilieren, gibt es eine erhebliche Beschleunigung bei der Verwendung einer Ramdisk. Ich würde allerdings vermuten, dass dies eher an der Suchzeit als an der Lesezeit liegt.
Rechtschreibung
1
/ dev / shm, eigentlich / run / shm , kann verwendet werden; es ist fast immer da.
Camille Goudeseune

Antworten:

78

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:

mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch
quelle
2
Auf meinem System steht mit nichts in / mnt: ls: kann nicht auf / mnt / tmpfs zugreifen: Keine solche Datei oder kein solches Verzeichnis mount: mount point / mnt / tmpfs existiert nicht. Ist das etwas, worüber man sich Sorgen machen muss? Wenn ich einfach mkdir / mnt / tmpfs mache, hat das den Zweck zunichte (indem ich tmpfs auf der regulären Festplatte erstelle - bitte keine Flammen, ich bin hier ein Anfänger).
Frank
9
Sie benötigen einen Einhängepunkt (Verzeichnis) als Ziel. Nachdem Sie dieses Verzeichnis erstellt haben (Sie können ein beliebiges Verzeichnis verwenden, vorhandene Inhalte werden schattiert), können Sie es mit dem Befehl aus der Antwort einhängen.
T-8ch
1
tmpfsMöglicherweise wird Swap verwendet, was Sie bei einer reinen RAM-Disk wahrscheinlich nicht wollen.
Palswim
2
@RomanSusi tmpfs ist der Dateityp (übergeben nach -t). "none" ist das Backup-Gerät ("disk"), das für tmpfs
t-8ch
1
Es kann erwähnenswert sein, dass die Angabe der Größe optional ist. Der Standardwert ist die Hälfte des Arbeitsspeichers. Das Festlegen einer höheren Größe ist kein Aufwand. Sie müssen lediglich eine Obergrenze festlegen, um sich vor einer versehentlichen Verwendung des gesamten Arbeitsspeichers und dem Töten des Systems zu schützen.
Sourcejedi
20

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 werden makesie 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-Disk tmpfs) kann durchaus zu einer Verlangsamung führen (indem der Build-Speicher eingeschränkt wird, die Dateien auf der RAM-Disk oder tmpfs nicht) direkt von dort verwendet werden).

vonbrand
quelle
1
Was! Wie können sie nicht direkt von dort aus genutzt werden?
Kazark
Sie befinden sich im RAM, jedoch nicht in einem Format, das direkt verwendet werden kann.
Vonbrand
2
Ja wirklich! Wie? (Entschuldigen Sie meine Langsamkeit.)
Kazark
8
@Kazark, um ausführbare Dateien im Speicher zu verwalten, werden spezielle Datenstrukturen verwendet. Da RAM-Disks tmpfsnicht zum Speichern von ausführbaren Dateien verwendet werden (RAM-Disks sind ein Überbleibsel aus der guten alten Zeit quälend langsamer Disketten und tmpfsfür streng temporäre Daten gedacht), hat es niemand für wichtig genug gehalten, die erforderlichen hässlichen Hacks hinzuzufügen.
Vonbrand
7
Ich habe versucht, meinen Rails-Code über ein tmpfs (RAM) -Dateisystem auszuführen, und ich habe überhaupt keinen Unterschied festgestellt. Ich hatte wirklich auf einen spürbaren Unterschied gehofft, aber ich war enttäuscht darüber, wie großartig Linux ist.
Khaja Minhajuddin
6

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.

Bananguin
quelle
Sie verbrauchen eigentlich keinen Speicher, bis Sie ihnen Dinge schreiben. Das Boot-Zeitlimit ist nur das Limit. Auch nach dem Befüllen können Sie den Speicher mit freigeben blockdev --flushbufs.
Psusi
@psusi: kannst du uns dazu mehr informationen geben? Ich kann nur Aussagen finden, die erwähnen, dass ein einmal vom RAM-Datenträger beanspruchter Speicher niemals zurückgefordert wird, z. B. Documentation/blockdev/ramdisk.txtin 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.
Bananguin
Welche Art von Informationen? Wenn Sie den Befehl ausführen, wird der RAM freigegeben, vorausgesetzt, Sie haben ihn noch nicht aktiviert.
Psusi
Woher wissen Sie, dass der Befehl das tut, was Sie sagen? Die Manpage bestätigt dies nicht und die Dokumentation im Kernel-Source-Tree kann so verstanden werden, dass sie Ihren Informationen widerspricht.
Bananguin
6
Ich habe den Quellcode gelesen und überprüft, indem ich ihn ausprobiert habe.
Psusi
3

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:

mount -t tmpfs -o size=200M tmpfs temp/
cd temp/
dd if=/dev/zero of=disk.img bs=1M count=199
losetup /dev/loop0 disk.img
mkfs.ext4 /dev/loop0
mount /dev/loop0 temp2/

Wahrscheinlich ein bisschen Leistungseinbußen durch mehrere verschiedene Ebenen ... aber zumindest funktioniert es.

user39725
quelle
3

Neben tmpfsund ramfsist eine weitere Option das /dev/ram0Blockiergerät. In neueren Ubuntu-Versionen ist dieses Gerät nicht standardmäßig vorhanden, kann jedoch über erstellt werden modprobe brd.

Dieser Ansatz ist vorhersehbarer, da er ein reales ext4Dateisystem 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:

mkdir /ramdisk

modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk

Der rd_nrParameter gibt an, wie viele RAM-Festplatten erstellt werden sollen (standardmäßig werden 16, dh /dev/ram0bis, erstellt /dev/ram15). Der rd_sizeParameter 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 brdKernelmodul:

umount /ramdisk
modprobe -r brd

Erstellen eines Blockgeräts im Inneren ramfs

Alternativ können Sie ein Blockgerät erstellen in ramfs:

mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage

truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk

Der truncateBefehl 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:

umount /ramdisk
rm /ramdisk-storage/ramdisk.img

Vergleich mit tmpfsundramfs

Obwohl tmpfsund ramfseffizienter als die Verwendung eines Blockgeräts, sind im Folgenden einige ihrer Nachteile aufgeführt.

tmpfskann auf die Festplatte tauschen. Dies ist effizienter, aber es kann vorkommen, dass Sie eine reine RAM-Festplatte benötigen:

  • Die Dateien, mit denen Sie arbeiten, sind vertraulich (z. B. Dateien von einer verschlüsselten Partition).
  • Sie führen Leistungstests durch und möchten nicht, dass die Festplatten-E / A ein Faktor ist (die SSD-Schreibzeiten können sehr unterschiedlich sein).
  • Sie entpacken eine große Datei und möchten Ihre SSD nicht verschleißen.

ramfsEs 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 dfDienstprogramm gibt keinen Speicherplatzverbrauch an:

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • 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 der ramfsan das Ziel, mein System reagiert nicht mehr. Das cpDienstprogramm füllte anscheinend die Lücken beim Lesen , aber nicht beim Schreiben.

Beide tmpfsund ramfsverhalten sich möglicherweise anders als ein echtes ext4Dateisystem. Das Erstellen eines Blockgeräts im RAM und das Initialisieren mit ext4diesem verhindert dies.

Für einen tieferen Vergleich: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

Joey Adams
quelle
1

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.

CyberWolf64
quelle
1
Nee. "Wenn fs-size kein Suffix hat, wird es als Zweierpotenz-Kilobyte interpretiert." - manmkfs.ext2
sourcejedi
1

Sie können ein ramfsDateisystem 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.

Ramfs ist ein sehr einfaches Dateisystem, das die Disk-Caching-Mechanismen von Linux (den Page-Cache und den Dentry-Cache) als dynamisch anpassbares RAM-basiertes Dateisystem exportiert.

- 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. ramfsbeschleunigt werden. Eine andere Strategie ist, zu versuchen, fsync()mit eatmydata/ zu deaktivieren nosync.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

tmpfsFunktioniert genauso wie ramfs, 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 z df. B. im Befehl richtig verwendet wird . Ich bin nicht sicher, warum dieser Unterschied besteht. Die Größenbeschränkung in tmpfsschü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.

sourcejedi
quelle