MongoDB wird OOM getötet

MongoDB wird OOM getötet

wir führen ein MongoDB-Replikatset auf drei Maschinen aus. Alle drei Maschinen haben etwa 16 GB, aber nur 255 MB Swap. Swappiness bleibt auf dem Standardwert 60. Die Maschinen laufen unter CentOS 6.4. Die Datenbanken sind viel größer als die 16 GB, aber das ist für uns in Ordnung. Das wirklich funktionierende Set ist viel kleiner.

Das Problem, mit dem wir konfrontiert sind, ist, dass der primäre Verbrauch den gesamten verfügbaren Speicher verbraucht und dann OOM-Killed wird. Ich weiß, dass MongoDB den Speicher auf diese Weise verwaltet.

Nachdem der Server OOM-gekillt wurde, muss ihn jemand manuell neu starten.

Gibt es eine Möglichkeit, zu verhindern, dass MongoDB OOM beendet wird? Die Swappiness anpassen? Den Swap-Speicherplatz vergrößern? Ich denke, dass diese Einstellungen nur die Schonfrist verlängern, bevor MongoDB beendet wird.

Antwort1

OOM-Killer ist kein Wegirgendjemandverwaltet den Speicher; dies ist die Art und Weise des Linux-Kernels, schwerwiegende Fehler zu verarbeiten, in der letzten Hoffnung, eine Systemabsturz zu vermeiden!

Was Sie tun sollten, ist:

  • Stellen Sie sicher, dass Sie genügend Swap haben. Wenn Sie sicher sind, fügen Sie noch mehr hinzu.

  • Implementieren Sie Ressourcenbeschränkungen! Zumindest für Anwendungen, von denen Sie erwarten, dass sie Speicher verwenden (und noch mehr, wenn Sie das nicht erwarten – diese werden normalerweise problematisch). Sehen Sie sich die Befehle ulimit -v (oder limit addressspace) in Ihrer Shell an und setzen Sie sie vor dem Start der Anwendung in deren Init-Skript. Sie sollten auch andere Dinge begrenzen (wie die Anzahl der Prozesse -u usw.) ... Auf diese Weise erhält die Anwendung einen ENOMEM-Fehler, wenn nicht genügend Speicher vorhanden ist, anstatt dass der Kernel ihnen nicht vorhandenen Speicher zuweist und danach durchdreht und alles um sie herum zerstört!

  • Sagen Sie dem Kernel, dass er den Speicher nicht überlasten soll. Sie könnten Folgendes tun:

    echo "0" > /proc/sys/vm/overcommit_memory

    oder noch besser (abhängig von der Menge Ihres Swap-Speichers)

    echo "2" > /proc/sys/vm/Überbelegungsspeicher; echo "80" > /proc/sys/vm/Überbelegungsverhältnis

    SehenÜberbelegung deaktivierenfür weitere Informationen hierzu.

    Dadurch wird der Kernel angewiesen, bei der Zuweisung von Speicher an Anwendungen, über den er eigentlich nicht verfügt, vorsichtiger zu sein (die Ähnlichkeit mit der globalen Wirtschaftskrise ist frappierend).

  • als letztes Mittel, wenn alles auf Ihrem System außer MangoDB entbehrlich ist (aber bitte beheben Sie zuerst die beiden oben genannten Punkte!), können Sie dieChancen, dass es getötet wird(oder sogar sicherstellen, dass es nicht beendet wird – selbst wenn die Alternative darin besteht, dass die Maschine aufhängt und nichts mehr funktioniert), indem Sie /proc/$pid/oom_score_adj und/oder /proc/$pid/oom_score optimieren.

    echo "-1000" > /proc/`pidof mangod`/oom_score_adj

    SehenDen OOM-Killer zähmenfür weitere Informationen zu diesem Thema.

verwandte Informationen