Wie konfiguriere ich Linux, um Dateimetadaten vor Inhalten zu zwischenspeichern?

14

Ich möchte das System so einrichten, dass der Großteil des Arbeitsspeichers für das Zwischenspeichern von Metadaten im Dateisystem verwendet wird, aber nur eine relativ kleine Menge für das Lesen / Schreiben von Zwischenspeichern und das Vorabrufen von Dateien. Im Idealfall möchte ich das Dateisystem durchsuchen können (soweit es in den Arbeitsspeicher passt), ohne die Festplatten hochzufahren, bis ich tatsächlich eine Datei öffne.

Hier sind die Details:

Ich habe einen selbstgemachten Dateiserver. Es hat fünf Festplatten in einem LVM-Volume um 9 TB, aber nur 4 GB RAM. Da der Server nicht viel anderes tut, als Dateien bereitzustellen, wird der größte Teil des Arbeitsspeichers für das Caching verwendet. ("Kostenlos" meldet 3,4 G von 3,9 G, die für den Cache verwendet werden.)

Der Server befindet sich in meinem Schlafzimmer, und wenn sich alle Festplatten drehen, macht er genug Lärm, um im Ruhezustand störend zu wirken. (Ich meine nicht Suchgeräusche, sondern nur Drehgeräusche. Die Festplatten sind von verschiedenen Herstellern und Modellen, und ich denke, dass geringfügige Unterschiede in der Drehzahl Störungen verursachen. Keine Festplatte ist für sich allein laut, aber wenn sich einige zusammen drehen, gibt es diese ein leises Geräusch mit einer Sub-Hertz-Periode.) Also habe ich den Server so konfiguriert, dass er die meiste Zeit die Festplatten herunterfährt.

Wenn die Datenträger heruntergefahren werden, wenn ich einen Ordner in meinem Dateimanager öffne, tritt natürlich eine Verzögerung auf, während der Ordner, auf dem sich der Datenträger befindet, hochgefahren wird. Nur das ist keine große Sache. Aber je nachdem, wo ich hinschaue, kann es mehrmals hintereinander vorkommen, dass LVM die Metadaten für jeden Unterordner auf die verschiedenen Datenträger verteilt.

Ich vermute, dass Linux seinen Cache hauptsächlich mit Dateiinhalten und möglicherweise vorab abgerufenen Daten füllt. Das Zwischenspeichern ist über ein paar MB hinaus nicht sehr nützlich, um eine reibungslose Wiedergabe zu gewährleisten. Wenn ich gerade einen Film geschaut habe, werde ich ihn mir wahrscheinlich nicht so schnell wieder ansehen. Das Prefetching ist in meinem Fall nach mehr als ein paar MB ebenfalls völlig nutzlos .

4 GB sollten jedoch ausreichen, um die meisten Metadaten des Dateisystems zwischenzuspeichern, zumindest die Teile, die bereits besucht wurden, damit ich die Dateien durchsuchen kann, ohne die Festplatten hochfahren zu müssen, wenn sich herausstellt, dass sie vorhanden sind Schlafen.

Es würde immer noch eine Verzögerung beim Öffnen der Datei geben, aber das ist in Ordnung. Vergleiche “click; warte ; klicken; warte ; klicken; warte ; abspielen; Anschauen "mit" Klick; klicken; klicken; abspielen; warte ; Uhr". Ersteres ist unglaublich frustrierend; Letzteres wird fast erwartet.

Anmerkungen:

  1. Wenn es darauf ankommt, ist der Kernel 3.2, das Betriebssystem ist Debian, das Volume ist lvm2 und der FS ist ext4.

  2. Der einzige Grund für das Herunterfahren ist Geräusch während der Nacht; der Server läuft sonst ununterbrochen. (Ich habe es so stromsparend wie möglich gemacht.) Die Auslaufverzögerung variiert je nach Tageszeit.

  3. Die Festplatten sind nur für Medien. Das Betriebssystem befindet sich auf einem separaten (kleinen) Flash-Laufwerk. (Das bedeutet, dass alle Verzögerungen beim Hochfahren auf die Daten zurückzuführen sind, nicht nur, weil dafür etwas erforderlich ist /usroder was auch immer. Ich könnte ein paar GB dafür sparen, wenn dies irgendwie bei meinem Problem helfen würde.

  4. Ein angemessener Einfluss auf die Leistung ist keine große Sache. Die Festplatten sind sowieso schneller als mein Netzwerk.

Bogdanb
quelle

Antworten:

10

Informationen zum Zwischenspeichern von Linux finden Sie unter https://www.kernel.org/doc/Documentation/sysctl/vm.txt

Schauen Sie sich insbesondere vfs_cache_pressure an, Sie möchten wahrscheinlich einen wirklich niedrigen Wert oder vielleicht sogar Null (1 klingt für mich allerdings etwas sicherer):

vfs_cache_pressure
------------------

Controls the tendency of the kernel to reclaim the memory which is used for
caching of directory and inode objects.

At the default value of vfs_cache_pressure=100 the kernel will attempt to
reclaim dentries and inodes at a "fair" rate with respect to pagecache and
swapcache reclaim.  Decreasing vfs_cache_pressure causes the kernel to prefer
to retain dentry and inode caches. When vfs_cache_pressure=0, the kernel will
never reclaim dentries and inodes due to memory pressure and this can easily
lead to out-of-memory conditions. Increasing vfs_cache_pressure beyond 100
causes the kernel to prefer to reclaim dentries and inodes.

Möglicherweise möchten Sie auch Änderungen swappinessvornehmen, damit Sie niemals Daten austauschen oder nur in extremen Fällen ändern .

Die drop_cachesOption kann nützlich sein, um die Daten, die nicht mehr zwischengespeichert werden sollen, explizit zu löschen.

Ich bin mir sicher, dass es wahrscheinlich andere Optionen gibt, die helfen könnten. Lesen Sie die Kerneldokumentation.

Um sie anzuwenden, würde ich die Einstellungen, die Sie ändern möchten, /etc/sysctl.confoder was auch immer Ihr Betriebssystem hat, um sie beim Booten wiederherzustellen.

Kyle
quelle
3
Guter Beitrag, aber Sie möchten angesichts des OP-Ziels so viel wie möglich tauschen. Durch das Auslagern wird nur der Benutzerspeicher belastet, sodass die Tendenz zum Auslagern auf die Festplatte zunimmt und den Caches mehr physischer Speicher zur Verfügung steht. Steigender Swappiness gibt Speicher frei, kann aber Anwendungen verlangsamen, wenn er zu stark erhöht wird (das Bestimmen des Sweetspots ist im Grunde eine iterative Guestimation)
Bratchley,
Hallo Kyle, danke für die Idee. vfs_cache_pressure funktioniert, aber es ist nicht genug. Hier ist, was ich getan habe:
Bogdanb
Wenn ich vcp auf 0 setze, wenn ich a tue find / -ls > /dev/null, dann die Festplatten herunterfahre und dann findalle Dateien erneut, werden die Festplatten nicht hochfährt. freezeigt dabei Puffer, die auf ca. 202MB ansteigen. Aber, wenn ich das find, dann cat /file/bigger/than/ram > /dev/null, dann freezeigt cachedsteigenden den leeren Raum zu füllen, und aus irgendeinem Grunde buffersgeht bis etwa 195MB nach unten. Dann, wenn ich die Scheiben findrunterdrehe und das nochmal mache, drehen sich die Scheiben immer noch hoch :-(
bogdanb
Info swappiness: Es ist auf den Standardwert von festgelegt 60, aber der Computer verfügt über keine Swap-Partition. Daher bin ich mir nicht sicher, ob er viel bewirkt. Ich schätze, ich könnte eine Auslagerungsdatei auf dem Flash-Laufwerk ablegen, aber ich habe keine Ahnung, wie es helfen würde oder wie man die Größe ändert.
Bogdanb
1
Linux versucht schlau im Caching zu sein. Ich bin nicht sicher, ob das Setzen von vfs = 0 so funktioniert, wie Sie es erwarten. Ich denke, es würde versuchen, diese anderen Einträge zurückzugewinnen, wenn Druck von Anwendungen (dh malloc ()) mehr Speicher anfordert. Was die Möglichkeit angeht, Linux anzuweisen, nicht mehr als 2 GB für Caches zu verwenden, weiß ich nichts davon. In den meisten Fällen würde RAM verschwendet. Eine andere Sache, die Sie sich ansehen sollten, ist der "Laptop-Modus", der versucht, die Dinge anders zu machen, um die Festplatten für Laptops herunterzufahren. Ich habe es aber nicht benutzt, deshalb weiß ich nicht viel darüber.
Kyle