Frage Caching / Preloading von Dateien unter Linux in RAM


Ich habe einen ziemlich alten Server, der 4 GB RAM hat und es ist ziemlich viel die gleichen Dateien den ganzen Tag, aber es tut so von der Festplatte, während 3 GB RAM "frei" sind.

Jeder, der jemals versucht hat, eine Ram-Drive zu fahren, kann Zeuge sein, dass es ist genial in Bezug auf die Geschwindigkeit. Die Speicherauslastung 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 nutzen.

  • Ist es möglich, das Dateisystem anzuweisen, bestimmte Dateien immer aus dem RAM zu bedienen?
  • Gibt es noch andere Methoden, die ich verwenden kann, um die Lesefähigkeiten von Dateien mithilfe von RAM zu verbessern?

Genauer gesagt, ich suche hier keinen "Hack". Ich möchte mit Dateisystemaufrufen die Dateien aus dem Arbeitsspeicher bereitstellen, ohne ein RAM-Laufwerk erstellen zu müssen, und die Dateien manuell dorthin kopieren. Oder zumindest ein Skript, das das für mich tut.

Mögliche Anwendungen sind hier:

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

Irgendwelche Ideen?

Bearbeiten:

  • Fand das sehr informativ: Der Linux Page Cache und Pdflush
  • Wie Zan darauf hingewiesen hat, ist die Erinnerung nicht wirklich frei. Was ich meine ist, dass es nicht von Anwendungen verwendet wird und ich kontrollieren möchte, was im Speicher zwischengespeichert werden soll.

60
2017-07-21 07:01


Ursprung


Ich suche auch etwas in dieser Richtung. Ich denke nicht, dass das allgemeine Blockieren des Festplattenblocks im Dateisystem die Antwort ist. Angenommen, ich möchte, dass der Festplattenblock X immer zwischengespeichert wird. Etwas greift darauf zu und der Kernel speichert es. So weit, so gut, aber der nächste Prozess will Block Y, also verwirft der Kernel meinen Block X und speichert stattdessen Y. Der nächste Prozess, der X will, muss warten, bis er von der Platte kommt; das möchte ich vermeiden. Was ich möchte (und was ich denke, das ursprüngliche Poster ist auch nach) ist, einen Write-Through-Cache auf ein Dateisystem zu überlagern, das garantiert, dass die Dateien immer sind
Angesichts der Tatsache, dass der Konsens zu sein scheint, dass Linux bereits häufig verwendete Dateien für Sie zwischenspeichern sollte, frage ich mich, ob Sie mit dem hier gefundenen Rat tatsächlich Verbesserungen erzielen konnten. Es scheint mir, dass das manuelle Steuern des Zwischenspeicherns nützlich sein könnte, um den Cache aufzuwärmen, aber mit dem von Ihnen beschriebenen Verwendungsmuster ("den ganzen Tag die gleichen Dateien liefern") würde es einem bereits aufgewärmten Server nicht helfen viel, wenn überhaupt. - Nate C-K
Sie sagen, dass Sie nicht nach einem Hack suchen, aber Linux tut bereits, was Sie standardmäßig tun wollen. Die folgende Gleichung: "den ganzen Tag die gleichen Dateien bereitstellen" + "dem Dateisystem mitteilen, immer bestimmte Dateien aus dem RAM zu bedienen" entspricht definitionsgemäß "Hack". Sch 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 dieser Nach meiner Erfahrung liest Linux Cache den bejeezus aus deinem Dateisystem. - Mike S
Zur Klarstellung, Linux macht Cache-Dateien, aber die Metadaten werden für jede Datei für jede Anfrage validiert. Auf rotierendem Rost, auf einem vielbeschäftigten Webserver mit vielen kleinen Dateien, kann das immer noch IO-Konflikte verursachen und Laufwerke vorzeitig abnutzen. Statischer Inhalt und Skripte können rsync in / dev / shm sein oder ein benutzerdefiniertes tmpfs-Mounten beim App-Start. Ich habe das für ein paar Jahrzehnte getan und meine Antriebe verschleißen nicht vorzeitig. Auch meine Standorte halten auf diese Weise viel besser stand. Dies hilft bei allem, von der teuersten Enterprise-Hardware bis zur Hardware für die Commodity. - Aaron


Antworten:


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

Höhepunkte:

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

vmtouch Handbuch

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

Example 5

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

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

EDIT2: Wie bemerkt In den Kommentaren gibt es jetzt ein Git-Repository verfügbar.


45
2017-09-01 21:40



Versuchen Sie für zukünftige Zuschauer, den vmtouch zu verwenden Git-Repository anstatt den Anweisungen auf der verlinkten Seite zu folgen. Auf diese Weise erhalten Sie ein Makefile und können Updates abrufen. - randomous
Es scheint, dass die Größe der Datei begrenzt ist (4 GB). Gibt es noch eine Alternative? - Alix Axel


Dies ist auch möglich mit dem vmtouch Virtueller Speicher-Toucher Nützlichkeit.

Mit diesem Tool können Sie den Dateisystemcache auf einem Linux-System steuern. Sie können eine bestimmte Datei oder ein bestimmtes Verzeichnis im VM-Cachesubsystem erzwingen oder sperren oder verwenden, um zu prüfen, welche Teile einer Datei / eines Verzeichnisses in 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

24
2017-10-23 16:50



Dies ist ein großartiges Dienstprogramm und genau das, was OP angefordert hat. Wenn er das nur als Antwort akzeptieren würde. - laebshade
Weißt du, ob das mit ZFS funktioniert? - CMCDragonkai
@ CMCDragonkai Ich denke nicht, dass es mit ZFS notwendig ist ... Think: ARC und L2ARC. - ewwhite


Nach einigem Lesen der 2.6-Kernel-Swapping- und Page-Caching-Funktionen habe ich 'fcoretools' gefunden. Welches besteht aus zwei Werkzeugen;

  • fincore: Gibt an, wie viele Seiten die Anwendung im Hauptspeicher gespeichert hat
  • fadvise: Erlaubt das Bearbeiten des Kernspeichers (Seiten-Cache).

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


17
2017-07-21 08:09



Ich dachte, da wäre ein Programm, um das irgendwo zu machen. +1 - Brad Gilbert


Der Trick eines armen Mannes, Sachen in den Cache des Dateisystems zu bekommen, besteht darin, es einfach zu catchen und es nach / dev / null umzuleiten.


16
2017-07-21 07:19



Zustimmen. Und wenn Sie sicherstellen möchten, dass bestimmte Dateien zwischengespeichert werden, machen Sie einen Cron-Job, der cats die Datei regelmäßig nach / dev / null - Josh


Linux speichert soviel Festplatten-IO im Speicher wie möglich. Dies sind die Werte für den Cache und den Pufferspeicher. Es wird wahrscheinlich einen besseren Job machen als Sie die richtigen Dinge zu speichern.

Wenn Sie jedoch darauf bestehen, Ihre Daten im Speicher zu speichern, können Sie entweder mit tmpfs oder ramfs ein RAM-Laufwerk erstellen. Der Unterschied besteht darin, dass ramfs den gesamten von Ihnen angeforderten Speicher zuweist, da tmpfs nur den Speicher verwendet, den Ihr Blockgerät verwendet. Meine Erinnerung ist ein wenig eingerostet, aber Sie sollten in der Lage sein zu tun:

 # mount -t ramfs ram /mnt/ram 

oder

 # mount -t tmpfs tmp /mnt/tmp

und kopieren Sie dann Ihre Daten in das Verzeichnis. Offensichtlich gehen Ihre Daten verloren, wenn Sie den Computer ausschalten oder die Partition aushängen.


15
2017-07-21 07:17



Danke für deine Antwort, aber das ist offensichtlich, was ich vermeiden möchte. Sonst würde ich es nur skripten, damit der Computer den Ramdrive erstellt, die Dateien kopiert und symbolisch mit dem Ramdrive verbindet. Aber dann sind meine Daten inkonsistent. Ich habe auf ein Dateisystem gehofft, in dem ich bestimmte Dateien "markieren" kann, die im Speicher zwischengespeichert werden. Aber vielleicht bin ich ein bisschen zu optimistisch. - Andrioid
Sie "markieren" Dateien, die zwischengespeichert werden sollen, indem Sie auf sie zugreifen. - womble♦
Wenn es nur eine Möglichkeit gäbe, die am häufigsten verwendeten Dateien automatisch zu markieren. - David Pashley
Blimey, Sarkasmus ist nicht gut reisen :) - David Pashley
Ja Dankeschön. Ich verstehe das Konzept des IO-Caching. Sch 100 100 sch sch sch sch sch sch sch sch 100 dieser sch 100 sch sch sch dieser sch 100 dieser sch 100 sch sch sch sch sch sch sch sch sch sch sch sch sch sch zwischen sch sch dieser 100 dieser Scheint, du hast den subtilen Kommentar nicht gelesen, dass es Sarkasmus war. - David Pashley


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

Swappiness

teilt Linux-Kernel mit, wie aggressiv es Swap verwenden soll. Zitat aus dem Wikipedia-Artikel:

Swappiness ist eine Eigenschaft des Linux-Kernels, die die Balance zwischen dem Auslagern von Runtime-Speicher und dem Löschen von Seiten aus dem System-Seiten-Cache ändert. Swappiness kann auf Werte zwischen 0 und 100 inklusive gesetzt werden. Ein niedriger Wert bedeutet, dass der Kernel versucht, so viel wie möglich zu vertauschen, wo ein höherer Wert stattdessen den Kernel aggressiv versucht, Swap Space zu verwenden. Der Standardwert ist 60, und bei den meisten Desktop-Systemen kann die Einstellung auf 100 die Gesamtleistung beeinflussen, während die niedrigere (sogar 0) die Interaktivität verbessern kann (Verringerung der Reaktionslatenz.)

vfs_cache_pressure

Zitat von vm.txt:

Steuert die Tendenz des Kernels, den Speicher wiederzugewinnen, der für verwendet wird   Zwischenspeichern von Verzeichnis- und Inode-Objekten.

Bei dem voreingestellten Wert von vfs_cache_pressure = 100 versucht der Kernel   - Denien und Inodes zu einem "fairen" Preis in Bezug auf Pagecache und   Swapcache zurückfordern. Das Verringern von vfs_cache_pressure bewirkt, dass der Kernel dies bevorzugt   Dentry- und Inode-Caches beibehalten. ...


Indem man es einstellt swappiness hoch (wie 100), verschiebt der Kernel alles, was er nicht austauschen muss, und gibt RAM frei, um Dateien zwischenzuspeichern. Und durch Einstellung vfs_cache_pressure niedriger (sagen wir zu 50, nicht zu 0!), wird es Caching-Dateien bevorzugen, anstatt Anwendungsdaten im RAM zu halten.

(Ich arbeite an einem großen Java-Projekt, und jedes Mal, wenn ich es ausführte, brauchte ich viel Arbeitsspeicher und löschte den Festplatten-Cache. Als ich das nächste Mal das Projekt kompilierte, wurde alles wieder von der Festplatte gelesen um die Quellen und die kompilierte Ausgabe im Arbeitsspeicher zwischenzuspeichern, was den Prozess erheblich beschleunigt.)


5
2017-10-23 16:17





Ich bezweifle sehr, dass es tatsächlich Dateien von der Festplatte mit 3 GB freiem RAM versorgt. Linux-Datei-Caching ist sehr gut.

Wenn Sie Festplatten-IO sehen, würde ich in Ihre Protokollierungskonfigurationen schauen. Viele Protokolle werden als ungepuffert gesetzt, um sicherzustellen, dass die neuesten Protokollinformationen im Falle eines Absturzes verfügbar sind. Verwenden Sie in Systemen, die unabhängig sein müssen, gepufferte Protokoll-E / A oder verwenden Sie einen Remote-Protokollserver.


2
2017-07-21 07:11



Richtig du bist, ich will nur kontrollieren, was zwischengespeichert wird. - Andrioid


Wenn Sie viel Speicher haben, können Sie einfach die Dateien einlesen, die Sie mit cat o.ä. zwischenspeichern möchten. Linux wird dann einen guten Job machen, es herumzuhalten.


2
2017-07-21 07:44