Gibt es eine Möglichkeit, den Linux-Kernel anzuweisen, nur einen bestimmten Prozentsatz des Speichers für den Puffercache zu verwenden? Ich weiß, /proc/sys/vm/drop_caches
dass der Cache vorübergehend geleert werden kann, aber gibt es eine permanente Einstellung, die verhindert, dass er auf mehr als z. B. 50% des Hauptspeichers anwächst?
Der Grund, warum ich dies tun möchte, ist, dass ich einen Server mit einem Ceph-OSD habe, der ständig Daten von der Festplatte bereitstellt und es schafft, innerhalb weniger Stunden den gesamten physischen Speicher als Puffer-Cache zu nutzen. Gleichzeitig muss ich Anwendungen ausführen, die eine große Menge (mehrere 10 GB) physischen Arbeitsspeichers zuweisen. Entgegen der landläufigen Meinung (siehe den Ratschlag zu fast allen Fragen zum Puffer-Cache) erfolgt die automatische Freigabe des Speichers durch Löschen sauberer Cache-Einträge nicht sofort: Das Starten meiner Anwendung kann bis zu einer Minute dauern, wenn der Puffer-Cache voll ist ( *), während nach dem Löschen des Cache (mit echo 3 > /proc/sys/vm/drop_caches
) die gleiche Anwendung fast sofort gestartet wird.
(*) Während dieser Minute der Startzeit ist die Anwendung fehlerhaft im neuen Speicher, verbringt jedoch 100% ihrer Zeit im Kernel, so Vtune in einer aufgerufenen Funktion pageblock_pfn_to_page
. Diese Funktion scheint mit der Speicherkomprimierung zu tun zu haben, die zum Auffinden großer Seiten erforderlich ist, was mich zu der Annahme veranlasst, dass tatsächlich die Fragmentierung das Problem ist.
quelle
Antworten:
Wenn Sie kein absolutes Limit wollen, sondern nur den Kernel unter Druck setzen, um die Puffer schneller zu leeren, sollten Sie nachsehen
vm.vfs_cache_pressure
Der Bereich reicht von 0 bis 200. Bewegen Sie ihn für höheren Druck in Richtung 200. Die Standardeinstellung ist 100. Sie können die Speichernutzung auch mit dem
slabtop
Befehl analysieren . In Ihrem Fall diedentry
und*_inode_cache
müssen Werte hoch sein.Wenn Sie ein absolutes Limit wünschen, sollten Sie nachschlagen
cgroups
. Platzieren Sie den Ceph OSD-Server in einer cgroup und begrenzen Sie den maximal verfügbaren Speicher, indem Sie denmemory.limit_in_bytes
Parameter für die cgroup festlegen.Verweise:
[1] - GlusterFS Linux Kernel Tuning
[2] - RHEL 6 Resource Management Guide
quelle
limit_in_bytes
set scheint es zu tun. Vielen Dank!vfs_cache_pressure
, löscht nur Dentry- und Inode-Caches und hat nichts mit Buffer-Cache zu tun.vfs_cache_pressure
darüber100
kann hilfreich sein, falls Sie nicht über genügend RAM für Ihre Arbeitslast verfügen. Dies verringert die RAM-Auslastung, führt jedoch zu einer insgesamt schlechteren E / A-Leistung.Ich weiß nichts über A%, aber Sie können ein Zeitlimit festlegen, damit es nach x Minuten abfällt.
Zuerst in einem Terminal
Aktuelle Caches löschen.
Machen Sie es zu einem
cron-job
Drücken Sie Alt-F2, geben Sie eingksudo gedit /etc/crontab
und fügen Sie diese Zeile unten hinzu.Dies reinigt alle 15 Minuten. Sie können 1 oder 5 Minuten einstellen, wenn Sie wirklich möchten, indem Sie den ersten Parameter auf * oder * / 5 anstelle von * / 15 ändern
So sehen Sie Ihren freien Arbeitsspeicher mit Ausnahme des Caches:
quelle
3 > drop_caches
beinhaltet das das Verhalten vonsync
Ich denke, Ihre Vermutung am Ende Ihrer Frage ist auf dem richtigen Weg. Ich würde annehmen, dass entweder A, NUMA-fähige Speicherzuordnung, Seiten zwischen CPUs migriert, oder B, eher der Defragmentierungscode transparenter riesiger Seiten, die versuchen, zusammenhängende, ausgerichtete Bereiche zu finden.
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 wäre hilfreich zu wissen, welchen Kernel Sie ausführen, welchen Inhalt / proc / meminfo (oder zumindest die Werte für HugePages_ *) und, falls möglich, mehr von dem vtune profiler-Aufrufgraphen, der auf pageblock_pfn_to_page () verweist.
Wenn Sie sich meiner Vermutung hingeben möchten, deaktivieren Sie die Defragmentierung von Riesen-Seiten mit:
(Es kann sein, dass dies stattdessen von Ihrem Kernel abhängt :)
Und zu guter Letzt, verwendet diese App viele Dutzend Gigs RAM, die Sie geschrieben haben? Welche Sprache?
Da Sie den Begriff "Fehler in den Speicherseiten" verwendet haben, sind Sie wahrscheinlich mit dem Betriebsdesign und dem virtuellen Speicher vertraut. 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 Puffer-Cache, den Sie einschränken möchten.
(Wenn Sie neugierig sind, sehen Sie sich die mmap (2) -Flaggen wie MAP_ANONYMOUS und MAP_POPULATE und mincore (2) an, mit denen Sie feststellen können, auf welchen virtuellen Seiten tatsächlich eine physische Seite abgebildet ist.)
Viel Glück!
quelle
Wenn es sich bei Ceph OSD um einen separaten Prozess handelt, können Sie mithilfe von cgroups die vom Prozess verwendeten Ressourcen steuern:
Erstellen Sie eine cgroup mit dem Namen group1 mit einem Speicherlimit von 50 GB (z. B. werden andere Limits wie z. B. CPU unterstützt, in Beispiel wird auch CPU erwähnt):
Wenn Ihre App bereits ausgeführt wird, bringen Sie sie in diese Gruppe:
Oder führen Sie Ihre App in dieser Gruppe aus:
quelle
tuned ist ein dynamischer adaptiver System-Tuning-Daemon, der die Systemeinstellungen je nach Verwendung dynamisch abstimmt.
Weitere Informationen finden Sie in der zugehörigen Dokumentation und in den Konfigurationsdateien.
Zusätzliche Information
Der Befehl sync leert den Puffer, dh erzwingt, dass alle ungeschriebenen Daten auf die Festplatte geschrieben werden, und kann verwendet werden, wenn sichergestellt werden soll, dass alles sicher geschrieben ist. In herkömmlichen UNIX-Systemen wird ein Programm namens update im Hintergrund ausgeführt, das alle 30 Sekunden eine Synchronisierung durchführt. Daher ist es normalerweise nicht erforderlich, die Synchronisierung zu verwenden. Linux hat einen zusätzlichen Daemon, bdflush , der häufiger eine unvollständigere Synchronisation durchführt, um ein plötzliches Einfrieren aufgrund von Festplatten-E / A zu vermeiden, die manchmal durch die Synchronisation verursacht werden.
Unter Linux wird bdflush per Update gestartet. Es gibt normalerweise keinen Grund, sich darüber Sorgen zu machen, aber wenn bdflush aus irgendeinem Grund abstürzt, warnt der Kernel davor und Sie sollten es manuell starten ( / sbin / update ).
quelle