Pufferspeicher begrenzen, der für mmap verwendet wird

8

Ich habe eine Datenstruktur, die ich nach Bedarf on-demand bearbeiten möchte. mmap scheint eine einfache Möglichkeit zu sein, erste Experimente durchzuführen. Allerdings möchte ich die Menge an Puffer-Cache begrenzen, die der mmap verwendet. Die Maschine verfügt über genügend Speicher, um die gesamte Datenstruktur in den Cache zu stellen, aber aus Testgründen (und auch aus produktionstechnischen Gründen) möchte ich das nicht zulassen.

Gibt es eine Möglichkeit, die Menge an Puffer-Cache zu begrenzen, die von mmap verwendet wird?

Alternativ könnte auch eine mmap Alternative, die etwas Ähnliches erreichen kann und trotzdem die Speichernutzung begrenzt, funktionieren.

    
JaredC 25.07.2017, 18:29
quelle

4 Antworten

3

Nach meinem Verständnis ist es nicht möglich. Die Speicherzuordnung wird vom Betriebssystem gesteuert. Der Kernel wird die Entscheidungen treffen, wie der verfügbare Speicher am besten genutzt wird, aber er betrachtet das System insgesamt. Ich bin mir nicht bewusst, dass Quoten für Caches auf Prozessebene unterstützt werden (zumindest habe ich solche APIs in Linux oder BSD nicht gesehen).

Es gibt madvise , um dem Kernel Hinweise zu geben, aber es wird nicht unterstützt, den verwendeten Cache zu begrenzen für einen Prozess. Sie können ihm Hinweise wie MADV_DONTNEED geben, was den Druck auf den Cache anderer Anwendungen verringert, aber ich würde erwarten, dass es mehr schadet als nützt, da es höchstwahrscheinlich das Caching weniger effizient macht, was zu mehr führt IO laden auf dem System insgesamt.

Ich sehe nur zwei Alternativen. On versucht, das Problem auf Betriebssystemebene zu lösen, und das andere ist, es auf Anwendungsebene zu lösen.

Auf Betriebssystemebene sehe ich zwei Optionen:

  1. Sie könnten eine virtuelle Maschine ausführen, aber das ist höchstwahrscheinlich nicht das, was Sie wollen. Ich würde auch erwarten, dass es die Gesamtsystemleistung nicht verbessern wird. Dennoch wäre es zumindest eine Möglichkeit, Obergrenzen für den Speicherverbrauch festzulegen.
  2. Docker ist die andere Idee, die mir in den Sinn kommt, die auch auf der Betriebssystemebene funktioniert, aber nach meinem besten Wissen unterstützt sie nicht die Definition von Quoten im Cache. Ich glaube nicht, dass es funktionieren wird.

Das lässt nur eine Option übrig, nämlich die Anwendungsebene zu betrachten. Anstatt Speicherabbilddateien zu verwenden, können Sie explizite Dateisystemoperationen verwenden. Wenn Sie die volle Kontrolle über den Puffer haben müssen, denke ich, dass dies die einzige praktische Option ist. Es ist mehr Arbeit als Speicherzuordnung, und es ist auch nicht garantiert, dass die Leistung besser ist.

Wenn Sie bei der Speicherzuordnung bleiben möchten, können Sie auch nur Teile der Datei im Speicher abbilden und die Zuordnung anderer Teile aufheben, wenn Sie Ihr Speicherkontingent überschreiten. Es hat auch das gleiche Problem wie die expliziten Datei-IO-Operationen (mehr Implementierungsarbeit und nicht-triviales Tuning, um eine gute Cache-Strategie zu finden).

Nachdem Sie das gesagt haben, könnten Sie die Anforderung in Frage stellen, die Cache-Speicher-Nutzung zu begrenzen. Ich würde erwarten, dass der Kernel eine ziemlich gute Arbeit bei der Zuweisung von Speicherressourcen auf eine gute Weise leistet. Zumindest wird es wahrscheinlich besser als die Lösungen, die ich skizziert habe. (Explizite Datei-IO, plus ein interner Cache, könnte schnell sein, aber es ist nicht trivial zu implementieren und abzustimmen. Hier ist ein Vergleich der Kompromisse: mmap () vs. Lese-Blöcke .)

Während des Testens können Sie die Anwendung mit ionice -c 3 und nice -n 20 ausführen, um die Auswirkungen auf die anderen produktiven Anwendungen etwas zu reduzieren. Es gibt auch ein Tool namens nocache . Ich habe es nie benutzt, aber beim Durchlesen seiner Dokumentation scheint es etwas mit deiner Frage zu tun zu haben.

    
Philipp Claßen 01.08.2017 22:54
quelle
1

Ich würde nur die Route von Map-Teilen der Datei gleichzeitig gehen, so dass Sie die volle Kontrolle darüber behalten können, wie viel Speicher verwendet wird.

    
Chuck Norrris 03.08.2017 02:22
quelle
0

Dies kann möglicherweise mithilfe von mmap() und Linux Control Groups ( hier oder hier ). Nach der Installation haben Sie die Möglichkeit, willkürliche Grenzwerte für den Umfang des physischen Speichers, der von einem Prozess verwendet wird, zu erstellen. Als Beispiel begrenzen wir hier den physischen Speicher auf 128 MB und tauschen den Speicher auf 256 MB aus:

%Vor%     
David Hoelzer 01.08.2017 23:29
quelle
0

Sie können IPC Shared Memory-Segment verwenden, Sie werden der Master Ihrer Speichersegmente sein.

    
sancelot 06.08.2017 20:33
quelle

Tags und Links