Wie kann verhindert werden, dass ein bestimmtes Programm ausgetauscht wird?

23

Kann verhindert werden, dass ein bestimmtes Programm (dh Rhythmusbox und ihre Abhängigkeiten) jemals auf die Festplatte wechselt?

Ich frage, weil ich ein Problem habe, wenn ein Musikplayer Schluckauf macht, wenn Chromium zu viel Speicher beansprucht. Gibt es eine Möglichkeit, dies zu umgehen? Dies ist kein Problem mehr in Windows, vermutlich gibt es einen Weg.

Alexei Averchenko
quelle
Tomboy hat das gleiche Problem. Dies ist einer der Gründe, warum einige Leute zu GNote gewechselt sind .
Cristian Ciupitu
1
Ich denke, dass das Problem mit dem Schluckauf nicht unbedingt durch das Tauschen verursacht wird. Wenn das Programm etwas abspielt, sollte Linux dies bemerken und nicht austauschen. Programme, die nicht viel bewirken, werden zuerst ausgetauscht. Bist du gelaufen psoder um topzu sehen, ob die Rhytmbox wirklich getauscht ist, indem du das RSS/ RES-Feld prüfst ? Ich denke, dass Ihr Problem hauptsächlich durch eine falsche Planung verursacht wird. Sie sollten versuchen, reniceden Rhytmbox-Prozess auszuführen oder einige seiner Einstellungen zu ändern, z. B. die Größe des Audiopuffers.
Cristian Ciupitu
1
Vielen Dank! Gibt es eine Möglichkeit, den anfänglichen netten Wert eines Programms festzulegen? / etc / nicetab oder so? :)
Alexei Averchenko
related: stackoverflow.com/questions/2360116/…
Ciro Santilli Am

Antworten:

10

Ich denke, dass das Problem mit dem Schluckauf nicht unbedingt durch das Tauschen verursacht wird. Wenn ein Programm etwas abspielt, sollte Linux dies bemerken und nicht austauschen. Programme, die nicht viel bewirken, werden zuerst ausgetauscht. Sie können überprüfen, ob das Programm wirklich ausgetauscht wird, indem Sie das Feld RSS/ RESvon ps oder von oben betrachten . RSSist die residente Satzgröße, der nicht ausgelagerte physische Speicher, den eine Task verwendet (in Kilobyte).

Ich denke, dass Ihr Problem höchstwahrscheinlich durch eine falsche CPU- und E / A-Planung und ein bisschen Ineffizienz der Rhythmbox verursacht wird, wodurch sie empfindlich auf hohe Systemlasten reagiert. Die CPU-Priorität kann mit den Befehlen nice und renice geändert werden . Die E / A-Priorität kann mit dem Befehl ionice geändert werden . Nur der Superuser kann hohe Prioritäten verwenden. Sie sollten auch wissen, dass Linux-Kernel-Leute versuchen, die Reaktionsfähigkeit von Desktopsystemen mit verschiedenen Patches mit geringer Latenz zu verbessern. Sie sollten daher in Betracht ziehen, sie zu verwenden. Eines davon ist ein ~ 200 Zeilen langer Patch von Mike Galbraith, der sogar Linus beeindruckt hat. Die Alternative zu diesem Patch ist Lennart Poetterings Gruppentrick was ich denke, wird die Standardeinstellung in Fedora 15 sein.

Auf jeden Fall gibt es ohne diese Patches zwei Möglichkeiten: Starten Sie das Programm mit hoher Priorität oder ändern Sie es anschließend. Für die erste Option können Sie ein Wrapper-Skript um Rhythmbox verwenden:

#!/bin/sh
# Run Rhytmbox with high CPU and I/O priorities
nice -n -10 ionice -c 1 -n 1 su -l -c rhythmbox alexei

Sie müssen es als root ausführen. Wenn Sie sich nicht als root anmelden möchten, um dies zu starten, können Sie entweder suoder verwenden sudo.

Wenn Sie die Priorität danach ändern rhythmboxmöchten und sich nicht als root anmelden möchten , können Sie versuchen, einen Cron-Job zu verwenden, der alle 5 Minuten ausgeführt wird und die Priorität des Prozesses festlegt. Ich würde dies jedoch nicht empfehlen:

#!/bin/sh
renice -n -10 -p `pidof rhythmbox`
ionice -c 1 -n 1 -p `pidof rhythmbox`
Cristian Ciupitu
quelle
5

Kurze Antwort: Sie können und sollten nicht.

Vor langer Zeit haben ausführbare Dateien das Sticky-Bit gewürdigt, das +tden Kernel veranlasste, nicht zu tauschen, aber heute wird es ignoriert.

Wenn der Kernel entscheidet, dass er tauschen muss, hat er sicher einen gültigen Grund. Linux geht sehr aggressiv mit der Speichernutzung um, da inaktivierter RAM eine verschwendete Ressource ist.

Wenn Sie wirklich nicht tauschen möchten, mehr RAM erhalten oder einfach # swapoff -a(nicht empfohlen, kann Ihr System unbrauchbar werden, wenn Sie bereits Probleme haben).

Shouldn'tgeht, wenn Sie eine App entwickeln und nicht möchten, dass sie überhaupt ausgetauscht wird. Schauen Sie sich diesen Beitrag auf stackoverflow an .

Torian
quelle
2
Ich glaube nicht, dass das Reservieren von 100 MiB mein System kaputt macht. Vielleicht gibt es eine andere Möglichkeit, mein spezielles Problem zu lösen (siehe bearbeitete Frage)?
Alexei Averchenko
1
Wenn Sie vorhaben, einen Prozess gegenüber anderen Prozessen auf einem hohen Niveau der Reaktionsfähigkeit zu halten, ist die Antwort nett (Sie müssen dafür root sein). Es ist nicht einfach, mit Memory Paging herumzuspielen, wenn Sie sich nicht die Hände schmutzig machen möchten. (Tippen Sie auf den Code, kompilieren Sie ihn erneut oder laden Sie eine benutzerdefinierte Bibliothek herunter, um den Prozess zu täuschen und die Funktion zum Zuweisen von Speicher zu optimieren.) . Rat ? Wiederholen Sie den Vorgang, holen Sie sich mehr RAM oder öffnen Sie keine Tabs mehr;)
Torian
5
"Wenn der Kernel entscheidet, dass er tauschen muss, hat er sicher einen gültigen Grund." Das ist nicht wahr. Heute hatte ich 1,3G freien Speicher. Der Linux-Kernel hat meine httpd-Prozesse in den Swap (370M) gesteckt.
bluszcz
@bluszcz (na ja, andere lesen dies, wenn man bedenkt, wie alt dieser Kommentar ist): Dies könnte daran liegen, dass der Festplatten-Cache für die von Ihrem httpd bereitgestellten Dateien wichtiger ist als selten verwendete Teile Ihres httpd selbst - siehe die anderen Antworten Erwähnung von "swappiness".
Jan Schejbal
@ JanSchejbal Das liegt daran, dass Linux, zumindest ohne dass jemand es sagt, nicht weiß, welche Prozesse wichtig sind oder nicht. In einer Serverumgebung sollten Sie dem System mitteilen können, welche Prozesse wichtig sind und welche nicht. "Andere Dinge interessieren mich nicht, aber diese Prozesse sind für den Betrieb dieses Servers am wichtigsten"
Rahly
3

Dafür gibt es verschiedene Möglichkeiten. Sie können versuchen, zu versuchen, ist "sagt", dass Linux weniger mit Swap arbeitet (im Allgemeinen):

echo 10 > /proc/sys/vm/swappiness

Von : https://www.kernel.org/doc/Documentation/sysctl/vm.txt

swappiness

Mit diesem Steuerelement wird festgelegt, wie aggressiv der Kernel die Speicherseiten austauscht. Höhere Werte erhöhen die Aggressivität, niedrigere Werte verringern den Swap-Betrag.

Der Standardwert ist 60.

Eine andere Option ist die Verwendung des cgroups-Kernel-Managers. Dies ist prozessspezifisch, Sie müssen jedoch einige "Arbeiten" ausführen: Beantwortet hier: /unix/10214/per-process-swapiness-for -linux # 10227

ceinmart
quelle
1
Dies wirkt sich global und nicht prozessspezifisch auf die Swapfähigkeit aus.
Lorenzo Von Matterhorn
1
Ja, Sie können feststellen, dass ich auf "(allgemein)" schrieb. Die Option, pro Prozess zu sein, ist der Link zu einer anderen Antwort unter Verwendung von cgroups.
Ceinmart
Dann ist das keine Hilfe, oder?
Ken Sharp
Ken Sharp: Diese Antwort ist die einzige, die direkt darauf verweist, was (zumindest auf den ersten Blick) die beste Lösung für das Problem zu sein scheint. Also ... so ziemlich das Gegenteil von dem, was du gesagt hast.
Phils
@phils Du verstehst nicht, wie das funktioniert.
Ken Sharp
0

Sie können mlockall()Syscall verwenden. mlockall () erzwingt, dass der Speicherprozess resident ist (= kein Swap, kein Overcommit, etc ...). AFAIK, es gibt keinen Shell-Befehl, aber es ist einfach, einen zu erstellen. Es würde so aussehen:

if (mlockall(MCL_FUTURE | MCL_CURRENT))
     perror("mlockall");
execvp(argv[0], argv);

Beachten Sie, dass Sie root sein müssen, um anrufen zu können mlockall() .

Wie in einer anderen Antwort gesagt, denke ich jedoch nicht, dass es wirklich das ist, was Sie wollen.

Jérôme Pouiller
quelle
1
Der Code wird überhaupt nicht funktionieren, da execvp ein Frontend zum Ausführen ist, das mlockall rückgängig macht. Siehe Anmerkungen auf der mlock-Manpage.
Johannes Matokic