it-swarm.com.de

Ubuntu hat schnell keinen RAM mehr und mein Computer friert ein. Welcher Befehl löst das?

Es passiert mir ziemlich oft, wenn ich im Hintergrund Software kompiliere und plötzlich alles langsamer wird und irgendwann einfriert [wenn ich nichts tue], da mir sowohl RAM als auch der Swap-Speicherplatz ausgehen.

Diese Frage setzt voraus, dass ich genügend Zeit und Ressourcen habe, um Gnome Terminal zu öffnen, meinen Verlauf zu durchsuchen und einen Sudo -Befehl auszuführen.

Welcher Befehl erspart mir einen harten Neustart oder einen Neustart überhaupt?

73
Akiva

Nach meiner Erfahrung verwenden Firefox und Chrome mehr RAM als meine ersten 7 Computer zusammen. Wahrscheinlich mehr als das, aber ich komme von meinem Standpunkt weg. Das allererste, was Sie tun sollten, ist schließen Sie Ihren Browser. Ein Kommando?

killall -9 firefox google-chrome google-chrome-stable chromium-browser

Ich habe die gängigsten Browser in einem Befehl zusammengefasst, aber wenn Sie offensichtlich etwas anderes ausführen (oder wissen, dass Sie keinen dieser Befehle verwenden), ändern Sie einfach den Befehl. Der killall -9 ... ist das wichtige Bit. Die Leute zweifeln an SIGKILL (Signal Nummer 9), aber die Browser sind extrem belastbar. Darüber hinaus bedeutet das langsame Beenden über SIGTERM, dass der Browser eine Menge Bereinigungsmüll erstellt, der eine Menge zusätzlichen Arbeitsspeichers erfordert. Das können Sie sich in dieser Situation nicht leisten.

Wenn Sie das nicht in ein bereits laufendes Terminal oder eine Alt+F2 Betrachten Sie den Wechsel zu einem TTY. Control + Alt + F2 führt Sie zu TTY2, mit dem Sie sich anmelden können (obwohl dies möglicherweise langsam ist) und mit dem Sie sogar etwas wie htop zum Debuggen des Problems verwenden können. Ich glaube nicht, dass mir jemals RAM ausgegangen ist, bis ich htop nicht mehr aufstehen konnte.

Die langfristige Lösung besteht darin, entweder mehr RAM zu kaufen, über einen Remote-Computer zu mieten oder nicht das zu tun, was Sie gerade tun. Ich überlasse Ihnen die komplizierten wirtschaftlichen Argumente, aber im Allgemeinen ist RAM günstig zu kaufen, aber wenn Sie nur eine Burst-Menge benötigen, ist ein VPS-Server, der pro Minute oder Stunde in Rechnung gestellt wird, eine gute Wahl.

84
Oli

Drücken Sie auf einem System mit aktiviertem Magic System Request Key Alt + System Request + f (falls nicht auf Ihrer Tastatur markiert, System Request ist oft auf dem Print Screen key) ruft manuell den Kernel-Killer (oomkiller) auf, der versucht, den schlechtesten Prozess für die Speichernutzung auszuwählen und ihn zu beenden. Sie können dies tun, wenn Sie möglicherweise weniger Zeit als beschrieben haben und das System gerade dabei ist, mit dem Dreschen zu beginnen (oder bereits begonnen hat) - in diesem Fall ist es Ihnen wahrscheinlich egal, was genau getötet wird, nur dass Sie enden mit einem brauchbaren System. Manchmal kann dies dazu führen, dass X getötet wird, aber heutzutage ist es meistens viel besser, einen schlechten Prozess auszuwählen, als es früher der Fall war.

66
Muzer

Im Gegensatz zu anderen Antworten schlage ich vor, dass Sie Swap deaktivieren, während Sie dies tun. Während Swap Ihr ​​System auf vorhersehbare Weise am Laufen hält und häufig verwendet wird, um den Durchsatz von Anwendungen, die auf die Festplatte zugreifen, zu erhöhen (indem nicht verwendete Seiten entfernt werden, um Platz für den Festplatten-Cache zu schaffen), hört es sich in diesem Fall so an, als würde Ihr System verlangsamt auf ein unbrauchbares Niveau, weil zu viel aktiv genutzter Speicher zwangsweise ausgetauscht werden muss.

Ich würde empfehlen, Swap während dieser Aufgabe vollständig zu deaktivieren, damit der Killer für nicht genügend Arbeitsspeicher reagiert, sobald der RAM voll ist.

Alternativlösungen:

  • Erhöhen Sie die Lesegeschwindigkeit von Swap, indem Sie Ihre Swap-Partition in RAID1 Einfügen.
    • Oder RAID0, wenn Sie sich riskant fühlen, dies jedoch eine große Anzahl laufender Programme zum Absturz bringt, wenn eine Ihrer Festplatten nicht richtig funktioniert.
  • Verringern Sie die Anzahl der gleichzeitigen Build-Jobs ("mehr Kerne = mehr Geschwindigkeit", sagen wir alle, und vergessen Sie dabei, dass der Arbeitsspeicher linear belastet wird).
  • Dies könnte in beide Richtungen gehen, aber versuchen Sie, zswap im Kernel zu aktivieren. Dadurch werden die Seiten komprimiert, bevor sie zum Auslagern gesendet werden. Dies bietet möglicherweise gerade genug Bewegungsspielraum, um den Computer zu beschleunigen. Auf der anderen Seite könnte es durch die zusätzliche Komprimierung/Dekomprimierung zu einem Hindernis werden.
  • Optimierungen ablehnen oder einen anderen Compiler verwenden. Das Optimieren von Code kann manchmal mehrere Gigabyte Speicher beanspruchen. Wenn Sie LTO aktiviert haben, werden Sie auch im Verbindungsstadium eine Menge RAM verwenden. Wenn alles andere fehlschlägt, können Sie versuchen, Ihr Projekt mit einem leichteren Compiler (z. B. tcc) zu kompilieren, was zu einer geringfügigen Beeinträchtigung der Laufzeitleistung des kompilierten Produkts führt. (Dies ist normalerweise akzeptabel, wenn Sie dies für Entwicklungs-/Debugging-Zwecke tun.)
20
Score_Under

Sie können den folgenden Befehl (bei Bedarf wiederholt) verwenden, um den Prozess mit den meisten RAM auf Ihrem System abzubrechen:

ps -eo pid --no-headers --sort=-%mem | head -1 | xargs kill -9

Mit:

  • ps -eo pid --no-headers --sort=-%mem: Zeigt die Prozess-IDs aller laufenden Prozesse an, sortiert nach Speichernutzung
  • head -1: nur die erste Zeile behalten (Prozess mit dem meisten Speicher)
  • xargs kill -9: Beende den Prozess

Nach Dmitry's genauem Kommentar editieren:

Dies ist eine schnelle und fehlerhafte Lösung, die ausgeführt werden sollte, wenn keine vertraulichen Aufgaben ausgeführt werden (Aufgaben, die Sie nicht mit kill -9 ausführen möchten).

14
Gohu

das passiert mir ziemlich oft wenn ich im Hintergrund Software kompiliere

In diesem Fall etwas wie "killall -9 make" (oder was auch immer Sie verwenden, um Ihre Kompilierung zu verwalten, wenn nicht make). Dies stoppt den weiteren Kompilierungsprozess, SIGHUPT alle von ihm aus gestarteten Compiler-Prozesse (was hoffentlich dazu führt, dass sie ebenfalls gestoppt werden) und benötigt als Bonus kein Sudo, vorausgesetzt, Sie kompilieren als derselbe Benutzer, den Sie angemeldet haben in als. Und da es die eigentliche Ursache Ihres Problems anstelle Ihres Webbrowsers, einer X-Sitzung oder eines zufälligen Vorgangs beseitigt, beeinträchtigt es nicht, was Sie zu der Zeit auf dem System getan haben.

11
fluffysheap

Bevor Sie Ihre ressourcenintensiven Befehle ausführen, können Sie auch den Systemaufruf setrlimit (2) verwenden, wahrscheinlich mit dem ulimit -Element Ihrer Bash-Shell (oder dem limit eingebaut in zsh) insbesondere mit -v für RLIMIT_AS. Dann schlägt ein zu großer Verbrauch an virtuellem Adressraum (z. B. mit mmap (2) oder sbrk (2) , der von malloc (3) verwendet wird, fehl ( mit errno (3) ist ENOMEM).

Dann werden sie (d. H. Die hungrigen Prozesse in Ihrer Shell, nachdem Sie ulimit eingegeben haben) beendet, bevor Ihr System eingefroren wird.

Lesen Sie auch Linux Ate My RAM und deaktivieren Sie Speicherüberbelegung (indem Sie den Befehl echo 0 > /proc/sys/vm/overcommit_memory als root ausführen, siehe proc (5) ...).

11

Erstelle mehr Swap für dich.

Folgendes wird 8G Swap hinzufügen:

dd if=/dev/zero of=/root/moreswap bs=1M count=8192
mkswap /root/moreswap
swapon /root/moreswap

Es wird immer noch langsam sein (Sie tauschen), aber Sie sollten eigentlich nicht ausgehen. Moderne Versionen von Linux können in Dateien wechseln. Die einzige Verwendung für eine Swap-Partition in diesen Tagen ist der Ruhezustand Ihres Laptops.

9
William Hay

Eine Möglichkeit, kurzfristig einen Teil des freien RAM zu erhalten, ist die Verwendung von zram , wodurch eine komprimierte RAM -Diskette erstellt und dort ausgetauscht wird. Bei einer halbwegs vernünftigen CPU ist dies viel schneller als normales Auslagern, und die Komprimierungsraten sind bei vielen modernen RAM -Hits wie Webbrowsern ziemlich hoch.

Vorausgesetzt, Sie haben zram installiert und konfiguriert, müssen Sie nur noch ausführen

Sudo service zramswap start
5

Eine weitere Möglichkeit besteht darin, den Cache für Speicherseiten mit diesem Befehl freizugeben:

echo 3 | Sudo tee /proc/sys/vm/drop_caches

Aus kernel.org Dokumentation (Hervorhebung hinzugefügt):

drop_caches

Durch das Schreiben in dieses Feld löscht der Kernel nicht nur saubere Caches, sondern auch wiederherstellbare Plattenobjekte wie Dentries und Inodes. Einmal fallengelassen, wird ihr Speicher frei .

So geben Sie den Pagecache frei: echo 1>/proc/sys/vm/drop_caches So geben Sie die wiederherstellbaren Plattenobjekte (einschließlich Einträge und Inodes) frei: echo 2>/proc/sys/vm/drop_caches So geben Sie die Plattenobjekte und den Pagecache frei: echo 3>/proc/sys/vm/drop_caches

Dies ist eine zerstörungsfreie Operation und befreit keine schmutzigen Objekte. Um die Anzahl der durch diesen Vorgang freigegebenen Objekte zu erhöhen, kann der Benutzer vor dem Schreiben in/proc/sys/vm/drop_caches eine Synchronisierung ausführen. Dies minimiert die Anzahl der verschmutzten Objekte auf dem System und schafft mehr Kandidaten, die fallengelassen werden müssen.

3

Sudo swapoff -a deaktiviert den Swap und der Kernel bricht den Prozess automatisch mit höchste Punktzahl ab, wenn auf dem System nicht genügend Arbeitsspeicher vorhanden ist. Ich benutze dies, wenn ich weiß, dass ich etwas RAM-lastiges laufen lasse, das ich lieber töten würde, wenn es außer Kontrolle gerät, als es für immer tauschen und stecken bleiben zu lassen. Verwenden Sie Sudo swapon -a, um es anschließend wieder zu aktivieren.

Vielleicht möchten Sie später einen Blick auf Ihre Swap-Einstellungen werfen. Klingt so, als ob sich Ihr Swap auf derselben Festplatte befindet wie die Root-Partition. Dies würde Ihr System verlangsamen, wenn Sie auf Swap klicken. Vermeiden Sie dies, wenn Sie können. Außerdem werden moderne Systeme meiner Meinung nach häufig mit zu viel Swap konfiguriert. 32GiB RAM bedeutet normalerweise, dass der 32GiB-Swap standardmäßig so zugewiesen wird, als ob Sie wirklich 32GiB in Ihren Swap-Space einfügen möchten.

3
sudo

Sie sagten "Kompilieren im Hintergrund". Was machst du im vordergrund Wenn Sie mit Eclipse oder einer anderen ressourcenintensiven IDE entwickeln, überprüfen Sie, ob in der Konsole alles ordnungsgemäß terminiert ist.

In Entwicklungsumgebungen können häufig mehrere Prozesse in der Entwicklung gestartet werden. Diese können auch dann hängen bleiben, wenn Sie nicht mehr an ihnen interessiert sind (im Debugger oder einfach nicht ordnungsgemäß beendet). Wenn der Entwickler nicht aufpasst, können sich im Laufe des Tages Dutzende vergessener Prozesse ansammeln, die mehrere Gigabyte umfassen.

Prüfen Sie, ob alles, was in IDE beendet werden soll, beendet ist.

1
h22