2016-05-03 15 views
1

Ich habe einen Prozess, der Tausende von kleinen Dateien einmal liest. Die zwischengespeicherten Daten werden danach nicht benötigt. Der Prozess wird mit voller Geschwindigkeit ausgeführt, bis der meiste Speicher vom Dateicache belegt ist und dann langsamer wird. Ich verstehe die Verlangsamung nicht, da das Freigeben des Cache-Speichers und das Zuweisen von Speicherplatz für die nächste Datei eine Angelegenheit von Mikrosekunden sein sollte. Harte Seitenfehler erhöhen sich ebenfalls, wenn dieser Schwellenwert erreicht wird. Das Betriebssystem ist Vanilla Ubuntu 16.04.Stop-Datei-Caching für einen Prozess und seine Kinder

Ich möchte die Datei-Caching für diesen Prozess nur beschränken.

Dies ist ein Benutzerprozess. Daher ist die Verwendung eines privilegierten Shell-Befehls zum Löschen des Caches keine Lösung. Die Verwendung von fadvise auf Dateiebene ist keine Lösung, da die Dateien je nach Dateityp von mehreren Bibliotheksprogrammen gelesen werden.

Was ich brauche, ist eine Prozess-Level-Option: Cache nicht, oder setzen Sie eine niedrige Größenbeschränkung wie 100 MB. Ich habe danach gesucht und nichts gefunden. Ist das wirklich der Fall? Scheint wie etwas Großes, das fehlt.

Haben Sie einen Einblick in das offensichtliche Problem der Speicherverwaltung?

+0

Wenn die Dateien/Puffer nicht verschmutzt sind, kostet das Caching nichts. Wann immer Speicher knapp wird, können die Puffer für andere Zwecke (entweder als Arbeitsspeicher oder für andere Puffer) ohne zusätzliche Kosten zurückgewonnen werden. – wildplasser

Antwort

0

Hier ist die strikte Antwort auf Ihre Frage. Wenn Sie mmap -ing Ihre Dateien sind, die Art und Weise, dies zu tun ist mit madvise() und MADV_DONTNEED:

MADV_DONTNEED 
      Do not expect access in the near future. (For the time being, 
      the application is finished with the given range, so the ker‐ 
      nel can free resources associated with it.) Subsequent 
      accesses of pages in this range will succeed, but will result 
      either in reloading of the memory contents from the underlying 
      mapped file (see mmap(2)) or zero-fill-on-demand pages for 
      mappings without an underlying file. 

Es ist meines Wissens keine Möglichkeit, es mit Dateien zu tun, die einfach geöffnet werden, gelesen (mit read() oder ähnlich) und geschlossen.

Allerdings klingt es für mich so, als wäre es nicht das Problem. Sind Sie sicher, dass es Puffer/Cache ist, der hier wächst, und nicht etwas anderes? (ZB vielleicht werden Sie sie in dem RAM zu lesen und nicht, dass die RAM zu befreien, oder nicht schließt sie, oder ähnliches)

Sie können sagen, tun:

echo 3 > /proc/sys/vm/drop_caches 

, wenn Sie nicht alle zurück Speicher erhalten Dann ist es dein Programm, das etwas verliert.

+1

Keine der oben genannten. Bitte lesen Sie die Post sorgfältiger. Der Plattencache ist der einzige Speicher, der Speicher verbraucht, und er geht auf "normal" zurück, wenn der Datenträger mit allen zuletzt gelesenen Dateien ausgehängt wird. –

+0

Und wenn Sie versuchen, die echo 3>/proc/sys/vm/drop_caches macht das auch Dinge wieder normal? – abligh

+0

Dieser Befehl erfordert root-Benutzer. Bitte lesen Sie erneut die Problembeschreibung und meinen letzten Hinweis. –

0

Ich bin überzeugt, dass es keine Möglichkeit gibt, Datei-Caching pro Prozess zu stoppen. Das Programm muss direkte Kontrolle über Datei-I/O haben, mit Zugriff auf die Datei-Deskriptoren, so dass madvise() verwendet werden kann. Dies ist nicht möglich, wenn Bibliotheksfunktionen das Lesen aller Dateien ausführen und Sie diese nicht ändern möchten. Dies sieht wie eine Entwurfslücke aus, die gefüllt werden sollte.

JEDOCH: Meine Behauptung eines Leistungsproblems mit Speicherverwaltung war falsch. Der Grund für die Verlangsamung des Prozesses, wenn der Dateicache wächst und die Speicherverkleinerung ist, ist etwas anderes: Die Suchlaufentfernungen sind während des Prozesses gewachsen. Andere Tests haben bestätigt, dass die Speicherzuweisung nicht wesentlich verlangsamt wird, wenn der Dateicache wächst und der freie Speicher schrumpft.

Verwandte Themen