Es hört sich an, als hätten Sie schon viele der Dinge ausprobiert, die ich zuerst vorgeschlagen hätte (Swap-Konfiguration anpassen, E / A-Scheduler ändern usw.).
Abgesehen von dem, was Sie bereits versucht haben zu ändern, würde ich vorschlagen, die etwas hirnroten Voreinstellungen für das VM-Rückschreibeverhalten zu ändern. Dies wird durch die folgenden sechs sysctl-Werte verwaltet:
vm.dirty_ratio
: Steuert, wie viel Schreibvorgänge für das Zurückschreiben anstehen müssen, bevor es ausgelöst wird. Behandelt Vordergrundrückschreiben (pro Prozess) und wird als ganzzahliger Prozentsatz des Arbeitsspeichers ausgedrückt. Der Standardwert ist 10% des Arbeitsspeichersvm.dirty_background_ratio
: Steuert, wie viel Schreibvorgänge für das Zurückschreiben anstehen müssen, bevor es ausgelöst wird. Verarbeitet Hintergrundrückschreiben (systemweit) und wird als ganzzahliger Prozentsatz des Arbeitsspeichers ausgedrückt. Der Standardwert ist 20% des RAMvm.dirty_bytes
: Gleich wievm.dirty_ratio
, außer ausgedrückt als Gesamtanzahl von Bytes. Entweder dies odervm.dirty_ratio
wird verwendet, je nachdem, was als letztes geschrieben wurde.vm.dirty_background_bytes
: Gleich wievm.dirty_background_ratio
, außer ausgedrückt als Gesamtanzahl von Bytes. Entweder dies odervm.dirty_background_ratio
wird verwendet, je nachdem, was als letztes geschrieben wurde.vm.dirty_expire_centisecs
: Wie viele Hundertstelsekunden müssen vergehen, bevor das ausstehende Rückschreiben beginnt, wenn die obigen vier sysctl-Werte dies nicht bereits auslösen würden. Standardeinstellung ist 100 (eine Sekunde).vm.dirty_writeback_centisecs
: Wie oft (in Hundertstelsekunden) wird der Kernel schmutzige Seiten für das Zurückschreiben auswerten. Standardeinstellung ist 10 (eine Zehntelsekunde).
Mit den Standardwerten führt der Kernel jede Zehntelsekunde Folgendes aus:
- Schreiben Sie alle geänderten Seiten in den permanenten Speicher, wenn sie vor mehr als einer Sekunde zuletzt geändert wurden.
- Schreiben Sie alle modifizierten Seiten für einen Prozess aus, wenn die Gesamtmenge des nicht ausgeschriebenen Arbeitsspeichers 10% des Arbeitsspeichers überschreitet.
- Schreiben Sie alle modifizierten Seiten im System aus, wenn die Gesamtmenge des nicht ausgeschriebenen Speichers 20% des Arbeitsspeichers überschreitet.
Es sollte also leicht zu erkennen sein, warum die Standardwerte Probleme für Sie verursachen können, da Ihr System möglicherweise versucht, jede Zehntelsekunde bis zu 4 Gigabyte Daten in den permanenten Speicher zu schreiben .
Der allgemeine Konsens besteht heutzutage darin, sich vm.dirty_ratio
auf 1% des RAM und vm.dirty_background_ratio
2% einzustellen, was für Systeme mit weniger als 64 GB RAM zu einem Verhalten führt, das dem ursprünglich beabsichtigten entspricht.
Einige andere Dinge zu untersuchen:
- Erhöhen Sie das
vm.vfs_cache_pressure
Sysctl etwas. Dies steuert, wie aggressiv der Kernel Speicher aus dem Cache des Dateisystems beansprucht, wenn er RAM benötigt. Der Standardwert ist 100, es nicht unter 50 bis etwas niedriger (Du wirst wirklich schlechtes Verhalten, wenn man unter 50 gehen, einschließlich OOM Bedingungen) und erhöht es nicht viel mehr als etwa 200 (viel höher und die Der Kernel verschwendet Zeit damit, den Speicher zurückzugewinnen. Ich habe festgestellt, dass das Anheben von bis zu 150 tatsächlich die Reaktionsfähigkeit deutlich verbessert, wenn Sie über einen relativ schnellen Speicher verfügen. - Ändern Sie den Speicherüberlastungsmodus. Dies kann durch Ändern des Werts von
vm.overcommit_memory
sysctl erfolgen. Standardmäßig verwendet der Kernel einen heuristischen Ansatz, um zu versuchen, vorherzusagen, wie viel RAM er tatsächlich leisten kann. Wenn Sie diesen Wert auf 1 setzen, wird die Heuristik deaktiviert und der Kernel wird aufgefordert, sich so zu verhalten, als hätte er unendlichen Speicher. Wenn Sie diesen Wert auf 2 setzen, wird der Kernel angewiesen, nicht mehr Speicherplatz als die Gesamtmenge des Swap-Speichers im System zuzüglich eines Prozentsatzes des tatsächlichen Arbeitsspeichers (gesteuert vonvm.overcommit_ratio
) festzulegen . - Versuchen Sie, das
vm.page-cluster
Sysctl zu optimieren. Hiermit wird gesteuert, wie viele Seiten gleichzeitig ein- oder ausgeblendet werden (dies ist ein logarithmischer Wert der Basis-2, dh der Standardwert von 3 wird auf 8 Seiten übersetzt). Wenn Sie tatsächlich tauschen, kann dies dazu beitragen, die Leistung beim Ein- und Auslagern von Seiten zu verbessern.