Cent OS: Wie deaktiviere oder reduziere ich die Überbelegung des Arbeitsspeichers und ist dies sicher?

20

Von Zeit zu Zeit kommt "mein" Server zum Stillstand, weil ihm sowohl der Arbeitsspeicher als auch der Auslagerungsspeicher ausgehen. (es reagiert immer wieder auf ping, aber nicht mehr als das, nicht einmal ssh).

Ich habe erfahren, dass Linux eine Überbelegung des Arbeitsspeichers vornimmt, was meines Erachtens dasselbe ist wie bei Banken mit Geld: Es wird mehr Arbeitsspeicher verarbeitet, als tatsächlich verfügbar ist, vorausgesetzt, dass die meisten Prozesse nicht den gesamten von ihnen angeforderten Arbeitsspeicher verwenden Zumindest nicht alle gleichzeitig.

Angenommen, dies ist tatsächlich der Grund, warum mein System gelegentlich aufhängt. Lassen Sie uns hier nicht diskutieren, ob dies der Fall ist oder nicht (siehe Was kann dazu führen, dass ALLE Dienste auf einem Server ausfallen und dennoch auf Ping reagieren? Und wie Sie dies herausfinden ). .

So,

  1. Wie deaktiviere oder reduziere ich die Speicherüberbelegung in CentOS drastisch? Ich habe gelesen, dass es zwei Einstellungen gibt, die vm.overcommit_memory (Werte 0, 1 oder 2) und vm.overcommit_ratiom heißen, aber ich habe keine Ahnung, wo ich sie finden und ändern muss (hoffentlich einige Konfigurationsdateien). Welche Werte sollte ich versuchen? und ob ich den Server neu starten muss, damit die Änderungen wirksam werden.

  2. und ist es sicher? Welche Nebenwirkungen kann ich erwarten? Wenn ich nach overcommit_memory google, finde ich beängstigende Dinge wie Leute, die sagen, dass ihr Server nicht mehr booten kann ...

Da der plötzliche Anstieg der Speichernutzung auf mysql zurückzuführen ist, weil Abfragen von PHP vorgenommen werden, die wiederum aufgerufen werden, während http-Anfragen bearbeitet werden, würde ich davon ausgehen, dass nur ein PHP-Skript nicht vollständig ausgeführt werden kann und daher von Zeit zu Zeit etwa 500 Antworten vorliegen Der Server ist zu beschäftigt, was ein Risiko darstellt, das ich eingehen kann (sicherlich besser, wenn der gesamte Server nicht mehr erreichbar ist und einen harten Neustart durchführen muss).

Oder kann es wirklich dazu führen, dass mein Server nicht neu gestartet werden kann, wenn ich die falschen Einstellungen wähle?

Matteo
quelle
1
Das Deaktivieren von Overcommit hilft Ihnen nicht, wenn Ihnen wirklich der Speicher ausgeht. Das Hinzufügen von RAM zum Server kann jedoch hilfreich sein.
Michael Hampton
2
Das Deaktivieren von Overcommit wird nicht die endgültige Lösung sein, aber es wird viel helfen, wenn der Server irgendwann keinen Speicher mehr hat (was nur gelegentlich für einige Sekunden der Fall ist). Ich habe nur ein paar abgelehnte http-Anfragen (oder schlecht bedient), anstatt meinen Server komplett und für immer
sterben zu lassen

Antworten:

30

Memory Overcommit kann durch deaktiviert werden vm.overcommit_memory=2

0 ist der Standardmodus, in dem der Kernel die Zuordnung heuristisch bestimmt, indem er den freien Speicher im Vergleich zu der vorgenommenen Zuordnungsanforderung berechnet. Wenn Sie den Wert auf 1 setzen, wird der Assistentenmodus aktiviert, in dem der Kernel immer mitteilt, dass genügend freier Speicher für eine Zuordnung vorhanden ist. Der Wert 2 bedeutet, dass Prozesse nur bis zu einer konfigurierbaren Menge ( overcommit_ratio) RAM zuweisen können und Allokationsfehler oder OOM-Meldungen erhalten, wenn diese Menge überschritten wird.

Ist es sicher, nein. Ich habe keinen richtigen Anwendungsfall gesehen, bei dem das Deaktivieren der Speicherüberlastung tatsächlich geholfen hat, es sei denn, Sie sind sich zu 100% der Arbeitslast und der Hardwarekapazität sicher. Wenn Sie interessiert sind, installieren Sie das kernel-docsPaket und /Documentation/sysctl/vm.txtlesen Sie mehr oder lesen Sie es online .

Wenn Sie dies einstellen vm.overcommit_memory=2, wird der Prozentsatz des in konfigurierten physischen Arbeitsspeichers überschritten vm.overcommit_ratio(Standard ist 50%).

echo 0/1/2 > /proc/sys/vm/overcommit_memory 

Dies wird einen Neustart nicht überleben. Fügen Sie aus Gründen der Persistenz Folgendes in die /etc/sysctl.confDatei ein:

vm.overcommit_memory=X

und renne sysctl -p. Kein Neustart erforderlich.

Soham Chakraborty
quelle
Der Teil, den Sie nicht beantwortet haben, ist, in welcher Datei ich diese vm.memory_overcommit-Einstellung ändere und insbesondere, ob ich neu starten muss (oder was sonst), damit sie wirksam wird
Matteo
2
echo 0/1/2> / proc / sys / vm / overcommit_memory Dies wird einen Neustart nicht überleben. Fügen Sie dies aus Gründen der Persistenz in die Datei /etc/sysctl.conf vm.overcommit_memory = X ein und führen Sie sysctl -p aus. Kein Neustart erforderlich
Soham Chakraborty
Vielen Dank. Bitte fügen Sie dies zum Antworttext hinzu, damit ich es förmlich "akzeptieren" kann.
Matteo
1
Das neue Teil wurde hinzugefügt.
Soham Chakraborty
4
"overcommit_ratio" hat einen wichtigen Effekt bei Verwendung von overcommit_memory = 2 - es bestimmt den Prozentsatz des physischen RAM, der zugewiesen werden darf! Wenn also das Verhältnis <100 ist, bleibt etwas RAM nicht zugewiesen, möglicherweise für den Festplatten-Cache oder ähnliches. Das Standardverhältnis beträgt 50%, sodass Sie nur dann 50% des physischen Arbeitsspeichers verwenden, wenn Sie dies nicht ändern!
David Gardner
6

Völlig unqualifizierte Aussage: Das Deaktivieren der Speicherüberlastung ist definitiv "sicherer" als das Aktivieren.

$ customer hat es auf ein paar hundert Webservern eingerichtet und bei Stabilitätsproblemen sehr geholfen. Es gibt sogar einen Nagios-Scheck, der lautes Feuer ruft, wenn er jemals NICHT deaktiviert wurde.

Auf der anderen Seite halten es die Leute vielleicht nicht für "sicher", wenn ihre Prozesse aus dem Gedächtnis geraten, wenn sie nur einen kleinen RAM überbeanspruchen möchten und dies nie wirklich nutzen würden. (dh SAP wäre ein sehr gutes Beispiel)

Sie werden also wieder feststellen, ob sich die Situation für Sie verbessert. Da Sie sich bereits damit befassen, um verwandte Probleme zu beseitigen - ich denke, es könnte für Sie hilfreich sein.

(Ich weiß, ich werde ein Downvote von einer mürrischen Person riskieren)

Florian Heigl
quelle
3

Ich bin damit einverstanden, dass das Deaktivieren von Overcommit unter bestimmten Umständen sicherer ist als das Aktivieren. Wenn der Server nur wenige große Speicheraufträge ausführt (wie in meinem Fall Schaltkreissimulationen), ist es viel sicherer, der Anwendung die Speicheranforderung im Voraus zu verweigern, als auf ein OOM-Ereignis zu warten (das sicherlich bald folgen wird). Sehr oft sehen wir Server Probleme haben, nachdem der OOM-Killer seine Arbeit getan hat.

user185690
quelle