Mein VPS-Webserver, der unter CentOS 5.4 (Linux-Kernel 2.6.16.33-xenU) ausgeführt wird (z. B. einmal im Monat ein paar Wochen), reagiert nicht mehr, da der Eoom-Killer einschaltet. Die Überwachung des Servers zeigt, dass dies nicht der Fall ist Normalerweise fehlt der Speicher, nur hin und wieder.
Ich habe einige Blogs gelesen, die auf diese Seite verweisen, in der die Konfiguration des Kernels zur besseren Verwaltung von Überlastungen mit den folgenden sysctl-Einstellungen erläutert wird:
vm.overcommit_memory = 2
vm.overcommit_ratio = 80
Mein Verständnis davon (was vielleicht falsch ist, aber ich kann keine kanonische Definition finden, um dies zu klären) ist, dass dies verhindert, dass der Kernel über Swap + 80% des physischen Speichers hinaus Speicher zuweist.
Ich habe jedoch auch einige andere Quellen gelesen, die darauf hindeuten, dass diese Einstellungen keine gute Idee sind - obwohl die Kritiker dieses Ansatzes zu sagen scheinen: "Tun Sie nichts, um Ihr System zu beschädigen, anstatt diesen Fehler zu versuchen", in der Annahme, dass Die Ursache ist immer bekannt.
Meine Frage ist also, was sind die Vor- und Nachteile dieses Ansatzes im Zusammenhang mit einem Apache2-Webserver, der ungefähr 10 Websites mit geringem Datenverkehr hostet? In meinem speziellen Fall verfügt der Webserver über 512 MB RAM mit 1024 MB Swap-Speicher. Dies scheint für die überwiegende Mehrheit der Zeit angemessen zu sein.
/proc/<PID>/oom_score_adj
für diesen Zweck verwenden. Wenn Sie beispielsweise oom_score_adj für sshd auf -1000 setzen, zielt der oom-Killer niemals auf sshd ab, wenn er etwas töten möchte. Es ist keine gute Idee, oom killer vollständig zu stoppen, da Ihre Programme dann nicht in der Lage sind, Speicher zu malloc, und sie werden trotzdem sterben.In Abschnitt 9.6, „Overcommit und OOM“ des Dokuments, das von @dunxd erwähnt wird, werden die Gefahren einer Überbeanspruchung besonders deutlich. Das
80
sah aber auch für mich interessant aus, deshalb habe ich ein paar Tests durchgeführt.Was ich festgestellt habe, ist, dass sich dies
overcommit_ratio
auf den gesamten für ALLE Prozesse verfügbaren RAM auswirkt. Root-Prozesse scheinen nicht anders behandelt zu werden als normale Benutzerprozesse.Das Setzen des Verhältnisses auf
100
oder weniger sollte die klassische Semantik liefern, bei der Rückgabewertemalloc/sbrk
zuverlässig sind. Durch Festlegen eines niedrigeren Verhältnisses können Sie100
mehr RAM für nicht prozessbezogene Aktivitäten wie Caching usw. reservieren.Also, auf meinem Computer mit 24 GB RAM, mit deaktiviertem Swap, 9 GB im Einsatz, mit
top
AnzeigenHier sind einige
overcommit_ratio
Einstellungen und wie viel RAM mein RAM-Consumer-Programm abrufen könnte (Berühren jeder Seite) - in jedem Fall wurde das Programm nach einem Fehler sauber beendetmalloc
.Wenn mehrere gleichzeitig ausgeführt wurden, selbst wenn einige als Root-Benutzer fungierten, änderte sich nicht die Gesamtmenge, die sie zusammen verbrauchten. Es ist interessant, dass es nicht in der Lage war, die letzten 3+ GiB oder so zu konsumieren. Das
free
hat nicht viel unterschritten, was hier gezeigt wird:Die Experimente waren chaotisch - alles, was im Moment malloc verwendet, neigt zum Absturz, da viele Programmierer schreckliche Angst haben, in C nach malloc-Fehlern zu suchen, einige beliebte Sammlungsbibliotheken es vollständig ignorieren und C ++ und verschiedene andere Sprachen sogar schlechter.
Die meisten der frühen Implementierungen von imaginärem RAM betrafen einen sehr speziellen Fall, in dem ein einzelner großer Prozess - etwa 51% des verfügbaren Speichers - erforderlich war,
fork()
umexec()
ein Support-Programm zu erstellen, normalerweise ein viel, viel kleineres. Betriebssysteme mit Copy-on-Write-Semantik würden das zulassenfork()
, jedoch mit der Maßgabe, dass, wenn der Fork-Prozess tatsächlich versucht, zu viele Speicherseiten zu ändern (von denen jede unabhängig vom anfänglichen riesigen Prozess als neue Seite instanziiert werden müsste). es würde am Ende getötet werden. Der übergeordnete Prozess war nur dann in Gefahr, wenn mehr Speicher zugewiesen wurde, und konnte das Auslaufen in einigen Fällen bewältigen, indem er nur ein bisschen darauf wartete, dass ein anderer Prozess ausfiel, und dann fortfuhr. Der untergeordnete Prozess hat sich normalerweise nur durch ein (normalerweise kleineres) Programm über ersetztexec()
und war dann frei von der Maßgabe.Das Overcommit-Konzept von Linux ist ein extremer Ansatz, um sowohl das
fork()
Auftreten als auch die Überlagerung einzelner Prozesse zu ermöglichen. Todesfälle, die durch OOM-Killer verursacht wurden, treten asynchron auf, selbst bei Programmen, die mit der Speicherzuweisung verantwortungsbewusst umgehen. Ich persönlich hasse systemweites Overcommit im Allgemeinen und den Oom-Killer im Besonderen - es fördert einen teuflischen Ansatz für die Speicherverwaltung, der Bibliotheken infiziert und über sie jede App, die sie verwendet.Ich würde vorschlagen, das Verhältnis auf 100 zu setzen und auch eine Swap-Partition zu haben, die im Allgemeinen nur von riesigen Prozessen genutzt wird - die oft nur einen winzigen Bruchteil des Teils von sich selbst verwenden, der in Swap gestopft wird, und somit Schützen Sie die überwiegende Mehrheit der Prozesse vor dem OOM-Killer-Fehler. Dies sollte Ihren Webserver vor dem zufälligen Tod schützen, und wenn er für den
malloc
verantwortungsvollen Umgang geschrieben wurde , sogar vor dem Selbstmord (aber wetten Sie nicht auf Letzteres).Das heißt, ich benutze dies in
/etc/sysctl.d/10-no-overcommit.conf
quelle