Gibt es eine Möglichkeit, die Puffercachegröße in Linux zu begrenzen?

Gibt es eine Möglichkeit, die Puffercachegröße in Linux zu begrenzen?

Ich habe ein Programm, das während E/A-Vorgängen viel Speicher verbraucht, was eine Nebenwirkung der Ausführung vieler Vorgänge ist. Wenn ich das Programm mit direct_io ausführe, ist das Speicherproblem behoben, aber die Zeit, die das Programm zum Beenden des Auftrags benötigt, ist viermal länger.

Gibt es eine Möglichkeit, die maximale Größe des Puffercaches (Kernelpuffer, der während E/A-Vorgängen verwendet wird) zu reduzieren? Vorzugsweise ohne Änderung der Kernelquellen.

Ich habe versucht, /proc/sys/vm/„Dirty_Bytes“ usw. zu reduzieren. Aber das scheint keinen spürbaren Unterschied zu machen.

UPDATE: Die Verwendung echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches während der Programmlaufzeit reduziert vorübergehend die Menge des verwendeten Speichers.

Kann ich Pagecache, Dentries und Inodes irgendwie begrenzen, anstatt sie ständig freizugeben? Das würde mein Problem wahrscheinlich lösen.

Das ist mir vorher nicht aufgefallen, aber das Problem tritt bei jedem I/O-Vorgang auf, nicht nur bei der Partitionierung. Es sieht so aus, als würde Linux alles, was durch I/O geht, bis zu einem bestimmten Punkt zwischenspeichern, an dem es fast den maximal verfügbaren Speicher erreicht hat und 4 MB freien Speicher übrig lässt. Es gibt also eine Art Obergrenze dafür, wie viel Speicher für I/O zwischengespeichert werden kann. Aber ich kann nicht herausfinden, wo diese Grenze ist. Ich bin schon ziemlich verzweifelt. Wenn ich sie nicht irgendwo in den Kernelquellen durch 2 teilen kann, mache ich das gerne.

Update vom 12.12.2016: Ich habe es aufgegeben, das zu beheben, aber etwas hat meine Aufmerksamkeit erregt und mich an dieses Problem erinnert. Ich habe zu Hause eine alte, defekte Festplatte und sie verschwendet wie verrückt Ressourcen, wenn ich versuche, etwas damit zu tun.

Ist es möglich, dass es sich nur um einen Festplattenfehler handelt? Die betreffende Festplatte ist innerhalb eines Monats nach Auftreten meines Problems kaputtgegangen. Wenn das der Fall ist, habe ich meine Antwort.

Antwort1

Wenn Sie fragen nachProgramm, Du könntest benutzenKontrollgruppen:

Erstellen Sie eine Kontrollgruppe mit dem Namen „group1“ und einem Speicherlimit (von beispielsweise 50 GB, andere Limits wie „CPU“ werden unterstützt, im Beispiel wird auch „CPU“ erwähnt):

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

Wenn Ihre App dann bereits läuft, bringen Sie die App in diese Kontrollgruppe:

cgclassify -g memory,cpu:group1 $(pidof your_app_name)

Oder führen Sie Ihre App innerhalb dieser Kontrollgruppe aus:

cgexec -g memory,cpu:group1 your_app_name

verwandte Informationen