it-swarm.com.de

Beschränken Sie die Größe des Puffercaches unter Linux

Gibt es eine Möglichkeit, den Linux-Kernel anzuweisen, nur einen bestimmten Prozentsatz des Speichers für den Puffercache zu verwenden? Ich kenne /proc/sys/vm/drop_caches kann verwendet werden, um den Cache vorübergehend zu löschen, aber gibt es eine permanente Einstellung, die verhindert, dass er auf mehr als z. 50% des Hauptspeichers?

Der Grund, warum ich dies tun möchte, ist, dass auf einem Server ein Ceph-OSD ausgeführt wird, das ständig Daten von der Festplatte bereitstellt und es schafft, den gesamten physischen Speicher innerhalb weniger Stunden als Puffercache zu belegen. Gleichzeitig muss ich Anwendungen ausführen, die eine große Menge (mehrere 10 GB) physischen Speichers zuweisen. Entgegen der landläufigen Meinung (siehe die Hinweise zu fast allen Fragen zum Puffercache) ist die automatische Freigabe des Speichers durch Verwerfen sauberer Cacheeinträge nicht sofort: Das Starten meiner Anwendung kann bis zu einer Minute dauern wenn der Puffercache voll ist (*), während nach dem Löschen des Caches (mit echo 3 > /proc/sys/vm/drop_caches) Die gleiche Anwendung startet fast augenblicklich.

(*) Während dieser Minute der Startzeit ist die Anwendung im neuen Speicher fehlerhaft, verbringt jedoch laut Vtune 100% ihrer Zeit im Kernel in einer Funktion namens pageblock_pfn_to_page. Diese Funktion scheint mit der Speicherkomprimierung in Zusammenhang zu stehen, die zum Auffinden großer Seiten erforderlich ist, was mich zu der Annahme veranlasst, dass tatsächlich die Fragmentierung das Problem ist.

25
Wim

Wenn Sie kein absolutes Limit wollen, sondern nur den Kernel unter Druck setzen, um die Puffer schneller zu leeren, sollten Sie sich vm.vfs_cache_pressure Anschauen.

Diese Variable steuert die Tendenz des Kernels, den Speicher, der zum Zwischenspeichern von VFS-Caches verwendet wird, im Vergleich zu Pagecache und Swap zurückzugewinnen. Durch Erhöhen dieses Werts wird die Rate erhöht, mit der VFS-Caches zurückgefordert werden.

Bereich von 0 bis 200. Bewegen Sie ihn für höheren Druck in Richtung 200. Die Standardeinstellung ist 100. Sie können Ihre Speichernutzung auch mit dem Befehl slabtop analysieren. In Ihrem Fall müssen die Werte dentry und *_inode_cache Hoch sein.

Wenn Sie ein absolutes Limit wünschen, sollten Sie cgroups nachschlagen. Platzieren Sie den Ceph OSD-Server in einer cgroup und begrenzen Sie den maximalen Speicherbedarf, indem Sie den Parameter memory.limit_in_bytes Für die cgroup festlegen.

memory.memsw.limit_in_bytes Legt den Maximalbetrag für die Summe aus Speicher- und Swap-Nutzung fest. Wenn keine Einheiten angegeben sind, wird der Wert als Byte interpretiert. Es ist jedoch möglich, Suffixe zu verwenden, um größere Einheiten darzustellen - k oder K für Kilobyte, m oder M für Megabyte und g oder G für Gigabyte.

Verweise:

[1] - GlusterFS Linux Kernel Tuning

[2] - RHEL 6 Resource Management Guide

13
NOLFXceptMe

Ich weiß nichts über A%, aber Sie können ein Zeitlimit festlegen, damit es nach x Minuten gelöscht wird.

Zuerst in einem Terminal

sync && echo 3 | Sudo tee /proc/sys/vm/drop_caches

Aktuelle Caches löschen.

Mach es zu einem cron-job Drücken Sie Alt-F2 und geben Sie gksudo gedit /etc/crontab, Fügen Sie dann diese Zeile unten hinzu.

 */15 *    * * *   root    sync && echo 3 > /proc/sys/vm/drop_caches

Dies wird alle 15 Minuten gereinigt. Sie können 1 oder 5 Minuten einstellen, wenn Sie dies wirklich möchten, indem Sie den ersten Parameter auf * oder */5 anstelle von */15 ändern.

So zeigen Sie Ihren freien Arbeitsspeicher mit Ausnahme des Caches an:

free -m | sed -n -e '3p' | grep -Po "\d+$
3
DnrDevil

Wenn Ceph OSD ein separater Prozess ist, können Sie cgroups verwenden, um die vom Prozess verwendeten Ressourcen zu steuern:

Erstellen Sie eine cgroup mit dem Namen group1 mit einem Speicherlimit (von 50 GB werden beispielsweise andere Limits wie CPU unterstützt, in dem beispielsweise auch CPU erwähnt wird):

cgcreate -g memory,cpu:group1

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

Wenn Ihre App bereits ausgeführt wird, bringen Sie die App in diese Gruppe:

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

Oder führen Sie Ihre App in dieser Gruppe aus:

cgexec -g memory,cpu:group1 your_app_name
2

Ich denke, Ihre Vermutung ganz am Ende Ihrer Frage ist auf dem richtigen Weg. Ich würde entweder A, NUMA-fähige Speicherzuordnung, die Seiten zwischen CPUs migriert, oder B, eher den Defragmentierungscode transparenter riesiger Seiten, die versuchen, zusammenhängende, ausgerichtete Regionen zu finden, vermuten.

Riesenseiten und transparente Riesenseiten wurden sowohl für deutliche Leistungsverbesserungen bei bestimmten Workloads als auch für den Verbrauch enormer CPU-Zeit ohne großen Nutzen identifiziert.

Es ist hilfreich zu wissen, welchen Kernel Sie ausführen, welchen Inhalt/proc/meminfo enthält (oder zumindest die HugePages_ * -Werte) und, falls möglich, mehr des vtune-Profiler-Callgraphen, der auf pageblock_pfn_to_page () verweist.

Wenn Sie sich meiner Vermutung hingeben möchten, deaktivieren Sie die Defragmentierung von Riesenseiten mit:

echo 'nie'>/sys/kernel/mm/transparent_hugepage/defrag

(es kann dies stattdessen sein, abhängig von Ihrem Kernel :)

echo 'nie'>/sys/kernel/mm/redhat_transparent_hugepage/defrag

Verwenden Sie für diese App viele zehn Gigs RAM, die Sie geschrieben haben? Welche Sprache?

Da Sie den Begriff "Fehler in Speicherseiten" verwendet haben, sind Sie vermutlich mit dem Betriebsdesign und dem virtuellen Speicher vertraut genug. Ich habe Mühe, mir eine Situation/Anwendung vorzustellen, die so aggressiv fehlerhaft ist, dass nicht viele E/A eingelesen werden - fast immer aus dem Puffercache, den Sie einschränken möchten.

(Wenn Sie neugierig sind, sehen Sie sich mmap (2) -Flaggen wie MAP_ANONYMOUS und MAP_POPULATE sowie mincore (2) an, mit denen Sie feststellen können, auf welchen virtuellen Seiten tatsächlich eine physische Seite zugeordnet ist.)

Viel Glück!

2
etherfish

optimiert ist ein dynamischer adaptiver Systemoptimierungsdämon, der die Systemeinstellungen je nach Verwendung dynamisch optimiert.

 $ man tuned

Siehe die zugehörige Dokumentation und die Konfigurationsdateien.

 /etc/tuned
 /etc/tuned/*.conf
 /usr/share/doc/tuned-2.4.1
 /usr/share/doc/tuned-2.4.1/TIPS.txt

This parameter may be useful for you.

** Set flushing to once per 5 minutes
** echo "3000" > /proc/sys/vm/dirty_writeback_centisecs

Zusätzliche Informationen

Der Befehl sync leert den Puffer, d. H. Erzwingt das Schreiben aller ungeschriebenen Daten auf die Festplatte und kann verwendet werden, wenn sichergestellt werden soll, dass alles sicher geschrieben ist. In herkömmlichen UNIX-Systemen wird im Hintergrund ein Programm namens pdate ausgeführt, das alle 30 Sekunden ein Sync ausführt. Daher ist die Synchronisierung normalerweise nicht erforderlich. Linux hat einen zusätzlichen Daemon, bdflush, der häufiger eine unvollständigere Synchronisierung durchführt, um das plötzliche Einfrieren aufgrund von Festplatten-E/A zu vermeiden, das sync manchmal verursacht.

Unter Linux wird bdflush durch Update gestartet. Es gibt normalerweise keinen Grund, sich darüber Sorgen zu machen, aber wenn bdflush aus irgendeinem Grund stirbt, warnt der Kernel davor und Sie sollten es von Hand starten (/ sbin/update).

0
Ijaz Ahmad Khan