Elaborare "gentilezza" vs. "priorità"


105

Durante l'esecuzione top, posso vedere questo esempio di output (abbreviato):

  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

Ci sono due valori che mi interessano: PR(priorità) e NI(gentilezza).

Se ho capito cosa ho già scoperto correttamente, entrambi determinano quanto tempo della CPU un processo otterrà in contrasto con altri processi. Ma allora qual è la differenza tra questi valori?

Potresti anche descrivere come manipolare quei valori di un processo e in quali circostanze potrebbe essere utile?

Risposte:


103

Un buon valore è uno spazio utente e la priorità PR è la priorità effettiva del processo che utilizza il kernel Linux. Nel sistema linux le priorità sono da 0 a 139 in cui da 0 a 99 per il tempo reale e da 100 a 139 per gli utenti. l'intervallo di valori è compreso tra -20 e +19, dove -20 è il più alto, 0 predefinito e +19 è il più basso. la relazione tra valore piacevole e priorità è:

PR = 20 + NI

quindi, il valore di PR = 20 + (-20 to +19)è compreso tra 0 e 39 che mappa tra 100 e 139.

Secondo il manuale principale:

PR - Priorità La priorità di pianificazione dell'attività. Se vedi 'rt' in questo campo, significa che l'attività è in esecuzione con priorità di pianificazione 'in tempo reale'.

NI è un buon valore dell'attività.

NI - Nice Value Il simpatico valore dell'attività. Un valore positivo negativo indica una priorità più elevata, mentre un valore positivo positivo indica una priorità inferiore. Lo zero in questo campo significa semplicemente che la priorità non verrà regolata nel determinare l'abilità di invio di un'attività

Modifica: per impostazione predefinita quando un programma viene avviato in Linux, viene avviato con la priorità di '0'. Tuttavia, è possibile modificare la priorità dei programmi con uno dei seguenti metodi.

  1. È possibile avviare un programma con la priorità richiesta utilizzando

    nice -n nice_value program_name
    
  2. puoi anche cambiare la priorità di un processo già in esecuzione usando

    renice -n nice_value -p process_id
    

1
Stai dicendo che sono quasi la stessa cosa al contrario (entrambi rappresentano la priorità) MA nicenesspossono essere usati per dare una priorità negativa in modo che l'attività con nicenesssi allontani dalle attività ad alta priorità? (vale a dire essere nicee consentire ad altre risorse di accesso? O questo mi ha solo confuso?
Mark Kirby,

1
Un esempio di ciò che intendo, due compiti, entrambi hanno pr20, quindi uguale, l'attività uno ha uno nidi 0 e l'attività due ha un ni20, quindi, ciò significherebbe che l'attività due rinuncerebbe alle risorse per l'attività uno perché ènicer
Mark Kirby,

1
Come so, la priorità è calcolata come PR = 20 + NI. quindi compito una priorità = 20 +0. valore massimo della volontà piacevole +19
pl_rock

3
PR = 20 + NI il valore massimo può essere 39. in realtà nel sistema Linux c'è 139 priorità in cui 0 a 99 è la priorità in tempo reale e per l'utente ci sono da 100 a 139. quindi, il valore NI da -20 a +19 è mappato alla priorità da 100 a 139. che puoi regolare. ma il kernel non è sicuro se si modifica il valore NI, quindi cambierà priorità, il valore NI è un suggerimento giusto per il kernel. il kernel qualche volta lo ignora
pl_rock

1
Quindi PR e NI sono effettivamente equivalenti, in quanto hanno solo un offset diverso? Perché allora abbiamo entrambi i valori? E potresti aggiungere che l'impostazione della precisione di un processo <0 richiede i diritti di root.
Byte Commander

27

Qual è la priorità e perché dovrei preoccuparmi?

Quando si parla di processi, la priorità è tutta la gestione del tempo del processore. Il processore o la CPU è come un essere umano che manipola più attività contemporaneamente. A volte possiamo avere abbastanza spazio per affrontare più progetti. A volte possiamo concentrarci solo su una cosa alla volta. Altre volte viene fuori qualcosa di importante e vogliamo dedicare tutta la nostra energia alla risoluzione di questo problema, mettendo al contempo compiti meno importanti sul back burner.

In Linux possiamo impostare le linee guida che la CPU deve seguire quando guarda a tutti i compiti che deve svolgere. Queste linee guida sono chiamate gentilezza o buon valore. La scala della gentilezza di Linux va da -20 a 19. Più basso è il numero, maggiore sarà la priorità dell'attività. Se il valore di gentilezza è un numero elevato come 19, l'attività verrà impostata sulla priorità più bassa e la CPU lo elaborerà ogni volta che ne avrà la possibilità. Il valore predefinito di default è zero.

Utilizzando questa scala possiamo allocare le risorse della nostra CPU in modo più appropriato. I programmi a bassa priorità che non sono importanti possono essere impostati su un valore più alto, mentre i programmi ad alta priorità come demoni e servizi possono essere impostati per ricevere più attenzione della CPU. Puoi persino assegnare a un utente specifico un valore inferiore per tutti i suoi processi in modo da limitare la sua capacità di rallentare i servizi principali del computer.

fonte

Impostare la priorità per i nuovi processi con nice, ad es

nice -n 10 firefox

per processi esistenti

renice 10 -p $(pgrep firefox)

Per impostare la priorità di cui <0hai bisogno sudo, ad esempio:

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

ma non per una priorità >=0


Esempio

% 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

Altro esempio

Rinominare tutti i processi in esecuzione per un utente specifico

renice 20 -u user_name

Nel tuo esempio, renice 10funzionerebbe anche senza sudo, giusto? E potresti aggiungere un esempio per rendere più piacevoli tutti i processi di un utente specifico? Sarebbe davvero utile se qualcun altro è connesso contemporaneamente e ha alcuni processi non necessari ma che consumano risorse (come un gioco flash in pausa in Firefox, i fratellini fanno queste cose ...: - /)
Byte Comandante

@ByteCommander done =)
AB

Come posso ripristinare i vecchi valori di gentilezza di quell'utente dopo un po '? Riportandolo a 0? Ciò non terrà conto del fatto che alcuni processi potrebbero aver avuto un diverso valore di gentilezza in precedenza. C'è qualche semplice possibilità per farlo?
Byte Commander

@ByteCommander No, non è semplice. O usi 0o ... c'è il problema;)
AB

2
Dopo renice -19, il risultato con psè: PRI: 38, NI: -19però, con topesso è PR:1, NI -19il motivo per cui è così?
sveglia

14

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, ma è possibile per l'utente root avviare 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 suddivisi 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

Che mostra il seguente output:

inserisci qui la descrizione dell'immagine

Nella figura sono visualizzati i valori PR e NI. È bene notare il processo con valore PR -51 che corrisponde 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.

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.