Differenza tra valore gradevole e priorità nell'output superiore


11

top , per impostazione predefinita, elenca entrambe le colonne. Sono curioso di sapere qual è la differenza. Ho controllato le pagine man e non riesco a capirlo:

Priorità:

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

Buon valore:

   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.

Comprendo che il valore di Nice è correlato alla coda dello scheduler della CPU del kernel; allora cosa indica la priorità ? Qualcosa riguardo all'I / O forse?

Risposte:


8

Il buon valore è un meccanismo "globale", mentre la priorità è rilevante per il commutatore di attività in questo momento .


Cosa intendi per commutatore di attività?
Belmin Fernandez,

1
Il selettore di attività (chiamato correttamente "scheduler") è un po 'di codice all'interno del kernel che decide quale attività verrà eseguita successivamente.
Ignacio Vazquez-Abrams,

25

La differenza è che PR è una vera priorità di un processo al momento all'interno del kernel e NI è solo un suggerimento per il kernel quale priorità dovrebbe avere il processo.

Nella maggior parte dei casi il valore PR può essere calcolato con la seguente formula: PR = 20 + NI . Quindi il processo con gentilezza 3 ha la priorità 23 (20 + 3) e il processo con gentilezza -7 ha la priorità 13 (20 - 7). Puoi controllare il primo eseguendo il comando nice -n 3 top. Mostrerà che il processo principale ha NI 3 e PR 23 . Ma per funzionare nice -n -7 topnella maggior parte dei sistemi Linux è necessario disporre dei privilegi di root perché in realtà il valore PR inferiore è la priorità effettiva più elevata. Pertanto, il processo con PR 13 ha una priorità più alta rispetto ai processi con priorità standard PR 20. Ecco perché devi essere root. Ma il valore minimo di gentilezza consentito per il processo non root può essere configurato in /etc/security/limits.conf .

Teoricamente il kernel può cambiare il valore PR (ma non NI ) da solo. Ad esempio, può ridurre la priorità di un processo se consuma troppa CPU oppure può aumentare la priorità di un processo se tale processo non ha avuto la possibilità di essere eseguito a lungo a causa di altri processi con priorità più elevata. In questi casi il valore PR verrà modificato dal kernel e NI rimarrà lo stesso, quindi la formula "PR = 20 + NI" non sarà corretta. Quindi il valore NI può essere interpretato come suggerimento per il kernel quale priorità dovrebbe avere il processo, ma il kernel può scegliere la priorità reale ( valore PR ) da solo a seconda della situazione. Ma di solito la formula"PR = 20 + NI" è corretto.

Le regole esatte su come il kernel cambia priorità non sono chiare. Il manuale di setpriority (la funzione che cambia il valore) dice:

L'effetto della modifica del valore piacevole può variare a seconda dell'algoritmo di pianificazione del processo in vigore.

Il manuale di Pthread dice quanto segue:

La priorità dinamica si basa sul valore gradevole (impostato da nice (2), setpriority (2) o sched_setattr (2)) e aumentato per ogni volta che il thread è pronto per essere eseguito, ma negato di essere eseguito dallo scheduler.

Sembra che il valore PR corrisponda alla priorità dinamica.

L'intervallo del valore NI è -20..19 . Pertanto, il valore PR può avere valori compresi tra 0 (20 - 20) e 39 (20 + 19). Ma è corretto solo per i processi con criteri di pianificazione predefiniti ( SHED_OTHER ). Potrebbero esserci anche processi con le cosiddette politiche di pianificazione "in tempo reale" . Queste norme sono SCHED_RR e SCHED_FIFO . Tali processi hanno un valore PR inferiore a 0. È possibile verificarlo eseguendo il chrt -r 1 topcomando (è necessario essere root). Il processo principale avrà PR -2 . Puoi anche eseguire chrt -r 90 topin questo caso il topil processo avrà PR -91 .

Sembra che per i processi SCHED_RR il valore PR possa essere calcolato con la formula:

PR = - 1 - sched_rr_priority .

Pertanto un processo SCHED_RR ha almeno PR -1, il che significa che qualsiasi processo SCHED_RR ha una priorità più elevata rispetto a qualsiasi SCHED_OTHER . Ciò corrisponde al manuale pthread:

SCHED_FIFO può essere utilizzato solo con priorità statiche superiori a 0, il che significa che quando un thread SCHED_FIFO diventa eseguibile, impedirà immediatamente qualsiasi thread SCHED_OTHER, SCHED_BATCH o SCHED_IDLE attualmente in esecuzione.

SCHED_RR è un semplice miglioramento di SCHED_FIFO. Tutto quanto sopra descritto per SCHED_FIFO si applica anche a SCHED_RR,

La priorità dei processi in tempo reale viene definita priorità statica che non può essere modificata dal kernel. Pertanto, i valori PR positivi possono essere trattati come priorità dinamica per i processi non in tempo reale ( SCHED_OTHER , SCHED_BATCH ) e il valore PR negativo come priorità statica per i processi in tempo reale ( SCHED_RR , SCHED_FIFO ).

Ho anche provato a correre nice -n 10 chrt -r 50 top(e chrt -r 50 nice -n 10 top). Il valore NI era 10, ma il PR era ancora -51 . Quindi sembra che il valore NI non influisca sulla priorità dei processi SCHED_RR . Ciò corrisponde al manuale di setpriority :

Qualsiasi processo o thread che utilizza SCHED_FIFO o SCHED_RR non deve essere influenzato da una chiamata a setpriority (). Questo non è considerato un errore. Un processo che successivamente ritorna a SCHED_OTHER non deve avere la sua priorità influenzata da tale chiamata setpriority ().

Una nota divertente. Se esegui chrt -r 99 top, vedrai il valore RT anziché un numero nella colonna PR .

  PID UTENTE PR NI VIRT RES SHR S% CPU% MEM TIME + COMANDO
28489 radice RT 0 2852 1200 896 R 0 0,1 0: 00,01 superiore

Non penso che questo significhi che il processo è ora speciale. Penso che questo significhi che la parte superiore non stampa -100 perché la stampa richiederebbe 4 caratteri.

Puoi anche usare htop invece di top in tutti gli esempi che possono essere più convenienti. ps -lpuò essere utilizzato anche, ma il punto base che separa le priorità in tempo reale e non in tempo reale non è 0, ma 60, quindi nice -n -20 ps -lverrà stampato

FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 R 0 28983 28804 0 60-20-1176 - punti / 6 00:00:00 ps

Stranamente, se eseguo 5 loop infiniti (int main {while (1);}) su un i3 hyperthreaded a 2 core, le loro priorità rimangono costanti. Questo nei test di debian sid.
Vorac,

1
@BelminFernandez Penso che sarà giusto rendere questa risposta "accettata".
z0lupka,

1

Risposta breve

PR è il livello di priorità. Più basso è il PR, maggiore sarà la priorità del processo.

Il PR viene calcolato come segue:

  • per processi normali: PR = 20 - NI (NI è gradevole e varia da -20 a 19)
  • per processi in tempo reale: PR = - 1 - real_time_priority (real_time_priority varia da 1 a 99)

Risposta lunga

Esistono 2 tipi di processi, quelli normali e il tempo reale. Per quelli normali (e solo per quelli), si applica nice come segue:

Bello

La scala della "gentilezza" va da -20 a 19, mentre -20 è la priorità più alta e 19 la priorità più bassa. Il livello di priorità viene calcolato come segue:

PR = 20 + NI

Dove NI è il livello piacevole e PR è il livello di priorità. Come possiamo vedere, il -20 in realtà è mappato su 0, mentre il 19 è mappato su 39.

Per impostazione predefinita, un valore piacevole del programma è 0 bit, per un utente root è possibile pranzare programmi con un valore piacevole specificato utilizzando il comando seguente:

nice -n <nice_value> ./myProgram 

Tempo reale

Potremmo andare ancora oltre. La bella priorità viene effettivamente utilizzata per i programmi utente. Mentre la priorità generale di UNIX / LINUX ha un intervallo di 140 valori, il valore piacevole consente al processo di mappare all'ultima parte dell'intervallo (da 100 a 139). Questa equazione lascia i valori da 0 a 99 irraggiungibili che corrisponderanno a un livello PR negativo (da -100 a -1). Per poter accedere a questi valori, il processo dovrebbe essere dichiarato "in tempo reale".

Esistono 5 criteri di pianificazione in un ambiente LINUX che possono essere visualizzati con il comando seguente:

chrt -m 

Che mostrerà il seguente elenco:

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

I processi di pianificazione potrebbero essere divisi in 2 gruppi, le normali politiche di pianificazione (da 1 a 3) e le politiche di pianificazione in tempo reale (4 e 5). I processi in tempo reale avranno sempre la priorità sui processi normali. Un processo in tempo reale può essere chiamato utilizzando il seguente comando (L'esempio è come dichiarare una politica SCHED_RR):

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

Per ottenere il valore PR per un processo in tempo reale viene applicata la seguente equazione:

PR = -1 - rt_prior

Dove rt_prior corrisponde alla priorità tra 1 e 99. Per tale motivo, il processo che avrà la priorità più alta rispetto ad altri processi sarà quello chiamato con il numero 99.

È importante notare che per i processi in tempo reale non viene utilizzato il valore piacevole.

Per vedere l'attuale "gentilezza" e il valore PR di un processo è possibile eseguire il comando seguente:

top

È bene notare che i processi con valore PR -51, ad esempio, corrispondono a un valore in tempo reale. Ci sono anche alcuni processi il cui valore PR è indicato come "rt". Questo valore corrisponde effettivamente a un valore PR di -100.

(PS: avrei pubblicato una foto che mostra il miglior risultato ma non ho la reputazione per farlo)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.