Zwischenspeichern / Laden von Dateien unter Linux in den Arbeitsspeicher


74

Ich besitze einen ziemlich alten Server mit 4 GB RAM, der fast den ganzen Tag die gleichen Dateien bereitstellt, dies jedoch von der Festplatte, während 3 GB RAM "frei" sind.

Jeder, der jemals versucht hat, einen Ram-Drive zu fahren, kann bezeugen, dass es in Bezug auf die Geschwindigkeit fantastisch ist . Der Speicherverbrauch dieses Systems ist normalerweise nie höher als 1 GB / 4 GB, daher möchte ich wissen, ob es eine Möglichkeit gibt, diesen zusätzlichen Speicher für etwas Gutes zu verwenden.

  • Kann das Dateisystem angewiesen werden, bestimmte Dateien immer außerhalb des Arbeitsspeichers bereitzustellen?
  • Gibt es andere Methoden, mit denen ich die Lesefähigkeit von Dateien mithilfe des Arbeitsspeichers verbessern kann?

Genauer gesagt, ich suche hier keinen "Hack". Ich möchte, dass Dateisystemaufrufe die Dateien aus dem RAM bedienen, ohne ein RAM-Laufwerk erstellen und die Dateien manuell kopieren zu müssen. Oder zumindest ein Skript, das das für mich erledigt.

Mögliche Anwendungen sind hier:

  • Webserver mit statischen Dateien, die häufig gelesen werden
  • Anwendungsserver mit großen Bibliotheken
  • Desktop-Computer mit zu viel RAM

Irgendwelche Ideen?

Bearbeiten:

  • Fanden das sehr informativ: Der Linux Page Cache und pdflush
  • Wie Zan betonte, ist der Speicher nicht frei. Ich meine, es wird nicht von Anwendungen verwendet und ich möchte steuern, was im Speicher zwischengespeichert werden soll.

1
Ich suche auch etwas in diese Richtung. Ich glaube nicht, dass das allgemeine Block-Caching von Dateisystemen die Antwort ist. Angenommen, ich möchte, dass Festplattenblock X immer zwischengespeichert wird. Etwas greift darauf zu und der Kernel speichert es zwischen. Soweit so gut, aber der nächste Prozess möchte Block Y, also verwirft der Kernel meinen Block X und speichert stattdessen Y zwischen. Der nächste Prozess, bei dem X benötigt wird, muss warten, bis es von der Festplatte kommt. das möchte ich vermeiden. Was ich möchte (und was ich denke, dass das Original-Poster auch danach ist) ist, einen Write-Through-Cache auf ein Dateisystem zu legen, das garantiert, dass die Dateien immer

1
Angesichts der Tatsache, dass der Konsens zu sein scheint, dass Linux häufig verwendete Dateien bereits für Sie zwischenspeichern sollte, frage ich mich, ob Sie es tatsächlich geschafft haben, mithilfe der hier enthaltenen Ratschläge Verbesserungen vorzunehmen. Es scheint mir, dass der Versuch, das Caching manuell zu steuern, nützlich sein könnte, um den Cache aufzuwärmen, aber dass es bei dem von Ihnen beschriebenen Verwendungsmuster ("den ganzen Tag die gleichen Dateien bereitstellen") einem bereits aufgewärmten Server nicht helfen würde viel, wenn überhaupt.
Nate CK

Sie sagen, Sie suchen keinen Hack, aber Linux macht bereits standardmäßig das, was Sie wollen. Die folgende Gleichung: "Den ganzen Tag die gleichen Dateien bedienen" + "weist das Dateisystem an, immer bestimmte Dateien aus dem RAM zu bedienen", entspricht per Definition "Hack". Haben Sie tatsächlich Leistungsverbesserungen festgestellt? Meiner Erfahrung nach ist der Linux-Cache das Beste, was Ihr Dateisystem zu bieten hat.
Mike S

2
Zur Verdeutlichung speichert Linux Dateien im Cache, die Metadaten werden jedoch für jede Datei für jede Anforderung überprüft. Auf einem ausgelasteten Webserver mit vielen kleinen Dateien kann es beim Durchdrehen von Rost zu E / A-Konflikten und vorzeitigem Verschleiß der Laufwerke kommen. Statische Inhalte und Skripte können beim Start der App in / dev / shm oder in einem benutzerdefinierten tmpfs-Mount rsync werden. Ich mache das seit ein paar Jahrzehnten und meine Laufwerke nutzen sich nicht vorzeitig ab. Auf diese Weise halten meine Websites auch starker Burst-Belastung viel besser stand. Dies hilft bei allem, von der teuersten Unternehmenshardware bis zur Standardhardware.
Aaron

Antworten:


57

vmtouch scheint ein gutes Werkzeug für den Job zu sein.

Höhepunkte:

  • fragen Sie ab, wie viel von einem Verzeichnis zwischengespeichert wird
  • Abfrage, wie viel von einer Datei zwischengespeichert wird (auch welche Seiten, grafische Darstellung)
  • Laden Sie die Datei in den Cache
  • Datei aus dem Cache entfernen
  • Dateien im Cache sperren
  • Als Daemon ausführen

vmtouch manual

BEARBEITEN: Die in der Frage gestellte Verwendung ist in Beispiel 5 auf vmtouch Hompage aufgeführt

Example 5

Daemonise and lock all files in a directory into physical memory:

vmtouch -dl /var/www/htdocs/critical/

EDIT2: Wie in den Kommentaren vermerkt , ist jetzt ein Git-Repository verfügbar.


5
Versuchen Sie für zukünftige Betrachter, das vmtouch git-Repository zu verwenden, anstatt den Anweisungen auf der verknüpften Seite zu folgen. Auf diese Weise erhalten Sie ein Makefile und können Updates abrufen.
zufällige

Scheint, dass die Größe der Datei (4 GB) begrenzt ist. Gibt es eine andere Alternative?
Alix Axel

Ok, hier ist mein aktueller Anwendungsfall: ein RPi1 mit einer alten SD-Karte, irgendwo da draußen, wo man Sachen macht. Bevor ich dorthin reisen und die Karte (und möglicherweise das Netzteil) austauschen kann, möchte ich, dass das Betriebssystem die Karte sparsam berührt, am besten nie. Der FS-Cache ist gut, liegt aber außerhalb meiner Kontrolle. / bin und / sbin sind bereits auf tmpfs, / home / user zu bekommen hat ebenfalls andere Nachteile. vmtouchpasst gut in diese Nische.
Piskvor

wie funktioniert vmtouch anders als tmpfs?
Edward Torvalds

26

Dies ist auch möglich , die Verwendung von vmtouch Virtual Memory Toucher Dienstprogramm .

Mit diesem Tool können Sie den Dateisystem-Cache auf einem Linux-System steuern. Sie können eine bestimmte Datei oder ein bestimmtes Verzeichnis im VM-Cache-Subsystem erzwingen oder sperren oder damit überprüfen, welche Teile einer Datei / eines Verzeichnisses in der VM enthalten sind.

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

Oder...

Let's bring the rest of big-dataset.txt into memory...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds

3
Dies ist ein großartiges Dienstprogramm und macht genau das, was OP verlangt. Wenn er dies nur als Antwort akzeptieren würde.
Laebshade

Wissen Sie, ob dies mit ZFS funktioniert?
CMCDragonkai

1
@CMCDragonkai Ich denke nicht, dass es mit ZFS notwendig ist ... Denken Sie: ARC und L2ARC .
Ewwhite

22

Der Trick eines armen Mannes, Dinge in den Dateisystem-Cache zu bekommen, besteht darin, sie einfach zu katerisieren und sie nach / dev / null umzuleiten.


1
Zustimmen. Wenn Sie sicherstellen möchten, dass bestimmte Dateien zwischengespeichert werden, caterstellen Sie in regelmäßigen Abständen einen Cron-Job, in dem die Datei in / dev / null abgelegt wird
Josh,

18

Linux speichert so viel Festplatten-IO wie möglich im Arbeitsspeicher. Dies sind die Cache- und Pufferspeicherstatistiken. Es wird wahrscheinlich besser funktionieren als Sie, wenn Sie die richtigen Dinge aufbewahren.

Wenn Sie jedoch darauf bestehen, Ihre Daten im Arbeitsspeicher zu speichern, können Sie ein RAM-Laufwerk mit tmpfs oder ramfs erstellen. Der Unterschied besteht darin, dass RAMFS den gesamten von Ihnen angeforderten Speicher zuweist, da tmpfs nur den Speicher verwendet, den Ihr Block-Gerät verwendet. Mein Gedächtnis ist ein wenig verrostet, aber Sie sollten in der Lage sein, Folgendes zu tun:

 # mount -t ramfs ram /mnt/ram 

oder

 # mount -t tmpfs tmp /mnt/tmp

und dann kopieren Sie Ihre Daten in das Verzeichnis. Offensichtlich gehen Ihre Daten verloren, wenn Sie den Computer ausschalten oder die Bereitstellung dieser Partition aufheben.


1
Vielen Dank für Ihre Antwort, aber das ist offensichtlich, was ich vermeiden möchte. Andernfalls würde ich einfach ein Skript erstellen, damit der Computer das RAM-Laufwerk erstellt, die Dateien kopiert und symbolisch eine Verknüpfung zum RAM-Laufwerk herstellt. Aber dann sind meine Daten inkonsistent. Ich habe auf ein Dateisystem gehofft, in dem ich bestimmte Dateien markieren kann, die im Speicher zwischengespeichert werden sollen. Aber vielleicht bin ich ein bisschen zu optimistisch.
Andrioid

3
Sie "markieren" Dateien, die zwischengespeichert werden sollen, indem Sie darauf zugreifen.
womble

9
Wenn es nur eine Möglichkeit gäbe, die am häufigsten verwendeten Dateien automatisch zu markieren.
David Pashley

4
Blimey, Sarkasmus nicht gut reisen tut es :)
David Pashley

2
Ja Dankeschön. Ich verstehe das Konzept des IO-Caching. Ich habe es sogar in meiner Antwort erklärt. Anscheinend haben Sie den subtilen Kommentar nicht gelesen, dass es Sarkasmus war.
David Pashley

18

Nach einigem gründlichen Lesen der 2.6er Kernel-Swap- und Page-Caching-Funktionen habe ich 'fcoretools' gefunden. Welches besteht aus zwei Werkzeugen;

  • fincore: Zeigt an, wie viele Seiten die Anwendung im Hauptspeicher gespeichert hat
  • fadvise: Ermöglicht die Manipulation des Kernspeichers (Seiten-Cache).

(Falls jemand anderes dies interessant findet, poste ich dies hier)


1
Ich nahm an, dass es irgendwo ein Programm dafür gibt. +1
Brad Gilbert

7

Es gibt zwei Kernel-Einstellungen, die auch ohne Verwendung anderer Tools erheblich helfen können:

swappiness

teilt dem Linux-Kernel mit, wie aggressiv er Swap verwenden soll. Zitiert den Wikipedia-Artikel:

Swappiness ist eine Eigenschaft für den Linux-Kernel, die das Gleichgewicht zwischen dem Auslagern des Laufzeitspeichers und dem Löschen von Seiten aus dem Systemseiten-Cache ändert. Swappiness kann auf Werte zwischen 0 und 100 eingestellt werden. Ein niedriger Wert bedeutet, dass der Kernel versucht, das Auslagern so weit wie möglich zu vermeiden, während ein höherer Wert den Kernel dazu veranlasst, den Auslagerungsbereich aggressiv zu nutzen. Der Standardwert ist 60, und bei den meisten Desktopsystemen kann eine Einstellung auf 100 die Gesamtleistung beeinträchtigen, während eine niedrigere Einstellung (sogar 0) die Interaktivität verbessern kann (Verringerung der Antwortlatenz).

vfs_cache_pressure

Zitat aus vm.txt :

Steuert die Tendenz des Kernels, den zum Zwischenspeichern von Verzeichnis- und Inode-Objekten verwendeten Speicher zurückzugewinnen.

Bei dem Standardwert von vfs_cache_pressure = 100 versucht der Kernel, Einträge und Inodes mit einer "fairen" Rate in Bezug auf die Pagecache- und Swapcache-Rückforderung zurückzufordern. Wenn Sie vfs_cache_pressure verringern, zieht der Kernel es vor, Dentry- und Inode-Caches beizubehalten. ...


Durch Setzen von swappinesshigh (wie 100) verschiebt der Kernel alles, was nicht ausgetauscht werden muss, wodurch RAM für das Zwischenspeichern von Dateien frei wird. Wenn Sie eine vfs_cache_pressureniedrigere Einstellung wählen (sagen wir 50, nicht 0!), Werden die Dateien im Cache gespeichert, anstatt die Anwendungsdaten im RAM zu belassen.

(Ich arbeite an einem großen Java-Projekt, und jedes Mal, wenn ich es ausführe, hat es viel RAM beansprucht und den Festplatten-Cache geleert. Beim nächsten Kompilieren des Projekts wurde also alles erneut von der Festplatte gelesen. Durch Anpassen dieser beiden Einstellungen verwalte ich um die Quellen und die kompilierte Ausgabe im RAM zwischenzuspeichern, was den Prozess erheblich beschleunigt.)


3

Ich bezweifle sehr, dass es sich tatsächlich um Dateien von der Festplatte mit 3 GB RAM handelt. Das Zwischenspeichern von Linux-Dateien ist sehr gut.

Wenn Sie Datenträger-E / A sehen, würde ich Ihre Protokollierungskonfigurationen untersuchen. Viele Protokolle werden als ungepuffert festgelegt, um sicherzustellen, dass im Falle eines Absturzes die neuesten Protokollinformationen verfügbar sind. Verwenden Sie in Systemen, die dennoch schnell sein müssen, gepufferte Protokoll-E / A-Vorgänge oder einen Remote-Protokollserver.


Richtig, ich möchte nur steuern, was zwischengespeichert wird.
Andrioid

3

Wenn Sie viel Speicher haben, können Sie einfach die Dateien einlesen, die Sie mit cat oder ähnlichem zwischenspeichern möchten. Linux wird dann einen guten Job machen, um es am Laufen zu halten.


3

Möglicherweise können Sie ein Programm haben, das nur mmapIhre Dateien enthält und dann ausgeführt wird.


3
Soweit ich das beurteilen kann, ist das so ziemlich das, was 'fadvise' (fcoretools) macht.
Andrioid

0

Es gibt verschiedene RAMFS-Systeme, die Sie verwenden können (z. B. RAMFS, TMPFS). Wenn jedoch Dateien tatsächlich so oft gelesen werden, befinden sie sich in Ihrem Dateisystem-Cache. Wenn Ihr Arbeitsspeicher größer ist als Ihr freier Arbeitsspeicher, werden die Dateien gelöscht. Wenn Ihr Arbeitsspeicher jedoch größer ist als Ihr freier Arbeitsspeicher, können Sie auch nicht alles in eine RAM-Disk einbauen.

Überprüfen Sie die Ausgabe des Befehls "free" in einer Shell. Der Wert in der letzten Spalte unter "Cached" gibt an, wie viel von Ihrem freien RAM für den Dateisystem-Cache verwendet wird.


0

Stellen Sie bei Ihrer letzten Frage sicher, dass sich Ihr RAM auf verschiedenen Speicherkanälen befindet, damit der Prozessor die Daten parallel abrufen kann.


0

Ich denke, dies könnte auf Anwendungsebene besser gelöst werden. Zum Beispiel gibt es dafür wahrscheinlich spezialisierte Webserver, oder Sie könnten mod_cache mit Apache in Betracht ziehen . Wenn Sie ein bestimmtes Ziel haben, beispielsweise das schnellere Bereitstellen von Webinhalten, können Sie Verbesserungen erzielen, die ich denke.

Ihre Frage ist jedoch allgemeiner Natur. Das Linux-Speichersubsystem wurde entwickelt, um die bestmögliche allgemeine Nutzung des Arbeitsspeichers zu gewährleisten. Wenn Sie auf bestimmte Leistungstypen abzielen möchten, ziehen Sie in Betracht, alles in / proc / sys / vm nachzuschlagen.

Das Paket fcoretools ist interessant, ich würde mich für Artikel über seine Anwendung interessieren ... Dieser Link beschreibt die tatsächlichen Systemaufrufe, die in einer Anwendung verwendet werden.


1
find / var / lib / mysql | xargs fadvise -willneed (schmutzig, aber es sollte einen schnelleren Zugriff auf die Datenbankdateien bieten; als Beispiel)
Andrioid

Sehr guter Hack, aber ein solcher Hack deaktiviert nicht viele wartende fsyncs von mysql :( fsyncs werden benötigt, um ACID (Atomicity, Consistency, Isolation, Durability) zu gewährleisten.
osgx

0

Desktop-Computer (z. B. Ubuntu) verwenden bereits das Vorabladen von Dateien (zumindest gängige gemeinsam genutzte Bibliotheken), um beim Booten Speicherplatz freizugeben. Es wird verwendet, um das Booten und Starten verschiedener Bloarware wie FF, OO, KDE und GNOME (mit dem evolution bloat-mailer) zu beschleunigen .

Das Tool heißt readahead http://packages.ubuntu.com/dapper/admin/readahead

Es gibt auch einen entsprechenden Syscall: readahead (2) http://linux.die.net/man/2/readahead

Es gibt auch ein Projekt zum Vorladen des Daemons: http://linux.die.net/man/8/preload



0

Ich habe gerade versucht, dd if = / dev / yourrootpartition von = / dev / null \ bs = 1Mcount = wievielMemoryyouwanttofill

Es gibt mir nicht die Kontrolle, die Sie wünschen, aber es versucht zumindest, verschwendeten Speicher zu nutzen


0

Ich benutze find / -name stringofrandomcharacter es hilft viel


0

Nicht genau was gefragt wurde, aber ich benutze

find BASE_DIRECTORY -type f -exec cat {}> / dev / null \;

um die Initialisierung von Dateien in einem AWS-Volume auszulösen, das aus einem Snapshot erstellt wurde. Es ist fokussierter als die offizielle Empfehlung, dd zu verwenden, wenn Sie nur einige Dateien lesen möchten.


-1

Manchmal möchte ich vielleicht Dateien in einem bestimmten Ordner und dessen Unterordnern zwischenspeichern. Ich gehe einfach in diesen Ordner und führe Folgendes aus:

finden . -exec cp {} / dev / null \;

Und diese Dateien werden zwischengespeichert

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.