nice hat in Linux keine Auswirkung, es sei denn, dieselbe Shell wird verwendet

828
felamaslen

Wenn ich zwei verschiedene Root-Terminals eingebe:

nice -n 19 burnK7 & 

und

nice -n -19 burnK7 & 

Dann erhalten beide Prozesse etwa 50% der verfügbaren CPU-Zeit - nicht erwartet und sicherlich nicht erwünscht.

Wenn ich in demselben Root-Terminal laufe :

 nice -n 19 burnK7 & nice -n -19 burnK7 & 

Der erste Prozess erhält ungefähr 0% und der zweite Prozess erwartet ungefähr 100% der verfügbaren CPU-Zeit.

Ist das ein Fehler oder eine Funktion?

Ich verwende Arch Linux mit Version 3.16 des Kernels auf einem einzelnen Kerncomputer.

2
Priorisierung ist also bedeutungslos, es sei denn, Sie sprechen von Prozessen, die von derselben Shell, von demselben Benutzer usw. gestartet werden. Das klingt nach Dummköpfen. felamaslen vor 10 Jahren 1
Könnte jemand bestätigen, dass ich meinen Verstand nicht verliere, und Linux tatsächlich systemweite Prozesspriorisierung unterstützt? Wenn ja, wie verwende ich es? Oder wenn nicht, werde ich ein besseres Betriebssystem installieren. felamaslen vor 10 Jahren 0

1 Antwort auf die Frage

5
mtk

Also, gut danach, hier ein paar Informationen. Das Verhalten, das Sie sehen, ist auf die Autogruppen-Funktion zurückzuführen, die in Linux 2.6.38 (2010) hinzugefügt wurde. Hier ist eine bearbeitete Version eines Textes, den ich der sched(7)Handbuchseite hinzufügen möchte. Dort wird erläutert, was Sie sehen.

Der Kernel verfügt über eine Funktion, die als automatisches Gruppieren bezeichnet wird, um die interaktive Desktop-Leistung angesichts von CPU-intensiven Multiprozess-Workloads zu verbessern, z make(1) -j.

Eine neue Autogruppe wird erstellt, wenn eine neue Sitzung über erstellt wird setsid(2). Dies geschieht beispielsweise, wenn ein neues Terminalfenster gestartet wird. Ein neuer Prozess, der von erstellt wird, fork(2)erbt die Autogruppenmitgliedschaft der übergeordneten Gruppe. Somit sind alle Prozesse in einer Sitzung Mitglieder derselben automatischen Gruppe.

Wenn die automatische Gruppierung aktiviert ist, werden alle Mitglieder einer automatischen Gruppierung in derselben "Taskgruppe" des Kernel-Schedulers platziert. Der Linux-Kernel-Scheduler verwendet einen Algorithmus, der die Verteilung von CPU-Zyklen auf Taskgruppen ausgleicht. Die Vorteile für die Leistung des interaktiven Desktops können anhand des folgenden Beispiels beschrieben werden.

Angenommen, es gibt zwei Autogruppen, die um dieselbe CPU konkurrieren (z. B. entweder ein einzelnes CPU-System oder die Verwendung von taskset(1), um alle Prozesse auf dieselbe CPU in einem SMP-System zu beschränken). Die erste Gruppe enthält zehn CPU-gebundene Prozesse aus einem Kernel-Build, mit dem begonnen wurdemake -j10. Der andere enthält einen einzigen Prozess mit CPU-Bindung: einen Videoplayer. Durch das automatische Gruppieren erhalten die beiden Gruppen jeweils die Hälfte der CPU-Zyklen. Das heißt, der Videoplayer erhält 50% der CPU-Zyklen und nicht nur 9% der Zyklen, was wahrscheinlich zu einer Verschlechterung der Videowiedergabe führen würde. Die Situation auf einem SMP-System ist komplexer, der allgemeine Effekt ist jedoch derselbe: Der Scheduler verteilt CPU-Zyklen auf Taskgruppen, so dass eine Autogruppe, die eine große Anzahl von CPU-gebundenen Prozessen enthält, CPU-Zyklen nicht auf Kosten belastet der anderen Jobs auf dem System.

Der schöne Wert und die Gruppenplanung

Beim Planen von Nicht-Echtzeit-Prozessen (z. B. denen, die gemäß der Standardrichtlinie geplant SCHED_OTHERwerden) verwendet der Scheduler eine als "Gruppenplanung" bezeichnete Technik, unter der Threads in "Taskgruppen" geplant werden. Arbeitsgruppen werden unter den verschiedenen Umständen gebildet, wobei der relevante Fall hier automatisch gruppiert wird.

Wenn die automatische Gruppierung aktiviert ist, bilden alle Threads, die (implizit) in eine automatische Gruppierung (dh dieselbe Sitzung, wie sie von erstellt wurde setsid(2)) platziert werden, eine Aufgabengruppe. Jede neue Autogruppe ist somit eine eigene Aufgabengruppe.

Bei der Gruppenplanung wirkt sich der nette Wert eines Threads aus, wenn Entscheidungen nur relativ zu anderen Threads in derselben Aufgabengruppe geplant werden . Dies hat einige überraschende Konsequenzen im Hinblick auf die traditionelle Semantik des guten Wertes von UNIX-Systemen. Wenn die automatische Gruppierung aktiviert ist (dies ist der Standard in verschiedenen Distributionen), hat die Verwendung nice(1)eines Prozesses nur Auswirkungen auf die Planung in Bezug auf andere Prozesse, die in derselben Sitzung ausgeführt werden (normalerweise: das gleiche Terminalfenster).

Umgekehrt wird bei zwei Prozessen, bei denen es sich zum Beispiel um die einzigen CPU-gebundenen Prozesse in verschiedenen Sitzungen handelt (z. B. verschiedene Terminalfenster, deren Jobs jeweils an verschiedene Autogruppen gebunden sind), den netten Wert des Prozesses in einer der Sitzungen hat keine Auswirkung auf die Entscheidungen des Schedulers in Bezug auf den Prozess in der anderen Sitzung.

Wenn Sie verhindern möchten, dass das automatische Gruppieren das traditionelle niceVerhalten beeinträchtigt, wie hier beschrieben, können Sie die Funktion deaktivieren

echo 0 > /proc/sys/kernel/sched_autogroup_enabled 

Beachten Sie jedoch, dass dies auch dazu führt, dass die Vorteile der automatischen Gruppenfunktion für die Desktop-Interaktivität deaktiviert werden (siehe oben).

Die Autogruppe ist ein guter Wert

Die automatische Gruppenmitgliedschaft eines Prozesses kann über die Datei angezeigt werden /proc/[pid]/autogroup:

$ cat /proc/1/autogroup /autogroup-1 nice 0 

Diese Datei kann auch verwendet werden, um die einer automatischen Gruppe zugewiesene CPU-Bandbreite zu ändern. Dies geschieht durch Schreiben einer Zahl im Bereich "nice" in die Datei, um den Wert der Autogruppe festzulegen. Der zulässige Bereich liegt zwischen +19 (niedrige Priorität) und -20 (hohe Priorität).

Die Einstellung "Autogroup nice" hat dieselbe Bedeutung wie der "nice" -Prozesswert, gilt jedoch für die Verteilung der CPU-Zyklen auf die Autogroup als Ganzes, basierend auf den relativen "nice" -Werten anderer Autogruppen. Für einen Prozess in einer automatischen Gruppe sind die von ihm empfangenen CPU-Zyklen ein Produkt des günstigen Werts der automatischen Gruppe (im Vergleich zu anderen automatischen Gruppen) und des positiven Werts des Prozesses (im Vergleich zu anderen Prozessen in derselben automatischen Gruppe).

@ Burgi Fair genug. In eine meiner Meinung nach jetzt brauchbarere Form überarbeitet. mtk vor 7 Jahren 1