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.
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:
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.
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.
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: