Ich stelle fest, dass meine Linux-Box gelegentlich keinen Speicher mehr hat und zufällige Prozesse herunterfährt, um damit umzugehen.
Ich bin neugierig, was Administratoren tun, um dies zu vermeiden? Ist die einzige echte Lösung, um die Speicherkapazität zu erhöhen (hilft allein die Erhöhung des Swap-Speichers?), Oder gibt es bessere Möglichkeiten, die Box mit Software einzurichten, um dies zu vermeiden? (dh Quoten oder einige davon?).
linux
low-memory
Eddie Parker
quelle
quelle
Antworten:
Standardmäßig hat Linux ein etwas hirngeschädigtes Konzept der Speicherverwaltung: Sie können mehr Speicher zuweisen als auf Ihrem System, und dann wird zufällig ein Prozess in den Kopf geschossen, wenn es Probleme gibt. (Die eigentliche Semantik dessen, was getötet wird, ist komplexer als das - Google "Linux OOM Killer" für viele Details und Argumente, ob es eine gute oder eine schlechte Sache ist).
So stellen Sie den scheinbaren Verstand Ihrer Speicherverwaltung wieder her:
vm.oom-kill = 0
in /etc/sysctl.conf)vm.overcommit_memory = 2
in /etc/sysctl.conf einfügen)Beachten Sie, dass dies ein trinärer Wert ist: 0 = "Schätzen Sie, ob genügend RAM vorhanden ist", 1 = "Sagen Sie immer Ja", 2 = "Sagen Sie Nein, wenn nicht." habe die Erinnerung ")
Diese Einstellungen bewirken, dass Linux sich wie gewohnt verhält (wenn ein Prozess mehr Speicher anfordert als verfügbar ist, schlägt malloc () fehl und der Prozess, der den Speicher anfordert, wird diesen Fehler voraussichtlich beheben).
Starten Sie Ihren Computer neu, um ihn neu zu laden
/etc/sysctl.conf
, oder verwenden Sie dasproc
Dateisystem, um ihn sofort zu aktivieren, ohne ihn neu zu starten:quelle
/etc/sysctl.conf
Optionen wahrscheinlich erst beim nächsten Neustart wirksam wird. Wenn Sie jetzt Änderungen vornehmen möchten, sollten Sie densysctl
Befehl mit Root-Berechtigungen verwenden, z. B.sudo sysctl vm.overcommit_memory=2
Sie können das Overcommit deaktivieren (siehe http://www.mjmwired.net/kernel/Documentation/sysctl/vm.txt#514)
quelle
Die kurze Antwort für einen Server ist, mehr RAM zu kaufen und zu installieren.
Ein Server, auf dem routinemäßig OOM -Fehler (Out-Of-Memory) aufgetreten sind. Abgesehen von der Overcommit -Option sysctl des VM-Managers in Linux-Kerneln ist dies keine gute Sache.
Das Erhöhen der Auslagerungsmenge (virtueller Speicher, der vom Speichermanager des Kernels auf die Festplatte ausgelagert wurde) hilft, wenn die aktuellen Werte niedrig sind und die Verwendung viele Aufgaben mit sich bringt, und nicht nur eine oder mehrere verarbeitet jede Anforderung einer großen Menge des gesamten verfügbaren virtuellen Speichers (RAM + Swap).
Bei vielen Anwendungen, die mehr als das Zweifache (2x) des Arbeitsspeichers als Swap zuweisen, führt dies zu einem geringeren Return on Improvement. In einigen großen Computersimulationen kann dies akzeptabel sein, wenn die Geschwindigkeitsverlangsamung erträglich ist.
Mit RAM (ECC oder nicht) für bescheidene Stückzahlen durchaus bezahlbar sein, zB 4-16 GB, muss ich zugeben, ich habe dieses Problem schon lange nicht mehr selbst erlebt.
Die Grundlagen zur Betrachtung des Speicherverbrauchs umfassen die Verwendung von
free
undtop
, sortiert nach Speichernutzung, als die beiden häufigsten schnellen Auswertungen von Speichernutzungsmustern. Vergewissern Sie sich also, dass Sie zumindest die Bedeutung der einzelnen Felder in der Ausgabe dieser Befehle verstehen.Da keine spezifischen Anwendungen (z. B. Datenbank, Netzwerkdienstserver, Echtzeit-Videoverarbeitung) und die Servernutzung (wenige Hauptbenutzer, 100-1000 Benutzer- / Client-Verbindungen) vorliegen, kann ich mir keine allgemeinen Empfehlungen für den Umgang mit vorstellen das OOM-Problem.
quelle
Das Erhöhen des physischen Speichers ist möglicherweise nicht in allen Fällen eine wirksame Reaktion.
Eine Möglichkeit, dies zu überprüfen, ist der Befehl 'atop'. Besonders diese beiden Zeilen.
Dies ist unser Server, als er fehlerfrei war:
Wenn es schlecht lief (und bevor wir overcommit_memory von 50 auf 90 angepasst haben, haben wir festgestellt, dass vmcom deutlich mehr als 50 G ausführt, dass alle paar Sekunden Eoom-Killer-Prozesse in die Luft jagen und die Last aufgrund von untergeordneten NFSd-Prozessen immer wieder radikal ansteigt up und ständig neu erstellt.
Wir haben kürzlich Fälle dupliziert, in denen Linux-Terminalserver mit mehreren Benutzern die Zuweisung des virtuellen Speichers massiv überschreiben, aber nur sehr wenige der angeforderten Seiten tatsächlich belegt werden.
Obwohl es nicht ratsam ist, genau dieser Route zu folgen, haben wir den Overcommit-Speicher von der Standardeinstellung 50 auf 90 angepasst, wodurch einige Probleme behoben wurden. Wir mussten letztendlich alle Benutzer auf einen anderen Terminalserver verschieben und neu starten, um den vollen Nutzen zu sehen.
quelle
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 Run-Away-Prozesse sind, die Ihren Server zum Absturz bringen.
Wenn Ihr Problem darin besteht, dass Sie einfach nicht genug Speicher haben, um die benötigten Dienste auszuführen, gibt es nur drei Lösungen:
Reduzieren Sie den von Ihren Diensten verwendeten Speicher, indem Sie Caches und ähnliches begrenzen
Erstellen Sie einen größeren Auslagerungsbereich. Es kostet Sie Leistung, kann Ihnen aber etwas Zeit verschaffen.
Kaufe mehr Speicher
quelle
Ich hatte ein ähnliches Problem im Zusammenhang mit diesem Fehler und die Lösung bestand darin, einen älteren / neueren (festen) Kernel zu verwenden.
Zu der Zeit konnte ich meinen Computer jedoch nicht neu starten, so dass es eine hässliche Umgehung war, sich mit diesem Befehl als root anzumelden und System-Caches zu löschen:
quelle
@ voretaq7 Linux hat kein gehirngeschädigtes Konzept der Speicherverwaltung, standardmäßig ist vm.overcommit_ratio 0,
Auf diese Weise schlägt Ihre Zuweisung fehl, wenn Sie über 4 GB RAM verfügen und versuchen, 4,2 GB mit malloc virtuellem Speicher zuzuweisen.
Mit vm.overcommit_ratio = 1
Mit vm.overcommit_ratio = 2
Standardmäßig überlastet Linux also nicht. Wenn Ihre Anwendung mehr Arbeitsspeicher hat als Sie, ist Ihr Code möglicherweise fehlerhaft
quelle