Unterschied zwischen schönem Wert und Priorität in der Top-Ausgabe

11

top listet standardmäßig beide Spalten auf. Ich bin gespannt, was der Unterschied ist. Ich habe die Manpages ausgecheckt und kann es nicht herausfinden:

Priorität:

   h: PR  --  Priority
      The priority of the task.

Schöner Wert:

   i: NI  --  Nice value
      The nice value of the task.  A negative nice value means higher  priority,
      whereas  a  positive  nice value means lower priority.  Zero in this field
      simply means priority will not be adjusted in determining  a  task’s  dis-
      patchability.

Ich verstehe, dass der nette Wert mit der CPU-Scheduler-Warteschlange des Kernels zusammenhängt. Was zeigt dann die Priorität an? Etwas in Bezug auf I / O vielleicht?

Belmin Fernandez
quelle

Antworten:

8

Der nette Wert ist ein „global“ Mechanismus, während Priorität für den Task Switcher relevant ist gerade jetzt .

Ignacio Vazquez-Abrams
quelle
Was meinst du mit Task Switcher?
Belmin Fernandez
1
Der Task-Switcher (eigentlich "Scheduler" genannt) ist ein kleines Stück Code im Kernel, das entscheidet, welche Task als nächstes ausgeführt wird.
Ignacio Vazquez-Abrams
25

Der Unterschied besteht darin, dass PR im Moment innerhalb des Kernels eine echte Priorität eines Prozesses ist und NI nur ein Hinweis für den Kernel ist, welche Priorität der Prozess haben sollte.

In den meisten Fällen kann der PR- Wert nach folgender Formel berechnet werden: PR = 20 + NI . Somit hat der Prozess mit der Schönheit 3 ​​die Priorität 23 (20 + 3) und der Prozess mit der Schönheit -7 hat die Priorität 13 (20 - 7). Sie können die erste überprüfen, indem Sie den Befehl ausführen nice -n 3 top. Es wird gezeigt, dass der Top- Prozess NI 3 und PR 23 hat . Für die Ausführung nice -n -7 topauf den meisten Linux-Systemen benötigen Sie jedoch Root-Rechte, da der niedrigere PR- Wert die höhere tatsächliche Priorität ist. Somit hat der Prozess mit PR 13 eine höhere Priorität als Prozesse mit Standardpriorität PR 20. Deshalb musst du root sein. Der für Nicht-Root-Prozesse zulässige Mindestwert für die Freundlichkeit kann jedoch in /etc/security/limits.conf konfiguriert werden .

Theoretisch kann der Kernel den PR- Wert (aber nicht NI ) selbst ändern . Beispielsweise kann es die Priorität eines Prozesses verringern, wenn es zu viel CPU verbraucht, oder es kann die Priorität eines Prozesses erhöhen, wenn dieser Prozess aufgrund anderer Prozesse mit höherer Priorität längere Zeit keine Chance hatte, ausgeführt zu werden. In diesen Fällen wird der PR- Wert vom Kernel geändert und NI bleibt gleich, daher ist die Formel "PR = 20 + NI" nicht korrekt. Der NI- Wert kann also als Hinweis für den Kernel interpretiert werden, welche Priorität der Prozess haben sollte, aber der Kernel kann je nach Situation selbst die tatsächliche Priorität ( PR- Wert) auswählen . Aber normalerweise die Formel"PR = 20 + NI" ist korrekt.

Genaue Regeln, wie der Kernel die Priorität ändert, sind nicht klar. Das Handbuch setpriority (die Funktion, die den netten Wert ändert) sagt:

Der Effekt der Änderung des Nice-Werts kann je nach dem gültigen Prozessplanungsalgorithmus variieren.

Das Pthread-Handbuch sagt Folgendes aus:

Die dynamische Priorität basiert auf dem Nice-Wert (festgelegt durch nice (2), setpriority (2) oder sched_setattr (2)) und wird für jedes Mal erhöht, wenn der Thread zur Ausführung bereit ist, aber vom Scheduler nicht ausgeführt werden kann.

Es scheint, dass der PR- Wert der dynamischen Priorität entspricht.

Der Bereich des NI- Werts liegt bei -20..19 . Somit kann der PR- Wert die Werte von 0 (20 - 20) bis 39 (20 + 19) haben. Dies gilt jedoch nur für Prozesse mit Standardplanungsrichtlinie ( SHED_OTHER ). Es kann auch Prozesse mit sogenannten "Echtzeit" -Planungsrichtlinien geben. Diese Richtlinien sind SCHED_RR und SCHED_FIFO . Solche Prozesse haben einen PR- Wert von weniger als 0. Sie können dies überprüfen, indem Sie den chrt -r 1 topBefehl ausführen (muss root sein). Der oberste Prozess wird PR -2 haben . Sie können sogar chrt -r 90 topdie Spitze laufen lassenProzess wird PR-91 haben .

Es scheint, dass für SCHED_RR- Prozesse der PR- Wert nach folgender Formel berechnet werden kann:

PR = - 1 - sched_rr_priority .

Somit hat ein SCHED_RR- Prozess mindestens PR -1, was bedeutet, dass jeder SCHED_RR- Prozess eine höhere Priorität hat als jeder SCHED_OTHER . Dies entspricht dem pthread-Handbuch:

SCHED_FIFO kann nur mit statischen Prioritäten verwendet werden, die höher als 0 sind. Wenn also ein SCHED_FIFO-Thread ausgeführt werden kann, werden aktuell ausgeführte SCHED_OTHER-, SCHED_BATCH- oder SCHED_IDLE-Threads immer sofort ausgeschlossen.

SCHED_RR ist eine einfache Erweiterung von SCHED_FIFO. Alles, was oben für SCHED_FIFO beschrieben wurde, gilt auch für SCHED_RR,

Die Priorität von Echtzeitprozessen wird als statische Priorität bezeichnet, die vom Kernel nicht geändert werden kann. So können positive PR- Werte als dynamische Priorität für Nicht-Echtzeit- Prozesse ( SCHED_OTHER , SCHED_BATCH ) und negative PR- Werte als statische Priorität für Echtzeit-Prozesse ( SCHED_RR , SCHED_FIFO ) behandelt werden.

Ich habe auch versucht zu rennen nice -n 10 chrt -r 50 top(und chrt -r 50 nice -n 10 top). Der NI- Wert betrug 10, aber der PR betrug immer noch -51 . Es scheint also, dass der NI- Wert die Priorität von SCHED_RR- Prozessen nicht beeinflusst . Dies entspricht dem Setpriority- Handbuch:

Alle Prozesse oder Threads, die SCHED_FIFO oder SCHED_RR verwenden, bleiben von einem Aufruf von setpriority () unberührt. Dies wird nicht als Fehler angesehen. Ein Prozess, der anschließend auf SCHED_OTHER zurückgesetzt wird, muss seine Priorität nicht durch einen solchen Aufruf von setpriority () beeinflussen.

Eine lustige Notiz. Wenn Sie ausführen chrt -r 99 top, wird der RT- Wert anstelle einer Zahl in der PR- Spalte angezeigt .

  PID BENUTZER PR NI VIRT RES SHR S% CPU% MEM ZEIT + BEFEHL
28489 root RT 0 2852 1200 896 R 0 0.1 0: 00.01 oben

Ich denke nicht, dass dies bedeutet, dass der Prozess jetzt etwas Besonderes ist. Ich denke, dass dies bedeutet, dass oben einfach nicht -100 druckt, da zum Drucken 4 Zeichen erforderlich sind .

Sie können in allen Beispielen auch htop anstelle von top verwenden, was bequemer sein kann. ps -lkann auch verwendet werden, aber der Basispunkt, der Echtzeit- und Nicht-Echtzeit-Prioritäten trennt, ist nicht 0, sondern 60, nice -n -20 ps -lwird also gedruckt

FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 R 0 28983 28804 0 60 -20 - 1176 - pts / 6 00:00:00 ps
Anton
quelle
Seltsamerweise bleiben ihre Prioritäten konstant, wenn ich 5 Endlosschleifen (int main {while (1);}) auf einem 2-Kern-Hyperthread-i3 ausführe. Dies in Debian Sid-Tests.
Voráč
1
@BelminFernandez Ich denke, es wird fair sein, diese Antwort "akzeptiert" zu machen.
z0lupka
1

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, während -20 die höchste Priorität und 19 die niedrigste Priorität ist. Die Prioritätsstufe wird wie folgt berechnet:

PR = 20 + NI

Wobei NI das nette Niveau und PR das Prioritätsniveau ist. Wie wir sehen können, ist die -20 tatsächlich auf 0 abgebildet, während die 19 auf 39 abgebildet ist.

Standardmäßig ist ein Programm-Nizza-Wert 0 Bit. Ein Root-Benutzer kann Programme mit einem bestimmten Nizza-Wert mithilfe des folgenden Befehls zu Mittag essen:

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 hat, ermöglicht der schöne Wert dem Prozess, den letzten Teil des Bereichs (von 100 bis 139) abzubilden. Diese Gleichung lässt die Werte von 0 bis 99 nicht erreichbar, 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önnen in zwei Gruppen unterteilt werden, die normalen Planungsrichtlinien (1 bis 3) und die Echtzeit-Planungsrichtlinien (4 und 5). Die Echtzeitprozesse haben immer Vorrang vor normalen Prozessen. Ein Echtzeitprozess kann mit dem folgenden Befehl aufgerufen werden (Beispiel: Deklarieren 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, der gegenüber anderen Prozessen die höhere Priorität hat, mit der Nummer 99 aufgerufen.

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

Um die aktuelle "Schönheit" und den PR-Wert eines Prozesses anzuzeigen, kann der folgende Befehl ausgeführt werden:

top

Es ist gut zu beachten, dass Prozesse mit dem PR-Wert -51 beispielsweise einem Echtzeitwert entsprechen. Es gibt auch einige Prozesse, deren PR-Wert als "rt" angegeben wird. Dieser Wert entspricht tatsächlich einem PR-Wert von -100.

(PS: Ich hätte ein Bild gepostet, das das beste Ergebnis zeigt, aber ich habe nicht den Ruf, das zu tun.)

Agustin Barrachina
quelle