Prozess "Freundlichkeit" vs. "Priorität"

104

Beim Laufen topsehe ich diese (verkürzte) Beispielausgabe:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 4586 ipc-adm+  20   0 1303900 605152  92844 S  30,6 29,3   3:52.88 firefox
 3985 ipc-adm+  20   0  258588 124508  63072 S  12,2  6,0   0:40.04 compiz
 3092 root      20   0  172392  56164  25980 S   6,1  2,7   0:30.13 Xorg

Es gibt zwei Werte, die mich interessieren: PR(Priorität) und NI(Feinheit).

Wenn ich verstanden habe, was ich bereits richtig herausgefunden habe, bestimmen beide, wie viel CPU-Zeit ein Prozess im Gegensatz zu anderen Prozessen erhält. Aber was ist dann der Unterschied zwischen diesen Werten?

Könnten Sie bitte auch beschreiben, wie diese Werte eines Prozesses manipuliert werden und unter welchen Umständen dies nützlich sein könnte?

Byte Commander
quelle

Antworten:

103

Netter Wert ist ein User-Space und Priority PR ist die eigentliche Priorität des Prozesses, die vom Linux-Kernel verwendet wird. Unter Linux sind die Prioritäten 0 bis 139, wobei 0 bis 99 für Echtzeit und 100 bis 139 für Benutzer sind. Ein guter Wertebereich ist -20 bis +19, wobei -20 der höchste Wert ist, 0 der Standardwert und +19 der niedrigste Wert. Verhältnis zwischen nettem Wert und Priorität ist:

PR = 20 + NI

Der Wert von PR = 20 + (-20 to +19)ist also 0 bis 39, der 100 bis 139 abbildet.

Nach dem obersten Handbuch:

PR - Priorität Die Planungspriorität der Aufgabe. Wenn in diesem Feld "rt" angezeigt wird, bedeutet dies, dass die Aufgabe mit der Zeitplanungspriorität "Echtzeit" ausgeführt wird.

NI ist nett Wert der Aufgabe.

NI - Nice Value Der schöne Wert der Aufgabe. Ein negativer Nizza-Wert bedeutet eine höhere Priorität, während ein positiver Nizza-Wert eine niedrigere Priorität bedeutet. Null in diesem Feld bedeutet lediglich, dass die Priorität bei der Bestimmung der Versandfähigkeit einer Aufgabe nicht angepasst wird

Bearbeiten: Wenn ein Programm unter Linux gestartet wird, wird es standardmäßig mit der Priorität '0' gestartet. Sie können die Priorität Ihrer Programme jedoch mit einer der folgenden Methoden ändern.

  1. Mit können Sie ein Programm mit der gewünschten Priorität starten

    nice -n nice_value program_name
    
  2. Sie können die Priorität eines bereits laufenden Prozesses auch mit ändern

    renice -n nice_value -p process_id
    
pl_rock
quelle
1
Wollen Sie damit sagen, dass sie in umgekehrter Richtung fast dasselbe sind (beide stellen die Priorität dar), ABER nicenesskönnen Sie eine negative Priorität vergeben, damit die Aufgabe mit der nicenesshohen Priorität aus dem Weg geht? (dh es ist zu sein niceund andere Zugangsressourcen zu lassen? Oder hat mich das nur verwirrt?
Mark Kirby
1
Ein Beispiel von dem, was ich meine, zwei Aufgaben, beide haben pr20, also gleich, Aufgabe eins hat eine ni0 und Aufgabe zwei hat eine ni20, das würde bedeuten, dass Aufgabe zwei Ressourcen für Aufgabe eins aufgibt, weil es istnicer
Mark Kirby
1
Wie ich weiß, berechnete Priorität als PR = 20 + NI. Also Aufgabe 1 Priorität = 20 + 0. maximaler Wert von nice will +19
pl_rock
3
PR = 20 + NI Maximalwert kann 39 sein. Tatsächlich gibt es im Linux-System 139 Prioritäten, wobei 0 bis 99 Echtzeitpriorität und für Benutzer 100 bis 139 Priorität haben. Der NI-Wert -20 bis +19 entspricht also den Prioritäten 100 bis 139. das kannst du einstellen. Aber der Kernel ist sich nicht sicher, ob Sie den NI-Wert ändern. Dann ändert sich die Priorität. Der NI-Wert ist nur ein Vorschlag an den Kernel. Kernel einige Zeit ignorieren
pl_rock
1
Sind PR und NI also eigentlich gleichwertig, da sie nur einen unterschiedlichen Offset haben? Warum haben wir dann beide Werte? Und Sie können hinzufügen, dass für die Einstellung der Genauigkeit eines Prozesses <0 Root-Rechte erforderlich sind.
Byte Commander
26

Was hat Priorität und warum sollte es mich interessieren?

Wenn es um Prozesse geht, dreht sich alles um die Verwaltung der Prozessorzeit. Der Prozessor oder die CPU ist wie ein Mensch, der mehrere Aufgaben gleichzeitig erledigt. Manchmal können wir genug Platz für mehrere Projekte haben. Manchmal können wir uns immer nur auf eine Sache konzentrieren. In anderen Fällen taucht etwas Wichtiges auf und wir möchten unsere ganze Energie darauf verwenden, dieses Problem zu lösen und gleichzeitig weniger wichtige Aufgaben in den Hintergrund zu rücken.

Unter Linux können wir Richtlinien festlegen, denen die CPU folgen soll, wenn sie alle zu erledigenden Aufgaben betrachtet. Diese Richtlinien werden als Nettigkeit oder guter Wert bezeichnet. Die Linux-Nizza-Skala reicht von -20 bis 19. Je niedriger die Zahl, desto mehr Priorität erhält die Aufgabe. Wenn der Wert für die Genauigkeit eine hohe Zahl wie 19 ist, wird die Task auf die niedrigste Priorität gesetzt und die CPU verarbeitet sie, wann immer sie eine Chance hat. Der Standardwert für nice ist null.

Mit dieser Skala können wir unsere CPU-Ressourcen angemessener zuweisen. Programme mit niedrigerer Priorität, die nicht wichtig sind, können auf einen höheren Nizza-Wert eingestellt werden, während Programme mit hoher Priorität, wie Daemons und Dienste, so eingestellt werden können, dass sie den Fokus der CPU stärker erhalten. Sie können einem bestimmten Benutzer sogar einen niedrigeren Wert für alle seine Prozesse zuweisen, damit Sie dessen Fähigkeit einschränken können, die Kerndienste des Computers zu verlangsamen.

Quelle

Legen Sie die Priorität für neue Prozesse fest nice, z

nice -n 10 firefox

für bestehende Prozesse

renice 10 -p $(pgrep firefox)

Um die Priorität einzustellen, die <0Sie benötigen sudo, zB:

renice -1 -p $(pgrep firefox)
renice: failed to set priority for 2769 (process ID): Permission denied

aber nicht für eine Priorität >=0


Beispiel

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox          19   0

% renice 10 -p 2769     # note, we don't need sudo here
2769 (process ID) old priority 0, new priority 10

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox           9  10

% sudo renice -19 -p 2769                    
 2769 (process ID) old priority 10, new priority -19

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox          38 -19

Anderes Beispiel

Alle laufenden Prozesse für einen bestimmten Benutzer erneut starten

renice 20 -u user_name
AB
quelle
In deinem Beispiel renice 10würde das auch ohne funktionieren sudo, oder? Und könnten Sie bitte ein Beispiel hinzufügen, um alle Prozesse eines bestimmten Benutzers angenehmer zu gestalten? Das wäre eigentlich ziemlich nützlich, wenn jemand anderes gleichzeitig angemeldet ist und einige unnötige, aber ressourcenintensive Prozesse ablaufen (wie ein pausiertes Flash-Spiel in Firefox, machen kleine Brüder solche Dinge ...: - /)
Byte Kommandant
@ByteCommander fertig =)
AB
Wie stelle ich nach einer Weile die alten Werte für die Freundlichkeit dieses Benutzers wieder her? Zurücksetzen auf 0? Dabei wird nicht berücksichtigt, dass einige Prozesse zuvor möglicherweise einen anderen Wert für die Integrität hatten. Gibt es eine einfache Möglichkeit, dies zu tun?
Byte Commander
@ByteCommander Nein, das ist nicht einfach. Entweder Sie verwenden 0oder ... da ist das Problem;)
AB
2
Nach renice -19, das Ergebnis mit psist: PRI: 38, NI: -19aber mit topihm ist , PR:1, NI -19warum das so ist?
Aufwachen
14

Kurze Antwort

PR ist die Prioritätsstufe. Je niedriger die PR, desto höher ist die Priorität des Prozesses.

PR wird wie folgt berechnet:

  • für normale Prozesse: PR = 20 + NI (NI ist nett und reicht von -20 bis 19)
  • für Echtzeitprozesse: PR = - 1 - real_time_priority (real_time_priority reicht von 1 bis 99)

Lange Antwort

Es gibt zwei Arten von Prozessen, die normalen und die Echtzeitprozesse. Für die normalen (und nur für diese) wird nice wie folgt angewendet:

nett

Die "Nizza" -Skala reicht von -20 bis 19, wobei -20 die höchste und 19 die niedrigste Priorität hat. Die Prioritätsstufe wird wie folgt berechnet:

PR = 20 + NI

Wobei NI das nette Level und PR das Prioritätslevel ist. Wie wir sehen können, entspricht die -20 tatsächlich 0, während die 19 39 entspricht.

Standardmäßig ist ein Programm-Nizza-Wert 0, aber der Root-Benutzer kann mit dem folgenden Befehl Programme mit einem bestimmten Nizza-Wert starten:

nice -n <nice_value> ./myProgram 

Echtzeit

Wir könnten noch weiter gehen. Die nette Priorität wird eigentlich für Anwenderprogramme verwendet. Während die UNIX / LINUX-Gesamtpriorität einen Bereich von 140 Werten aufweist, ermöglicht nice value die Zuordnung zum letzten Teil des Bereichs (von 100 bis 139). Diese Gleichung lässt die Werte von 0 bis 99 unerreichbar, was einem negativen PR-Wert (von -100 bis -1) entspricht. Um auf diese Werte zugreifen zu können, sollte der Prozess als "Echtzeit" angegeben werden.

In einer LINUX-Umgebung gibt es 5 Planungsrichtlinien, die mit dem folgenden Befehl angezeigt werden können:

chrt -m 

Welches wird die folgende Liste zeigen:

1. SCHED_OTHER   the standard round-robin time-sharing policy
2. SCHED_BATCH   for "batch" style execution of processes
3. SCHED_IDLE    for running very low priority background jobs.
4. SCHED_FIFO    a first-in, first-out policy
5. SCHED_RR      a round-robin policy

Die Planungsprozesse könnten in zwei Gruppen unterteilt werden, die normalen Planungsrichtlinien (1 bis 3) und die Echtzeitplanungsrichtlinien (4 und 5). Die Echtzeitprozesse haben immer Vorrang vor normalen Prozessen. Ein Echtzeitprozess kann mit dem folgenden Befehl aufgerufen werden (Beispiel: Deklaration einer SCHED_RR-Richtlinie):

chrt --rr <priority between 1-99> ./myProgram

Um den PR-Wert für einen Echtzeitprozess zu erhalten, wird die folgende Gleichung angewendet:

PR = -1 - rt_prior

Wobei rt_prior der Priorität zwischen 1 und 99 entspricht. Aus diesem Grund wird der Prozess mit der Nummer 99 aufgerufen, der die höhere Priorität gegenüber anderen Prozessen hat.

Es ist wichtig zu beachten, dass für Echtzeitprozesse der Wert nice nicht verwendet wird.

Um den aktuellen "Nizza" - und PR-Wert eines Prozesses zu sehen, kann der folgende Befehl ausgeführt werden:

top

Welches zeigt die folgende Ausgabe:

Bildbeschreibung hier eingeben

In der Abbildung werden die PR- und NI-Werte angezeigt. Es ist gut, den Prozess mit dem PR-Wert -51 zu notieren, der einem Echtzeitwert entspricht. Es gibt auch einige Prozesse, deren PR-Wert als "rt" angegeben wird. Dieser Wert entspricht tatsächlich einem PR-Wert von -100.

Agustin Barrachina
quelle