Frage Vermeiden Sie das Abmigrieren von Linux-Out-of-Memory-Anwendungen


Ich habe festgestellt, dass meine Linux-Box gelegentlich nicht genügend Speicher hat und zufällige Prozesse abreißt, um damit fertig zu werden.

Ich bin neugierig, was Administratoren tun, um dies zu vermeiden? Ist die einzige wirkliche Lösung, um die Menge an Speicher zu erhöhen (wird die Swap-Alone-Hilfe allein?), Oder gibt es bessere Möglichkeiten, die Box mit Software einzurichten, um dies zu vermeiden? (d. h. Quoten oder Ähnliches?).


26
2018-05-14 18:32


Ursprung


Ich habe hier eine Antwort gefunden: serverfault.com/questions/362589/ ... Patrick Antwort ist sehr lehrreich - Amaury


Antworten:


Standardmäßig hat Linux ein etwas hirngeschädigtes Konzept der Speicherverwaltung: Es erlaubt Ihnen, mehr Speicher zuzuweisen als Ihr System und schießt zufällig einen Prozess in den Kopf, wenn es in Schwierigkeiten kommt. (Die tatsächliche Semantik dessen, was getötet wird, ist komplexer als das - Google "Linux OOM Killer" für viele Details und Argumente, ob es gut oder schlecht ist).


So stellen Sie Ihrer Speicherverwaltung einen gewissen Anschein von Vernunft wieder her:

  1. Deaktivieren Sie den OOM Killer (Put vm.oom-kill = 0 in /etc/sysctl.conf)
  2. Deaktivieren Sie die Speicherüberbelegung (Put vm.overcommit_memory = 2 in /etc/sysctl.conf)
    Beachten Sie, dass dies ein trinärer Wert ist: 0 = "Schätzen Sie, ob wir genug RAM haben", 1 = "Sagen Sie immer Ja", 2 = "Sagen Sie Nein, wenn wir keinen Speicher haben")

Diese Einstellungen führen dazu, dass Linux sich wie üblich verhält (wenn ein Prozess mehr Speicher anfordert als verfügbar ist, wird malloc () fehlschlagen und der Prozess, der den Speicher anfordert, wird voraussichtlich mit diesem Fehler fertig werden).

Starten Sie Ihren Computer neu, um ihn neu zu laden /etc/sysctl.confoder benutze die proc Dateisystem sofort zu aktivieren, ohne Neustart:

echo 2 > /proc/sys/vm/overcommit_memory 

36
2018-05-14 19:02



Es ist nicht Linux, das Braindamaged, aber die Programmierer, die den Speicher zuweisen, um ihn nie zu verwenden. Java-VMs sind damit berüchtigt. Ich als Administrator, der Server verwaltet, auf denen Java-Apps laufen, würde keine Sekunde überleben, ohne zu überladen. - Aleksandar Ivanisevic
Java-Programmierer vergeben keinen ungenutzten Speicher, es gibt kein malloc in Java. Ich denke, Sie verwechseln das mit JVM-Einstellungen wie -Xms. In jedem Fall ist die Erhöhung der Größe des virtuellen Speichers durch Hinzufügen von Swap-Speicherplatz eine viel sicherere Lösung als die Überbrückung. - jlliagre
Beachten Sie, dass diese Lösung Ihr System nicht davon abhält, nicht genügend Arbeitsspeicher oder Prozesse zu verlieren. Es wird dich nur zum traditionellen Unix-Verhalten zurückbringen, wo, wenn ein Prozess all deinen Speicher verschlingt, der nächste, der zu malloc versucht, keinen bekommt (und höchstwahrscheinlich abstürzt). Wenn Sie Pech haben, ist der nächste Prozess init (oder etwas anderes, was kritisch ist), was der OOM-Killer im Allgemeinen vermeidet. - pehrs
jlliagre, ich sagte Java VMs (Virtual Machines), keine Java-Programme, obwohl aus einer Admin-Perspektive ist es das gleiche :) - Aleksandar Ivanisevic
Vielleicht ist hier erwähnenswert, dass die oben genannten hinzufügen /etc/sysctl.conf wird wahrscheinlich erst beim nächsten Neustart wirksam; wenn Sie Änderungen vornehmen möchten jetzt Du solltest das benutzen sysctl Befehl mit Root-Berechtigungen, z. sudo sysctl vm.overcommit_memory=2 - nickgrim


Sie können die Überbelegung deaktivieren, sehen http://www.mjmwired.net/kernel/Documentation/sysctl/vm.txt#514


5
2018-05-14 19:01



Eine Antwort sollte mehr sein als nur ein Link zu einer längeren Linux-Kernel-Dokumentationsdatei. -1 - Bastian Voigt


Die kurze Antwort, für einen Server, ist kaufen und installieren Sie mehr RAM.

Ein Server, der routinemäßig genug erfahren hat OOM (Out-of-Memory) Fehler, dann neben der VM (virtueller Speicher) -Manager overcommit Sysctl-Option in Linux-Kernel, das ist nicht eine gute Sache.

Das Aufheben der Menge an Swap (virtueller Speicher, der durch den Speichermanager des Kernels auf die Festplatte ausgelagert wurde) hilft, wenn die aktuellen Werte niedrig sind, und die Verwendung beinhaltet viele Aufgaben mit jeweils so großen Mengen an Speicher, anstatt einer oder weniger Prozesse, die jeweils eine große Menge des insgesamt verfügbaren virtuellen Speichers anfordern (RAM + Swap).

Für viele Anwendungen, die mehr als zwei Mal (2x) zuweisen, bietet die Menge an RAM als Swap eine abnehmende Verbesserung. In einigen großen Computersimulationen kann dies akzeptabel sein, wenn die Geschwindigkeitsverringerung erträglich ist.

Mit RAM (ECC oder nicht) kann für bescheidene Mengen, z.B. 4-16 GB, ich muss zugeben, ich habe dieses Problem selbst lange nicht mehr erlebt.

Die Grundlagen beim Betrachten des Speicherverbrauchs einschließlich der Verwendung free und top, sortiert nach Speichernutzung, als die zwei häufigsten schnellen Auswertungen von Speichernutzungsmustern. Seien Sie also sicher, dass Sie die Bedeutung jedes Feldes in der Ausgabe dieser Befehle zumindest verstehen.

Ohne Anwendungsspezifikationen (zB Datenbank, Netzwerk-Service-Server, Echtzeit-Video-Verarbeitung) und die Nutzung des Servers (wenige Power-User, 100-1000 User / Client-Verbindungen) sind mir keine generellen Handlungsempfehlungen bekannt das OOM-Problem.


3
2018-05-14 19:31





Die Erhöhung des physischen Speichers ist möglicherweise unter allen Umständen keine effektive Antwort.

Eine Möglichkeit, dies zu überprüfen, ist der 'atop' Befehl. Vor allem diese zwei Zeilen.

Dies ist Server, wenn es gesund war:

MEM | tot   23.7G | free   10.0G | cache   3.9G | buff  185.4M | slab  207.8M |
SWP | tot    5.7G | free    5.7G |              | vmcom  28.1G | vmlim  27.0G |

Wenn es schlecht lief (und bevor wir overcommit_memory von 50 auf 90 anpassten, sahen wir ein Verhalten mit vmcom, das weit über 50G lief, Oom-Killer-Sprengprozesse alle paar Sekunden und die Last immer wieder zurücksprang, da NFSd-Kindprozesse durchgebrannt wurden up und neu erstellt ständig.

Wir haben kürzlich Fälle wiederholt, in denen Linux-Terminal-Server mit mehreren Benutzern die Zuweisung von virtuellem Speicher massiv überschreiten, aber nur wenige der angeforderten Seiten tatsächlich verbraucht werden.

Obwohl es nicht ratsam ist, dieser genauen Route zu folgen, haben wir den Overcommit-Speicher von den Standardwerten 50 bis 90 angepasst, wodurch ein Teil des Problems behoben wurde. Wir mussten schließlich alle Benutzer auf einen anderen Terminalserver verschieben und neu starten, um den vollen Nutzen zu sehen.


3
2017-11-15 18:41





Sie können ulimit verwenden, um die Menge an Speicher zu reduzieren, die ein Prozess beanspruchen darf, bevor er beendet wird. Es ist sehr nützlich, wenn Ihr Problem ein oder mehrere Runaway-Prozesse sind, die Ihren Server zum Absturz bringen.

Wenn Ihr Problem darin besteht, dass Sie nicht genügend Arbeitsspeicher haben, um die benötigten Dienste auszuführen, gibt es nur drei Lösungen:

  1. Reduzieren Sie den von Ihnen verwendeten Speicher Dienste durch Begrenzen von Caches und ähnlich

  2. Erstellen Sie einen größeren Swap-Bereich. Es wird kostet Sie in der Leistung, kann aber kaufen du etwas Zeit.

  3. Kaufen Sie mehr Speicher


2
2018-05-14 22:34





Ich hatte ähnliche Probleme im Zusammenhang mit dieser Fehler und die Lösung bestand darin, einen älteren / neueren (festen) Kernel zu verwenden.

Allerdings konnte ich zu diesem Zeitpunkt meinen Rechner nicht neu starten, daher bestand eine hässliche Lösung darin, sich als root anzumelden und System-Caches mit diesem Befehl zu löschen:

echo 3 > /proc/sys/vm/drop_caches

0
2018-02-03 09:23





@ Voretaq7 Linux hat nicht Gehirn-beschädigtes Konzept der Speicherverwaltung, standardmäßig vm.overcommit_ratio ist 0,

0       -   Heuristic overcommit handling. Obvious overcommits of
            address space are refused. Used for a typical system. It
            ensures a seriously wild allocation fails while allowing
            overcommit to reduce swap usage.  root is allowed to
            allocate slightly more memory in this mode. This is the
            default.

Wenn Sie also 4 GB RAM haben und versuchen, 4,2 GB mit malloc virtuellem Speicher zu reservieren, schlägt Ihre Zuweisung fehl.

Mit vm.overcommit_ratio = 1

            1    -   Always overcommit. Appropriate for some scientific
            applications. Classic example is code using sparse arrays
            and just relying on the virtual memory consisting almost
            entirely of zero pages.

Mit vm.overcommit_ratio = 2

           2    -   Don't overcommit. The total address space commit
            for the system is not permitted to exceed swap + a
            configurable percentage (default is 50) of physical RAM.
            Depending on the percentage you use, in most situations
            this means a process will not be killed while accessing
            pages but will receive errors on memory allocation as
            appropriate.

            Useful for applications that want to guarantee their
            memory allocations will be available in the future
            without having to initialize every page.

Also standardmäßig Linux nicht übermäßig, wenn Ihre Anwendung mehr Speicher als Sie haben, vielleicht ist Ihr Code fehlerhaft


-5
2017-12-10 18:31



Sie haben sich hier widersprochen. An der Spitze sagst du "standardmäßig ist vm.overcommit_ratio 0" und dann unten sagst du "standardmäßig überkompensiert Linux nicht". Wenn Letzteres wahr wäre, wäre vm.overcommit_ratio standardmäßig 2! - Michael Hampton♦
vm.overcommit_ratio = 0, malloc reserviert nicht mehr Arbeitsspeicher als dein physischer RAM, also bedeutet für mich, dass du dich nicht übermäßig auskommst, zu viel, wenn du mehr virtuellen als deinen physischen RAM zuweisen kannst - c4f4t0r
Ja, du hast es falsch verstanden. - Michael Hampton♦
Sie missverstanden, die Standard-0, nicht zur Zuweisung von mehr virtuellen Speicher als RAM und 2 nicht überlässt erlauben vm.overcommit_ratio + Swap-Raum, so wenn ich missverstanden sage mir was - c4f4t0r
Na sicher. "Offensichtliche Überkommandos" werden abgelehnt. Der Rest vergeht. Sie müssen aufmerksamer lesen. - Michael Hampton♦