Wir haben einen Debian-Linux-Webserver. Darauf läuft nur Apache2. Unser MySQL-Server befindet sich auf einem anderen Host. Allerdings führen wir manchmal Cron-Aufgaben auf dem Webserver aus, um reguläre Aufgaben auszuführen.
Vor kurzem hatte jedoch einer der Cron-Aufgaben einen Fehler und begann, den Speicher zu verschlingen. Der Linux OOM-Killer hat Apache getötet. Das hat natürlich unsere Website zum Absturz gebracht. Der speicherhungrige Cron lief weiter. In diesem Fall möchte ich jedoch, dass der OOM-Killer dieses Skript tötet undnichtApache.
Gibt es eine Möglichkeit, den Kernel so zu konfigurieren, dass ich sagen kannnichtProzesse namens 'apache2' beenden (oder zumindest apache2 zumzuletztwas es tötet)? Sowohl Apache als auch die regulären Crons werden als derselbe Benutzer (www-Benutzer) ausgeführt.
Antwort1
Es hört sich nicht so an, als würden Sie die Grundursache des Problems beheben, indem Sie tatsächlich debuggen, warum dieser Cron-Job so viel Speicher verbraucht.
Sie können versuchen, diese Option einzustellen
echo 1 > /proc/sys/vm/oom_kill_allocating_task
Dadurch wird der OOM-Killer angewiesen, den Prozess zu beenden, der den OOM-Zustand ausgelöst hat. Dies ist jedoch nicht unbedingt Ihr Cron-Job. Sie können in Ihrem Skript auch „ulimit -m“ verwenden, um die maximale Menge an residentem Speicher festzulegen. Ich denke, am besten prüfen Sie, warum der Cron-Job so viel Speicher verbraucht und ob er vielleicht besser für einen anderen Host geeignet ist oder neu geschrieben werden sollte, um weniger Speicher zu verbrauchen.
Antwort2
Der OOMKillerIstBis zu einem gewissen Grad konfigurierbar. Nachdem Sie einen Prozess gestartet haben, können Sie den Wert /proc/<pid>/oom_adj
auf eine negative Ganzzahl setzen. Dies beeinflusst die Affinität von OOMKiller gegenüber dem Prozess und seinen untergeordneten Prozessen. Wenn Ihr System nicht genügend Arbeitsspeicher hat, werden andere Prozesse beendet.
Antwort3
Sie können auch das Überbelegungsverhalten des virtuellen Speichers ändern. Sie können beispielsweise den Wert von /proc/sys/vm/overcommit_memory auf „2“ ändern – was bedeutet, dass der Speicher NICHT überbelegt wird. (Ändern Sie diesen Wert nicht einfach, ohne zu verstehen, was er bewirkt.)
Im Modus „Kein Overcommit“ wird jeder neue Prozess, der mehr RAM anfordert, beim Zuweisungsversuch eine Fehlermeldung erhalten. Anstatt also den OOM-Killer losgehen zu lassen und Ihre alten, lang laufenden Prozesse zu zerstören, wird dem neuen Prozess, der RAM anfordert, „Nein“ gesagt.
... und dann müssen Sie Ihr Speicherproblem beheben. Finden Sie das Leck, gestalten Sie den speicherintensiven Prozess neu, fügen Sie der Box mehr RAM hinzu usw.
Antwort4
Hier steht, dass Sie für einen Prozess ein OOM_DISABLE-„Flag“ setzen können: http://linux-mm.org/OOM_Killer