Computer friert auf fast vollem RAM ein, möglicherweise Festplatten-Cache-Problem


74

Das Problem ist meiner Meinung nach diesem Thread etwas ähnlich .

Es spielt keine Rolle, ob Swap aktiviert oder deaktiviert ist. Immer wenn die tatsächlich genutzte RAM-Menge sich dem Maximum nähert und fast kein Speicherplatz mehr für den Festplatten-Cache vorhanden ist, reagiert das System nicht mehr.

Die Festplatte dreht sich wild und manchmal friert sie nach einer Wartezeit von 10 bis 30 Minuten auf und manchmal nicht (oder mir geht die Geduld aus). Manchmal, wenn ich schnell agiere, kann ich es schaffen, die Konsole langsam zu öffnen und einige RAM-Essanwendungen wie den Browser zu beenden, und das System friert fast sofort ein.

Aufgrund dieses Problems sehe ich fast nie etwas im Swap, nur manchmal gibt es einige wenige MB, und bald danach erscheint dieses Problem. Meine nicht so fundierte Vermutung wäre, dass es in irgendeiner Weise damit zusammenhängt, dass der Festplatten-Cache zu gierig oder die Speicherverwaltung zu nachgiebig ist. Wenn der Speicher benötigt wird, wird er nicht schnell genug freigegeben und das System wird ausgehungert.

Das Problem kann sehr schnell gelöst werden, wenn mit Lagrge-Dateien (500 MB +) gearbeitet wird, die im Festplatten-Cache geladen sind und anschließend vom System nicht schnell genug entladen werden können.

Jede Hilfe oder Ideen wird sehr geschätzt.

Im Moment muss ich in ständiger Angst leben, wenn ein Computer einfrieren kann und ich ihn normalerweise neu starten muss. Wenn der RAM-Speicher wirklich ausgeht, würde ich es sehr viel bevorzugen, wenn nur einige User-Space-Anwendungen, wie z. B. Broser, beendet werden ( am liebsten wenn ich irgendwie markieren könnte was zuerst zu töten ist)

Obwohl das Geheimnis ist, warum ich in dieser Situation nicht getauscht werde.

UPDATE: Es hing einige Zeit nicht, aber jetzt habe ich wieder mehrere Vorkommnisse. Ich behalte jetzt zu jeder Zeit den RAM-Monitor auf meinem Bildschirm und als der Hang passierte, zeigte er immer noch ~ 30% frei (Wird wahrscheinlich vom Festplatten-Cache verwendet). Zusätzliche Symptome: Wenn zu dem Zeitpunkt, an dem ich ein Video anschaue (VLC-Player), der Ton zuerst stoppt, stoppt das Bild nach einigen Sekunden. Während der Ton gestoppt ist, habe ich immer noch die Kontrolle über den PC, aber wenn das Bild stoppt, kann ich die Maus nicht mehr bewegen und habe sie nach einigem Warten neu gestartet. Übrigens geschah dies nicht, als ich anfing, das Video zu sehen, aber irgendwann in (20 Minuten) und ich tat zu der Zeit nichts anderes, obwohl Browser und OOWRITE die ganze Zeit über auf dem zweiten Bildschirm geöffnet waren. Grundsätzlich entscheidet sich etwas einfach dafür, an einem bestimmten Punkt zu geschehen, und hängt das System auf.

Wie in den Kommentaren angefordert, habe ich dmesg direkt nach dem Hang ausgeführt. Ich habe nichts Seltsames bemerkt, wusste aber nicht, wie es aussehen sollte. Deshalb hier: https://docs.google.com/document/d/1iQih0Ee2DwsGd3VuQZu0bPbg0JGjSOCRZhu0B05CMYs/edit?hl=de_DE&authkey=CPzF7


11
Dies muss mehr Aufmerksamkeit bekommen. Ich weiß, dass es seit vielen Jahren Fehler gibt.
3.

1
@ n3rd: Das ist der Bug .
Dan Dascalescu

@ Krišjānis Nesenbergs: Bitte korrigiere mich, wenn ich falsch kopiere. Das Einfügen einer langen Datei lässt sie auch hängen.
Rick2047

Vielen Dank, dass Sie diese Frage gestellt und eine Lösung gefunden haben. Bitte fügen Sie dem Update ein Datum hinzu, da sonst nicht klar ist, was funktioniert hat und was nicht. Ich habe das gleiche Problem, ich überprüfe immer die Speicherkapazität und ich habe 16 GB, plane 32 GB zu haben, um zu sehen, ob ich es so beheben kann ...
Beto Aveiga

Antworten:


63

Um dieses Problem zu beheben, wurde festgestellt, dass Sie die folgende Einstellung auf ungefähr 5% -6% des gesamten physischen Arbeitsspeichers festlegen müssen, dividiert durch die Anzahl der Kerne im Computer:

sysctl -w vm.min_free_kbytes=65536

Beachten Sie, dass dies eine Pro-Core-Einstellung ist. Wenn ich also 2 GB RAM und zwei Kerne habe, habe ich aus Sicherheitsgründen 6% von nur 1 GB berechnet und ein bisschen mehr hinzugefügt.

Dies zwingt den Computer dazu, diese Menge an RAM freizuhalten, und schränkt dadurch die Fähigkeit ein, Festplattendateien zwischenzuspeichern. Natürlich wird immer noch versucht, sie zwischenzuspeichern und sofort auszutauschen, daher sollten Sie wahrscheinlich auch das Austauschen einschränken:

sysctl -w vm.swappiness=5

(100 = so oft wie möglich tauschen, 0 = nur bei Bedarf tauschen)

Das Ergebnis ist, dass Linux nicht mehr willkürlich entscheidet, eine ganze Filmdatei von ca. 1 GB im RAM zu laden, während es sie ansieht, und dabei die Maschine tötet.

Jetzt ist genügend Speicherplatz reserviert, um einen Speicherhunger zu vermeiden, der offenbar das Problem war (da es keine weiteren Einfrierungen wie zuvor gibt).

Nachdem ich einen Tag lang getestet habe, gibt es keine Abstürze mehr. Manchmal kommt es zu geringfügigen Verlangsamungen, weil Dinge häufiger zwischengespeichert werden. Aber damit kann ich leben, wenn ich den Computer nicht alle paar Stunden neu starten muss.

Die Lektion hier lautet: Die standardmäßige Speicherverwaltung ist nur ein Anwendungsfall und nicht immer die beste, auch wenn einige Leute versuchen, etwas anderes vorzuschlagen. Die Konfiguration von Home Entertainment Ubuntu sollte sich von der Konfiguration des Servers unterscheiden.


Sie möchten diese Einstellungen wahrscheinlich dauerhaft machen, indem Sie sie /etc/sysctl.confwie folgt hinzufügen :

vm.swappiness=5
vm.min_free_kbytes=65536

Gute Entdeckung, versuchen Sie, Fehler zu melden, damit das Problem bekannter wird, und hoffentlich findet jemand eine Lösung, um den gesamten Film nicht zufällig zu laden.
Oxwivi

Vielen Dank, sehr detailliert und erklärt mein Problem. Sehr geschätzt!
odedbd

1
Nun, ich habe fast alles versucht und nur Ihr Vorschlag hat die Dinge verbessert. danke
vitalii

1
Wenn ich ohne Swap-Partition arbeite, sollte ich eine größere Menge als 5-6% verwenden? Und die Einstellung vm.swappinesswird in diesem Fall nichts bewirken, nehme ich an?
Jarett Millard

1
"[vm.min_free_kbytes] zwingt den Computer, diese Menge an RAM frei zu halten, und schränkt dadurch die Fähigkeit ein, Festplattendateien zu cachen." - Entschuldigung, aber das hat überhaupt nichts mit dem zu tun, was vm.min_free_kbytespassiert. Es fungiert als ein Seitenblock, der reserviert ist, um atomare (dh Füll- oder Kill- / Nicht- __GFP_WAIT) Zuweisungen zu erleichtern, wenn ein hoher Systemspeicherbedarf besteht. Es könnte in der Tat sinnvoll sein, dies hier zu erwähnen (da es sich wahrscheinlich um Systemspeicherprobleme handelt), aber dies wäre sicherlich nicht der in dieser Antwort beschriebene Grund.
Chris Down

9

Dies geschah für mich in einer neuen Installation von Ubuntu 14.04.

In meinem Fall hatte dies nichts mit den genannten Systemproblemen zu tun.

Stattdessen bestand das Problem darin, dass sich die UUID der Swap-Partition während der Installation von der nach der Installation unterschied. Mein Swap war also nie aktiviert und mein Computer stürzte nach ein paar Stunden ab.

Die Lösung bestand darin, die aktuelle UUID der Swap-Partition mit zu überprüfen

sudo blkid

und dann sudo nano /etc/fstab, um den UUID-Wert des falschen Austauschs durch den von blkid gemeldeten zu ersetzen.

Ein einfacher Neustart, um die Änderungen zu beeinflussen, und voila.


3
Ich danke dir sehr! Ich habe seit fast einem Jahr mit diesem unglaublich ärgerlichen Fehler zu kämpfen und alles versucht , um ihn zu beheben. Warum hat Linux dieses Verhalten? Es scheint, als sollte es so handeln, als gäbe es keinen Tausch, und nur den OOM-Killer aufrufen. Stattdessen scheint es so zu tun, als gäbe es einen Swap, aber es gelingt nicht, die Dinge tatsächlich auszutauschen (da dies nicht der Fall ist, da es nicht richtig konfiguriert ist).
crazy2be

@ crazy2be Es scheitert nicht, es gelingt endlos. Auch ohne Swap kann Linux Programme und unveränderte Dateien im Speicher auslagern und von der Festplatte erneut lesen.
Martin Thornton,

4

Ich weiß, dass diese Frage alt ist, aber ich hatte dieses Problem in Ubuntu (Chrubuntu) 14.04 auf einem Acer C720 Chromebook. Ich habe versucht, Krišjānis Nesenbergs Lösung, und es hat etwas funktioniert, aber immer noch manchmal abgestürzt.

Endlich habe ich eine Lösung gefunden, bei der zram installiert wurde, anstatt physischen Swap auf der SSD zu verwenden. Um es zu installieren Ich folgte einfach den Anweisungen hier , wie folgt aus :

sudo apt-get install zram-config

Danach konnte ich die Größe des ZRAM-Swaps durch Ändern /etc/init/zram-config.confin Zeile 21 konfigurieren .

20: # Calculate the memory to user for zram (1/2 of ram)
21: mem=$(((totalmem / 2 / ${NRDEVICES}) * 1024))

Ich habe die 2 durch eine 1 ersetzt, um die ZRAM-Größe mit der RAM-Größe zu vergleichen. Seitdem habe ich keine Einfrierungen oder Systemunreaktionen mehr gehabt.


zramist nur dann sinnvoll, wenn Sie keinen weiteren Arbeitsspeicher installieren können. Wenn das System beim Wechseln zu SSD zu langsam ist und der Arbeitsspeicher ohne Wechseln nicht mehr ausreicht, zramkann dies hilfreich sein, bis Sie versuchen, ein wenig mehr zu tun. Das Ergebnis ist dasselbe wie bei einem fehlenden Wechseln des Arbeitsspeichers.
Mikko Rantalainen

4

Bei mir hat nichts geklappt !!

Also habe ich ein Skript geschrieben, um die Speichernutzung zu überwachen. Es wird zuerst versucht, den RAM-Cache zu löschen, wenn der Speicherverbrauch einen Schwellenwert erhöht. Sie können diesen Schwellenwert im Skript konfigurieren. Wenn der Speicherverbrauch den Schwellenwert auch dann nicht unterschreitet, werden die Prozesse in abnehmender Reihenfolge des Speicherverbrauchs nacheinander beendet, bis der Speicherverbrauch den Schwellenwert unterschreitet. Ich habe es standardmäßig auf 96% gesetzt. Sie können es konfigurieren, indem Sie den Wert der Variablen RAM_USAGE_THRESHOLD im Skript ändern.

Ich stimme zu, dass das Beenden von Prozessen, die viel Speicher verbrauchen, nicht die perfekte Lösung ist, aber es ist besser, EINE Anwendung zu beenden, anstatt ALLE Arbeit zu verlieren !! Das Skript sendet Ihnen eine Desktop-Benachrichtigung, wenn die RAM-Auslastung den Schwellenwert erhöht. Außerdem werden Sie benachrichtigt, wenn ein Prozess abgebrochen wird.

#!/usr/bin/env python
import psutil, time
import tkinter as tk
from subprocess import Popen, PIPE
import tkinter
from tkinter import messagebox
root = tkinter.Tk()
root.withdraw()

RAM_USAGE_THRESHOLD = 96
MAX_NUM_PROCESS_KILL = 100

def main():
    if psutil.virtual_memory().percent >= RAM_USAGE_THRESHOLD:
        # Clear RAM cache
        mem_warn = "Memory usage critical: {}%\nClearing RAM Cache".\
            format(psutil.virtual_memory().percent)
        print(mem_warn)
        Popen("notify-send \"{}\"".format(mem_warn), shell=True)
        print("Clearing RAM Cache")
        print(Popen('echo 1 > /proc/sys/vm/drop_caches',
                    stdout=PIPE, stderr=PIPE,
                    shell=True).communicate())
        post_cache_mssg = "Memory usage after clearing RAM cache: {}%".format(
                            psutil.virtual_memory().percent)
        Popen("notify-send \"{}\"".format(post_cache_mssg), shell=True)
        print(post_cache_mssg)

        if psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD:
            print("Clearing RAM cache saved the day")
            return
        # Kill top C{MAX_NUM_PROCESS_KILL} highest memory consuming processes.
        ps_killed_notify = ""
        for i, ps in enumerate(sorted(psutil.process_iter(),
                                      key=lambda x: x.memory_percent(),
                                      reverse=True)):
            # Do not kill root
            if ps.pid == 1:
                continue
            elif (i > MAX_NUM_PROCESS_KILL) or \
                    (psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD):
                messagebox.showwarning('Killed proccess - save_hang',
                                       ps_killed_notify)
                Popen("notify-send \"{}\"".format(ps_killed_notify), shell=True)
                return
            else:
                try:
                    ps_killed_mssg = "Killed {} {} ({}) which was consuming {" \
                                     "} % memory (memory usage={})". \
                        format(i, ps.name(), ps.pid, ps.memory_percent(),
                               psutil.virtual_memory().percent)
                    ps.kill()
                    time.sleep(1)
                    ps_killed_mssg += "Current memory usage={}".\
                        format(psutil.virtual_memory().percent)
                    print(ps_killed_mssg)
                    ps_killed_notify += ps_killed_mssg + "\n"
                except Exception as err:
                    print("Error while killing {}: {}".format(ps.pid, err))
    else:
        print("Memory usage = " + str(psutil.virtual_memory().percent))
    root.update()


if __name__ == "__main__":
    while True:
        try:
            main()
        except Exception as err:
            print(err)
        time.sleep(1)

Speichern Sie den Code in einer Datei mit dem Namen save_hang.py. Führen Sie das Skript wie folgt aus:

sudo python save_hang.py

Bitte beachten Sie, dass dieses Skript nur mit Python 3 kompatibel ist und Sie das tkinter-Paket installieren müssen. Sie können es installieren als:

sudo apt-get install python3-tk

Hoffe das hilft...


2

Ich vermute, Sie haben vm.swappinesseinen sehr niedrigen Wert festgelegt, wodurch der Kernel zu spät ausgetauscht wird und zu wenig RAM für das System zur Verfügung steht.

Sie können Ihre aktuelle Swap-Einstellung anzeigen, indem Sie Folgendes ausführen:

sysctl vm.swappiness

Standardmäßig ist dies auf 60 eingestellt. Das Ubuntu-Wiki empfiehlt die Einstellung auf 10, Sie können jedoch auch einen höheren Wert festlegen. Sie können es ändern, indem Sie Folgendes ausführen:

sudo sysctl vm.swappiness=10

Dadurch wird es nur für die aktuelle Sitzung geändert. Damit es dauerhaft bleibt , müssen Sie vm.swappiness = 10es der /etc/sysctl.confDatei hinzufügen .

Wenn Ihre Festplatte langsam ist, sollten Sie eine neue kaufen.


Tatsächlich verringerte das Reduzieren der Sprungkraft das Problem (es passierte seltener). Ich halte es jetzt bei 5. Obwohl es vielleicht ein weiteres Problem mit der höheren Austauschbarkeit war, denn als es 60 Jahre alt war und ich mich entschied, einen Film anzusehen oder eine große Datei zu bearbeiten, wurde eine ganze Datei oder fast ein GB in den Speicher geladen und das System begann sofort, die Programme auszutauschen, die ich war aktiv mit und sogar Benutzeroberfläche selbst. Die Sache ist, dass ich denke, ich verstehe den Austauschteil, was ich will, ist, gierige Benutzeranwendungen zu töten, anstatt die Maschine einzufrieren, wenn der RAM ausgeht. (Und vorzugsweise Dateigröße im Cache begrenzen)
Krišjānis Nesenbergs

@Krisa: Wenn dem System der Arbeitsspeicher ausgeht (RAM und Swap), ruft der Kernel oom_kill auf, wodurch Prozesse abgebrochen werden, um Arbeitsspeicher zu sparen. Leider können Sie die Zielprozesse nicht steuern. Um es manuell auszulösen, drücken Sie Alt + SysRq + F. Wenn Sie den dmesgBefehl ausführen , sollten Sie einige Informationen (und den Prozessnamen + die ID) des Prozesses sehen. Ich denke, Sie sollten besser eine neue, schnellere Festplatte kaufen. Oder aktualisieren Sie Ihren RAM.
Lekensteyn

3
Das Problem ist, dass oom_kill erst aufgerufen wird, wenn der Computer für ca. 30 Minuten gesperrt ist. Gibt es zumindest eine Möglichkeit zu wissen, welcher Prozess zuerst beendet wird?
Krišjānis Nesenbergs

2
Ich habe 2 GB RAM und die Festplatte ist 5400 U / min. Ich glaube wirklich nicht, dass es ein so altes System ist, das eine halbe Stunde Einfrieren rechtfertigt, wenn man sich auf einem Monitor ein Video ansieht und auf dem anderen 20 bis 30 Tabs ansieht. Eigentlich wäre ich sehr froh, wenn ich immer auf die Konsole zugreifen und einige Prozesse beenden könnte - gibt es eine Möglichkeit, Benutzereingaben und Terminals mit höchster Priorität zu versehen, damit sie funktionieren, während das System einfriert?
Krišjānis Nesenbergs

1
Wie auch immer - das Austauschen und die Größe des Arbeitsspeichers ist ein wenig problematisch. Das Problem ist, dass das System für eine lange Zeit nicht mehr reagiert, auch wenn Swap deaktiviert ist. Danach wird das Programm manchmal noch ausgeführt (damit es irgendwo Speicher findet) und zu anderen Zeiten wird oom_killer ausgeführt. Das System sollte in der Lage sein, zu erkennen, dass kein RAM mehr vorhanden ist, und mich nur nicht mehr damit befassen, weitere Aufgaben auszuführen. Gibt es also eine Möglichkeit, diese Einfrierungen zu stoppen oder die Priorität der Benutzereingaben so hoch einzustellen, dass ich auf die Konsole wechseln kann, wenn sie auftreten und einige Prozesse selbst beenden kann?
Krišjānis Nesenbergs

2

Ich habe lange mit diesem Problem zu kämpfen, aber jetzt scheint es auf meinem Laptop gelöst zu sein.

Wenn keine der anderen Antworten für Sie funktioniert (ich habe die meisten ausprobiert), spielen Sie mit min_free_kbytes , um mehr Speicherplatz im Arbeitsspeicher zu haben, wenn Ihr Computer mit dem Auslagern beginnt (kurz bevor Sie diesen Mindestwert im freien Arbeitsspeicher erreichen).

Ich habe 16 GB RAM, aber früher als später wurde der Speicher voll und reagierte dann für 10 bis 30 Minuten nicht mehr, bis einige Dinge ausgetauscht wurden.

Zumindest für mich beschleunigt das Setzen des Werts min_free_kbytes über den empfohlenen Wert den Austauschvorgang erheblich.

Versuchen Sie Folgendes für 16 GB RAM:

vm.min_free_kbytes=500000

Um diesen Wert einzustellen, sehen Sie sich andere Antworten an oder googeln Sie einfach :)


0

Ich verwende ständig einen meiner Laptops von einer laufenden Ubuntu-SD-Karte mit einer kleinen ext4-Speicherpartition und einer Auslagerungsdatei auf der Festplatte. Wenn fast der gesamte Arbeitsspeicher verwendet wird und der Swap-Wert zu niedrig ist (manchmal ziehe ich es vor, die Festplatte möglichst vollständig auszuschalten, weil sie laut ist), fällt die Linux-Leistung für mich in der Regel von der Klippe, so dass ich gerade dabei bin TTY1 Firefox zu töten dauert 15 Minuten.

Das Erhöhen /proc/sys/vm/vfs_cache_pressureder Standardeinstellung von 100 auf einen Wert von 6000 scheint dies zu verhindern. Die Kernel-Dokumentation warnt jedoch davor, dies zu tun

Increasing vfs_cache_pressure significantly beyond 100 may have negative
performance impact. Reclaim code needs to take various locks to find freeable
directory and inode objects. With vfs_cache_pressure=1000, it will look for
ten times more freeable objects than there are.

Ich bin mir nicht ganz sicher, welche Nebenwirkungen das haben kann, also würde ich vorsichtig sein.


Sie werden wahrscheinlich bessere Ergebnisse vfs_cache_pressureerzielen, wenn Sie näher an 10 (dh viel weniger als 100) und min_free_kbyteshöher einstellen . Seien Sie gewarnt, dass der min_free_kbytesKernel-OOM-Killer alle tötet , wenn Sie zu hoch einstellen!
Mikko Rantalainen

@MikkoRantalainen Ich habe bereits min_free_kbytesauf 262144 angehoben und festgestellt, dass eine Absenkung vfs_cache_pressureden gegenteiligen Effekt hat - eine Absenkung unter 100 führt dazu, dass das System viel schneller nicht mehr reagiert. Ich bin mir nicht sicher warum genau.
Hitechcomputergeek

Im Allgemeinen führt das Erhöhen des vfs_cache_pressureWertes dazu, dass Verzeichnisse vor dem Inhalt der zwischengespeicherten Dateien abgelegt werden. Infolgedessen leidet die Gesamtleistung in der Regel bei Werten über 100. Wenn Sie Schritte zur Reproduktion finden, kann das System abstürzen / hängen, beispielsweise mit Ubuntu Live CD Dann können Kernel-Entwickler die Ursache herausfinden. Bei mir tritt der Hang ohne Vorwarnung auf. Ich vermute, dass der Kernel aufgrund von OOM hängt, bevor OOM Killer genügend RAM freigegeben hat. Ich führe jetzt min_free_kbytes = 100000, admin_reserve_kbytes = 250000 und user_reserve_kbytes = 500000 aus.
Mikko Rantalainen

(Forts.) Ich bin mit der obigen Konfiguration noch nicht abgestürzt, obwohl ich swappiness = 5 und vfs_cache_pressure = 20 habe. Das System verfügt über 16 GB RAM und 8 GB Swap auf SSD. Ein anderes System hat 32 GB RAM und kein Swap und es scheint zufällig dasselbe Problem zu haben - da das Drücken von Alt + SysRq + f, nachdem sich das System langsam anfühlt, zu helfen scheint, würde das System nicht hängen bleiben, wenn OOM Killer schnell genug agiert.
Mikko Rantalainen
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.