Ich weiß, dass ich alles aus dem Linux-Dateisystem-Cache löschen kann , aber gibt es eine Möglichkeit, nur eine bestimmte Datei zu löschen? Oder verhindern, dass eine Datei zwischengespeichert wird? Oder weisen Sie einen Prozess an, keine Dateien zwischenzuspeichern, die er schreibt?
Ich habe einen Prozess, der viele kleine Dateien liest und eine große Datei schreibt. Ich möchte die kleinen Dateien im Cache behalten, um Festplatten-Suchvorgänge zu vermeiden, und es ist mir egal, ob ich die große Datei zwischenspeichere.
linux
files
filesystems
cache
Jay Hacker
quelle
quelle
Antworten:
Mögliche Methode # 1 - F_DROP_CACHES
Ich habe eine Methode aus dem Jahr 2012 gefunden, die einen vorgeschlagenen Patch für den Linux-Kernel in diesem E-Mail-Thread mit dem Titel: Re: [RFC-Patch] fs: Implementiere Drop-Caches pro Datei .
AuszugDer Faden umfasst sowohl einen Testfall und die aktuelle Patch auf mehrere Dateien innerhalb des Linux - Kernels, die eine zusätzliche Funktion fügt
fs/drop_caches.c
genanntdrop_pagecache_file(struct file *filp)
. Diese Funktion ist dann über das Frontend-Toolfnctl.c
über den Befehl zugänglichF_DROP_CACHES
. Dieser Fall ruft diese Funktion auf:Welches behandelt das Löschen aller Caches, die mit der angegebenen Datei verbunden sind. Aus der Datei
Das kann also genutzt werden?include/linux/mm.h
:Ich habe keine Hinweise darauf gefunden, dass dieser Patch jemals in das Haupt-Kernel-Code-Repository von Linux gelangt ist. Daher scheint diese Option nur verfügbar zu sein, wenn Sie bereit sind, den Linux-Kernel selbst neu zu kompilieren.
Mögliche Methode 2 - Verwenden von dd
In demselben Thread erwähnt ein anderer Benutzer eine völlig andere Methodik, die verwendet wird
Das Folgende ist ein Auszug aus dieser E-Mail Testen Sie es ausdd
.Ich war nicht zu 100% sicher, wie ich das testen sollte, aber ich kam auf den folgenden Ansatz.
Erstellen Sie eine 100-MB-Datei
Trace-Dateizugriffe mit
fatrace
Laufen Sie,
top
damit wir die Speichernutzung überwachen können.Datei öffnen, Speicherplatz jetzt merken. Beachten Sie die
fatrace
der Dateisample.txt
.Löschen Sie die Datei aus dem Speicher und notieren Sie sich den freien Speicherplatz. Beachten Sie die Ausgabe von
fatrace
.Beispiel
Im Terminal 1: Im Terminal 2: Im Terminal 3: Öffnen Sie nun die Dateisample.txt
und notieren Sie die Größe des Arbeitsspeichers. Im Terminal Nr. 1. Im Terminal 2: Beachten Sie die Ausgabe vonfatrace
in Terminal 3: Entfernen Sie nun die Datei aus dem RAM in Terminal 4: Beachten Sie die Ausgabe vonfatrace
in Terminal # 2: Beachten Sie den RAM in Terminal 3:Es scheint also, dass alles, was von der Datei im RAM verbraucht wurde, freigegeben wird.
Mögliche Methode # 3 - Python-Fadvise
Dank eines Kommentars von @frostchutz gibt es ein anderes Tool, ein Python-Skript mit dem Namen
Beispiel[pyadvise][4]
, das eine viel einfachere Oberfläche als die oben genanntendd
Methoden bietet . Dieses Skript verwendet dieselbeposix_fadvise(2)
Schnittstelle.Und wenn wir den obigen Test wiederholen und
pyadvise
anstelle vondd
:Ich bemerkte einen identischen Abfall des RAM, der wie vorher verbraucht wurde, als ich benutzte
dd
.quelle
dd
funktioniert bei mir. Ich landete mit chris-lamb.co.uk/projects/python-fadvise mir was dasselbe in einem offensichtlicher Befehl ist.python-fadvise
ist viel einfacher, ich habe ein Beispiel hinzugefügtdd
.os.posix_fadvise()
jetzt in Pythons Standard-Libray.Wenn Sie die Antwort von @geekosaur erweitern, können Sie die Verwendung erzwingen,
O_DIRECT
indem Sie LD_PRELOAD und das Programm hier verwenden: http://arighi.blogspot.com/2007/04/how-to-bypass-buffer-cache-in-linux.htmlDieser Code gilt
O_DIRECT
für alle Dateien. Wenn__do_wrap_open
Sie jedoch einfach etwas mehr strncmp-Logik hinzufügen, können Sie O_DIRECT selektiv anwenden.Haftungsausschluss: Ich habe dies nicht getestet.
quelle
Sie können einzelne Dateien mit dem
O_DIRECT
Flag öffnen (sieheman 2 open
) - lesen Sie den Abschnitt NOTES auf dieser Manpage sorgfältig durch und überlegen Sie, ob Sie auch möchten / brauchenO_SYNC
.quelle
cat
und ich möchte ihn lieber nicht umschreiben. :) Ich hatte auf ein Kommandozeilen-Tool oder einen/proc/sys
Knopf gehofft .open
Flagge. Sie müssten in der Tat ein Programm schreiben, um es zu tun. (cat -u
stdio
Wenn Sie eine Datei zwingen möchten, immer O_SYNC zu verwenden, können Sie sie in den erweiterten Attributen folgendermaßen kennzeichnen
chattr +S $file
:Mann Chattr:
O_SYNC erzwingt das Schreiben der Daten + Metadaten in die Plattenpuffer, durchläuft jedoch weiterhin den Seitencache. O_DIRECT umgeht den Seiten-Cache.
Beachten Sie jedoch, dass das Öffnen mit O_DIRECT die Leistung beeinträchtigen würde. Wenn die große Datei nur angehängt wird, ist der Unterschied möglicherweise gering. Wenn die große Datei jedoch an einer zufälligen Stelle neu geschrieben wird, wird O_DIRECT die Leistung erheblich beeinträchtigen, auch wenn berücksichtigt wird, dass sie möglicherweise im Cache gespeichert ist und einige der kleinen gelesenen Dateien aus dem Cache entfernt werden können.
Wenn Sie den RAM haben, um alle kleinen Dateien dort zu speichern, können Sie das Problem auf die andere Weise angehen. Stellen Sie sicher, dass die kleinen Dateien immer im RAM sind, dann würde ich vorschlagen, sie nach tmpfs zu kopieren :
quelle
chattr +S
ist nicht dasselbe wieO_DIRECT
, es ist dasselbe wieO_SYNC
.O_DIRECT
bewirkt, dass Lesevorgänge nicht zwischengespeichert werden (worum es in dieser Frage geht), und dass Schreibvorgänge nicht ohne Garantie gepuffert werden.O_SYNC
bewirkt, dass nur Schreibvorgänge nicht gepuffert werden.O_DIRECT
aufO_SYNC
ändern, wird Ihre Antwort intern konsistent, in Anbetracht der Frage jedoch immer noch falsch.