Das System hängt, wenn der Arbeitsspeicher knapp wird


34

Ich habe einen eeePC 900a: Er hat einen 8 GB Flash als Festplatte und nur 1 GB RAM. Die darauf installierte Linux-Distribution ist ArchLinux.

Wenn das System von Speichern abläuft wird es extrem reagiert: es einige Sekunden / Minuten in Anspruch nimmt , Dinge zu tun wie zu TTY1 Schalten oder sogar den Mauszeiger zu bewegen. Manchmal sieht es so aus, als würde das System einfach einfrieren: Vor drei Jahren habe ich es in Ruhe gelassen und bis jetzt wurde überhaupt nichts geändert.

Ich würde lieber vermeiden, eine Swap-Partition / -Datei auf diesem eeePC zu erstellen, da die Festplatte bereits so klein ist und auch, weil die vielen Schreibvorgänge auf dem Swap-Platz die Lebensdauer der Flash-Karte erheblich verkürzen würden. Außerdem denke ich, dass eine Auslagerungsdatei / -partition das Problem nur verschieben würde, anstatt es definitiv zu beheben.

Soll der Kernel nicht zufällige Anwendungen beenden, wenn der Arbeitsspeicher knapp wird? Warum scheitert das (oder dauert es ewig)?

Vor ein paar Monaten / Jahren habe ich bereits versucht, dies weiter zu untersuchen, konnte aber nichts finden, was tatsächlich funktionieren würde ...


1
Welches DE / WM verwenden Sie in Ihrem Setup, welche Dienste / Daemons führen Sie aus? Wenn Sie beispielsweise eine vollständige Desktop-Umgebung verwenden und mit Chromium oder Firefox browsen, wird Ihr Arbeitsspeicher für den Brunch belastet. 1 GB RAM sollte ausreichen, um Arch Linux selbst auszuführen, aber was wirklich zählt, ist, was Sie darauf setzen.

1
Ich benutze LXDE. Chromium ist das Programm, das normalerweise den größten Teil des Arbeitsspeichers beansprucht. Jedenfalls ist das nicht der Punkt. Es ist nicht ich, der sich darum kümmern muss, wie viel Speicher mein System verwendet, es ist mein System, das deswegen nicht sterben sollte. Wenn auf meinem System der Speicher knapp wird, können Sie jede gewünschte Anwendung beenden. Ich möchte nur, dass sie nicht einfriert !
Peoro

5
Ich meine, ich bin (in Pseudo - Code) ernsthaft darüber nachzudenken , ein Skript wie folgt ausgeführt werden : while(true){ if( $FREE_MEMORY<10MB ){ kill -9 $RANDOM_PID; } }. Dies würde definitiv mein Problem beheben. Aber warte, soll der Kernel das nicht tun (und das weitaus besser als mein Skript)? Warum macht es seinen Job nicht?
Peoro

2
@Marcin, das würde das Problem nur verschieben, es nicht beheben. Selbst wenn ich 4 GB Arbeitsspeicher hätte (dank eines Austauschs), könnte meinem System der Arbeitsspeicher ausgehen (und so hängen bleiben). Was ich vermeiden möchte, ist, dass mein System einfriert, wenn kein RAM mehr vorhanden ist. Wenn mein Kernel Chrom plötzlich töten würde, sobald mein RAM vorbei ist, wäre ich auch mit den 1 GB, die ich jetzt habe, glücklich.
Peoro

4
@Lee Das "magic sysrq" ist eine Tastenkombination, die direkt zum Kernel geht. Dies funktioniert häufig auch dann, wenn Tastatur und Maus nicht reagieren. Siehe en.wikipedia.org/wiki/Magic_SysRq_key
Raman

Antworten:


14

Es ist möglich, OOM-Killer (Out-of-Memory-Killer) direkt über die Tastaturkombination aufzurufen:

SysRq-F

Die SysRq-Taste wird normalerweise innerhalb der PrtSc-Taste auf Tastaturen kombiniert.

OOM-Killer beendet einen Prozess (-es) und das System reagiert wieder.

Thx Raman für Ratschläge zu dieser Funktion in den obigen Kommentaren.

PS: Das hat mir sehr geholfen. Ich stimme der Meinung zu, dass dies der nützlichste Hinweis zu diesem Problem ist, wenn es von Chrome oder einer speichergierigen Software verursacht wird. Aber Sie müssen bedenken, dass OOM-Killer einen wirklich wichtigen Prozess zum Erliegen bringen kann. Gehen Sie vorsichtig damit um.


2
Ich habe den Schlüssel PrtScn|SysRq. Durch Drücken von wird jedoch SysRq - Fnur ein Screenshot
Lee

2
Da Sie meinen obigen Kommentar im Grunde genommen als Antwort genommen haben, wäre eine kleine Zuschreibung nett gewesen. Ich habe dich trotzdem beleidigt. :-)
Raman

3
@Lee Du musst es aktivieren. In einigen Distributionen ist Magic Sysrq standardmäßig nicht aktiviert. Dies sollte helfen: google.ca/search?q=sysrq+enable
Raman

2
@Raman Ich wette, 99%, die dies finden, können es nicht standardmäßig "aktivieren", weil ihr Computer bereits eingefroren ist ... warum ist es nicht standardmäßig aktiviert?
Themihai

3
@themihai, weil viele Leute es als Sicherheitsrisiko betrachten - es gibt Ihnen direkten Zugriff auf den Kernel über den physischen Zugriff auf ein Eingabegerät, unabhängig vom Anwendungsstatus, z. B. Sperrbildschirme und dergleichen.
Raman

11

Der natürliche Zustand ist, dass sich die Anwendungsdaten im RAM befinden und sich die Dateien auf der Festplatte befinden.
In Bezug auf die Leistung ist der Idealzustand, dass sich häufig verwendete Daten im RAM befinden und sich derzeit nicht benötigte Daten auf der Festplatte befinden.
Auf einem normalen System unternimmt der Kernel zwei Schritte, um dieses Ideal zu erreichen:

  • Anwendungsdaten, die für eine Weile nicht verwendet wurden, können auf die Festplatte verschoben werden: Dies ist Swap.
  • Daten aus kürzlich verwendeten Dateien werden im RAM gespeichert: Dies ist der Festplatten-Cache (für von der Festplatte gelesene Daten) und die Festplattenpuffer (für Daten, die in Kürze auf die Festplatte geschrieben werden).

In einem typischen System ist ein erheblicher Teil des RAM für den Cache und die Puffer reserviert (50% sind typische Werte). Da RAM eine begrenzte Ressource ist, müssen möglicherweise einige Anwendungsdaten zum Auslagern verschoben werden (Auslagern ist nur erforderlich, wenn der RAM besser genutzt werden kann).

Auf einem System ohne Auslagerungsspeicher kommt es vor, dass die Anwendungsdaten fast den gesamten Arbeitsspeicher belegen, sodass kaum noch Platz für den Cache vorhanden ist. Dann ist das System wahrscheinlich langsam. Der Kernel beendet erst dann Anwendungen, wenn dies wirklich erforderlich ist. Solange Anwendungen nur 99% des verfügbaren Arbeitsspeichers ausfüllen, arbeitet das System weiter, jedoch sehr langsam, da Dateien ständig von der Festplatte geladen und neu geladen werden müssen. Wenn die gleichen Anwendungen ausgeführt werden, ist das System zu diesem Zeitpunkt mit Swap schneller.

Weitere Informationen zu diesem Thema finden Sie in dieser lkml-Diskussion und in diesem Blogbeitrag .

Ich kenne keine direkte Möglichkeit, dem Kernel mitzuteilen, eine Mindestmenge an RAM für den Festplatten-Cache zu reservieren. Sie könnten einen kleinen Teil Ihres Arbeitsspeichers als Auslagerungsspeicher einrichten , vielleicht sogar komprimiert . Es gibt Erfolgsberichte auf dieser Front , obwohl ich in Ihrem speziellen Fall keine Garantien gebe.


1
Vielen Dank für die Erklärung und die Links, die dazu beigetragen haben, einige Zweifel am Tausch auszuräumen. Nach der Antwort von @Marcin auf meine Frage habe ich 256 MB komprimierten virtuellen Swap (Compcache) in meinem RAM eingerichtet. Dies beantwortet jedoch meine Frage nicht vollständig: Ich verstehe, dass mein System langsam sein wird, wenn der gesamte RAM nur von einer Anwendung verwendet wird und nichts zwischengespeichert wird. Ich kann immer noch nicht verstehen, warum dieses System für Minuten / Stunden (vielleicht für immer?) Hängt, wenn mir der Arbeitsspeicher völlig ausgeht. Ich glaube, mein Kernel erledigt seine Aufgabe nicht, um Anwendungen zu beenden, wenn nicht genügend Arbeitsspeicher zur Verfügung steht, wenn 3 Stunden nicht ausreichen, um auf TTY1 zu wechseln.
Peoro

Ich habe den Austausch mit 32 GB physischem Speicher deaktiviert und wenn schlechte Software mit der Speicherzuweisung davonläuft (hallo ld, Sie Stück Müll), bleibt sie fast eine Minute lang hängen und wacht gerade so lange auf, bis ich die unglaublich verzögerte Maus für eine Sekunde bewegen kann oder zwei alle paar Sekunden. Das OOM-Handling von Linux ist kompletter Mist. Wenn ich Glück habe, bricht der OOM-Killer den richtigen Prozess ab, ohne die Desktop-Umgebung komplett zu vermasseln. Und ich bin ein großer Fan von Linux. Mit aktiviertem Paging ist es noch viel schlimmer. Linux-Paging ist ein Witz.
Doug65536

6

Dies ist ein bekannter Fehler seit 2007 - siehe System friert bei hoher Speichernutzung ein .

In diesem Fall zeigt Windows ein Dialogfeld an, in dem der Benutzer aufgefordert wird, eine oder mehrere Anwendungen zu schließen.


2
Scheint in Ubuntu "Nicht zugewiesen" zu sein. Vielleicht sollte die DE den Benutzer warnen oder sogar die speicherintensive App einfrieren?
Nkkollaw

1
@nbrogi - alles andere als still einfrieren. Viel Glück aber, Ubuntu-Entwickler davon zu überzeugen.
Dan Dascalescu

6

Kürzlich habe ich eine Lösung für mein Problem gefunden.

Da der Linux-OOM-Killer seine Aufgabe nicht richtig erledigen kann, habe ich begonnen, einen Userspace-OOM-Killer zu verwenden: earlyoom . Es ist in C geschrieben, ziemlich konfigurierbar und es funktioniert wie ein Zauber für mich.

Ich habe auch von Alternativen gehört, wie Facebooks OOMD , die für die Ausführung auf ihren Servern entwickelt wurden, aber ich habe diese nicht ausprobiert

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.