Schaltfläche "Töte den größten Prozess"

13

Dieser Laptop hat eine SSD und deshalb habe ich beschlossen, den Tausch wegzulassen. Dies funktioniert in den meisten Fällen gut, aber manchmal wird der Arbeitsspeicher etwas knapp und der Computer wird sehr träge und neigt zum Einfrieren. Gibt es eine Möglichkeit, eine Schaltfläche "Den größten Prozess beenden" zu implementieren, die direkt zum Kernel führt, falls ich das Einfrieren schnell genug bemerke? Oder, weil es sich um einen Computer handelt, wäre eine Heuristik für den Fall, dass er einfriert und den größten Prozess selbst aufnimmt, ebenfalls in Ordnung.

Reactormonk
quelle
Meinst du den Befehl "töte den größten Prozess"?
Ramesh
Linux hat das. Es heißt der OOM-Killer. Sie müssen jedoch die Speicherüberschreitung aktivieren (und diese ist in den meisten Distributionen standardmäßig aktiviert).
Patrick
@Patrick overcommit_memoryist 0, overcommit_ratioist 50.
Reactormonk

Antworten:

11

Aus Ihrem Kommentar geht hervor, dass das System nur tauscht.

Linux hat einen OOM-Killer, der aufgerufen wird, wenn das System seinen Speicher überlastet hat und jetzt aufgebraucht ist.
Linux führt standardmäßig eine Speicherüberlastung durch, was im Grunde bedeutet, dass Programme mehr Speicher erhalten, als das System tatsächlich hat. Dies geschieht unter der Annahme, dass die Programme nicht den gesamten von ihnen angeforderten Speicher belegen. Wenn dem System jedoch der Arbeitsspeicher ausgeht, hat es den verschiedenen laufenden Prozessen bereits mitgeteilt, dass sie über den Arbeitsspeicher verfügen, sodass es nicht mehr einfach geleugnet werden kann. Stattdessen wird der OOM-Killer aufgerufen. Der OOM-Killer findet im Grunde genommen einen Prozess, von dem der Kernel glaubt, dass er den Zustand des Speichermangels lindert. Normalerweise ist dies nur der Prozess, der die meiste Speichermenge verwendet, aber der Algorithmus ist tatsächlich viel komplexer.

Da Sie overcommit_memoryauf 0(automatischer Modus) eingestellt haben, führt der Kernel eine Speicherüberlastung durch. Aus Ihrem erklärten Verhalten geht hervor, dass das System nur stark austauscht.

Ab hier gibt es 2 Möglichkeiten.

Swap reduzieren

Ihrem System geht der Arbeitsspeicher aus, und der Kernel beginnt, Dinge in den Swap zu schieben. Wenn Ihr System keinen Swap mehr hat, wird der OOM-Killer aufgerufen. Da Sie jedoch noch freien Swap-Speicherplatz haben, geschieht dies nicht.

Ihre ursprüngliche Idee, einen Prozess manuell zu beenden.

Sie können einen Prozess manuell beenden, wenn Sie der Meinung sind, dass das System zu viel austauscht und etwas sterben muss. Dies kann über die Kernel-SysRq-Trigger erfolgen.

Der Kernel hat das, was er "magisches SysRq" nennt. Dies ist eine Funktion, die den Kernel anweist, eine Art Notfalloperation auszuführen. Dies können Dinge wie "Alle Volumes schreibgeschützt erneut bereitstellen", "Alle Dateisysteme synchronisieren" oder "Jetzt neu starten" sein. Eine dieser Optionen besteht auch darin, den OOM-Killer aufzurufen.

Wenn in Ihrem Kernel Magic SysRq aktiviert ist (Kerneloption CONFIG_MAGIC_SYSRQ), können Sie dies auf zwei Arten tun.

  1. Alt+ SysRq+ f
    Drücken Sie einfach diese 3 Tasten auf der Tastatur.
  2. echo f > /proc/sysrq-trigger
    Dies führt genau die gleiche Aufgabe wie die Tastaturmethode aus, jedoch programmgesteuert.

Sie können Swap auch vollständig deaktivieren, und genau das mache ich auf den meisten meiner Systeme und genau aus diesem Grund. Swap ist insofern von Vorteil, als der Kernel Daten, die nicht verwendet werden, präventiv austauscht, sodass mehr von Ihrem RAM für das Caching verwendet werden kann. Aber es führt zu diesem erzwungenen Austauschproblem, das Sie sehen.

Ich persönlich denke, die beste Lösung ist eine Art Kernel-Option, um OOM-Killer beim erzwungenen Austausch aufzurufen. Lassen Sie Preemptive Swap grundsätzlich funktionieren, aber wenn der Kernel gezwungen ist, etwas in Swap zu verschieben, weil Sie nicht mehr über genügend RAM verfügen, rufen Sie OOM Killer auf.
Leider ist dies nur mein persönlicher Wunsch. Das macht es nicht.

Patrick
quelle
Ich wusste nichts über OOM Killer. Ich dachte an ein Skript, das die Speichernutzung mit topoder psBefehl kontinuierlich überwacht und diesen Prozess mit killBefehl beendet, wenn es einen bestimmten Schwellenwert überschreitet .
Ramesh
Ich benutze keinen Tausch.
Reactormonk
um zu sehen, welcher Prozess von Oom Killer getötet wurde:grep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1
Lesmana
@Tass Oh, ich habe den Kommentar "Ich habe beschlossen, den Tausch wegzulassen" komplett verglast, sorry :-(. Obwohl die Informationen "Manuelles Beenden eines Prozesses" immer noch bestehen. Sie sollten jedoch keine Langsamkeit erleben, wenn Ihnen der Speicher ausgeht sollte erleben, dass der Kernel nur Dinge tötet.
Patrick
@Patrick das passiert, aber nach ~ 30 Minuten.
Reactormonk