2012-04-26 15 views
5

Ho scritto un programma di prova che consiste in un solo ciclo infinito con alcuni calcoli interni e non esegue operazioni di I/O . Ho provato iniziando due istanze del programma, una con un alto valore gentilezza, e l'altra con un valore basso ripitturati:L'impostazione Cortesia processo (priorità) non ha alcun effetto su Linux

sudo nice -n 19 taskset 1 ./test 
sudo nice -n -20 taskset 1 ./test 

Il comando taskset assicura che entrambi i programmi eseguiti sullo stesso nucleo. Contrariamente alle mie aspettative, i primi rapporti indicano che entrambi i programmi ottengono circa il 50% del tempo di calcolo dello . Perché? Il bel comando ha anche un effetto?

+0

quali sono stati i calcoli? Forse non c'è abbastanza conflitto sul processore per fare la differenza – laher

+0

I calcoli all'interno del ciclo sono abbastanza lunghi. Ho anche controllato l'output assembler generato e nulla è stato ottimizzato (compilato con le impostazioni di ottimizzazione più basse su gcc). –

+0

possibile duplicato di [Understanding renice] (http://stackoverflow.com/questions/22090126/understanding-renice) – ninjalj

risposta

1

Suppongo che ci sia un & mancante alla fine della riga di comando. In caso contrario, la seconda riga non verrà eseguita fino al primo completamento.

Mentre entrambi i processi sono in esecuzione, utilizzare qualcosa come top e assicurarsi che ognuno di essi abbia il valore corretto assegnato.

Cosa succede se si avvia i processi utilizzando solo taskset e quindi si modifica la priorità con renice dopo l'esecuzione?

+1

Il problema era che stavo eseguendo le istanze in due finestre della console in primo piano. Quando li eseguo in background (usando &) funziona. Sembra che Linux privilegi i processi in esecuzione in primo piano in una console e in gran parte (completamente?) Ignora i loro valori di cortesia. Questo ha senso in quanto un utente probabilmente vuole interagire con il programma che ha iniziato in una finestra della console. –

+0

Qualsiasi chiarimento su come funziona esattamente sarebbe molto apprezzato. –

+0

L'esecuzione di un programma in primo piano lo esegue come un processo figlio della console che lo ha generato e i processi figlio in genere ereditano la priorità del genitore. L'aggiunta di '&' esegue il programma come un processo completamente separato, permettendoti di controllarne la priorità individualmente. – bta

2

Ho messo insieme un test.c che fa proprio:

for(;;) 
    { 
    } 

e corse con il vostro bello di. Non ho eseguito un sudo diverso per ognuno, ma piuttosto ho creato una shell interattiva e li ho eseguiti entrambi da lì. Ho usato due &.

Ne ho ricevuto uno ./test che colpiva la mia CPU con difficoltà e una a malapena a toccarlo.

Naturalmente, il sistema si sentiva ancora abbastanza reattivo; ci vuole un sacco di processi di CPU-hogging sui processori moderni per ottenere così tanto carico che puoi "sentirlo".

Che contrasta con i processi di I/O-Hogging e con i processi di memoria-hogging; in questi casi un singolo processo goloso può rendere doloroso l'utilizzo di un sistema.

Immagino che il tuo sistema abbia un bug (o sottigliezza) relativo alla priorità relativamente unico, o che ci sia qualcosa in comune con la tua metodologia.

Ho eseguito il test su un sistema Ubuntu 11.04.

+0

Quando ho eseguito entrambi i processi in background, ha funzionato anche. Suppongo che i processi di privilegi di Linux con i quali l'utente possa voler interagire (ad es. I programmi avviati da bash e in esecuzione in foreground), ignorino in gran parte i loro valori di cortesia. –

1

L'impostazione di precisione del processo (priorità) HA un effetto su Linux!(in pratica, ma solo se si dà abbastanza lavoro da fare!)

Sul mio sistema, a patto che tutti i core sono a pieno carico, quindi bel fa avere un impatto. Su ubuntu 14.04, i processi vengono eseguiti con nice -N attraversa 0.807 ** N operazioni rispetto ai processi eseguiti senza alterare il valore piacevole (dato che si sta eseguendo un'istanza per core per ogni livello piacevole).

Nel mio caso ho il quad core i7 con hyper hypering disattivato, quindi se eseguo quattro o meno processi, allora non importa quali siano i loro valori positivi - ognuno di essi ottiene un nucleo completo. Se eseguo quattro processi a livello di bel livello 0 e 4 a livello di livello 12, quelli a livello 12 superano 0,807^12, ovvero circa il 7% del lavoro di quelli a livello zero.Il rapporto sembra essere un ragionevole predittore dai buoni livelli da 0 a 14, dopo di che oscilla (alcune esecuzioni hanno avuto un buon livello 18 che elabora più di 16 piacevoli, ad esempio) - Eseguendo il test più a lungo si possono appianare i risultati.

(ruby 2.1.2 utilizzato)

, file di cl:

uptime 
nices='-0 -6 -12 -18' 
nices='-0 -18' 
nices='-0 -2 -4 -6 -8 -10 -12 -14 -16 -18' 
rm -f ,n-* 
for i in 1 2 3 4 
do 
    for n in $nices 
    do 
    nice $n ruby ,count_loops.rb > ,n${n}-$i & 
    done 
done 
ps -l 
uptime 
wait 
uptime 
ps -l 
c=`cat ,n-0-[1234] | total` 
last=$c 
for n in $nices 
do 
    echo 
    c2=`cat ,n${n}-[1234] | total` 
    echo total of `cat ,n${n}-[1234]` is $c2 
    echo -n "nice $n count $2, percentage: " 
    echo "3 k $c2 100 * $c/p" | dc 
    echo -n "     percent of last: " 
    echo "3 k $c2 100 * $last/p" | dc 
    last=$c2 
done 
uptime 
echo total count: `cat ,n-*-[1234] | total` 

, file di count_loops.rb

#!/usr/bin/env ruby 
limit = Time.new + 70 
i=0 
while Time.new < limit 
i += 1 
j = 0 
while (j += 1) < 10000 
    t = j 
end 
end 
puts i 

risultati di sh ,cl - uscita di diagnosi iniziale:

19:16:25 up 20:55, 2 users, load average: 3.58, 3.59, 2.88 
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY   TIME CMD 
0 S 1000 4987 4977 0 80 0 - 7297 wait pts/3 00:00:00 bash 
0 S 1000 11743 2936 0 80 0 - 2515 wait pts/3 00:00:00 rubymine.sh 
0 S 1000 11808 11743 6 80 0 - 834604 futex_ pts/3 00:18:10 java 
0 S 1000 11846 11808 0 80 0 - 4061 poll_s pts/3 00:00:02 fsnotifier64 
0 S 1000 19613 4987 0 80 0 - 2515 wait pts/3 00:00:00 sh 
0 R 1000 19616 19613 0 80 0 - 7582 -  pts/3 00:00:00 ruby 
0 R 1000 19617 19613 0 82 2 - 7582 -  pts/3 00:00:00 ruby 
0 R 1000 19618 19613 0 84 4 - 7582 -  pts/3 00:00:00 ruby 
0 R 1000 19619 19613 0 86 6 - 7416 -  pts/3 00:00:00 ruby 
0 R 1000 19620 19613 0 88 8 - 6795 -  pts/3 00:00:00 ruby 
0 R 1000 19621 19613 0 90 10 - 6247 -  pts/3 00:00:00 ruby 
0 R 1000 19622 19613 0 92 12 - 6247 -  pts/3 00:00:00 ruby 
0 R 1000 19623 19613 0 94 14 - 6247 -  pts/3 00:00:00 ruby 
0 R 1000 19624 19613 0 96 16 - 6078 -  pts/3 00:00:00 ruby 
0 R 1000 19625 19613 0 98 18 - 6012 -  pts/3 00:00:00 ruby 
0 R 1000 19626 19613 0 80 0 - 7582 -  pts/3 00:00:00 ruby 
0 R 1000 19627 19613 0 82 2 - 7582 -  pts/3 00:00:00 ruby 
0 R 1000 19628 19613 0 84 4 - 7582 -  pts/3 00:00:00 ruby 
0 R 1000 19629 19613 0 86 6 - 7582 -  pts/3 00:00:00 ruby 
0 R 1000 19630 19613 0 88 8 - 6247 -  pts/3 00:00:00 ruby 
0 R 1000 19631 19613 0 90 10 - 6247 -  pts/3 00:00:00 ruby 
0 R 1000 19632 19613 0 92 12 - 6247 -  pts/3 00:00:00 ruby 
0 R 1000 19633 19613 0 94 14 - 6144 -  pts/3 00:00:00 ruby 
0 R 1000 19634 19613 0 96 16 - 4971 -  pts/3 00:00:00 ruby 
0 R 1000 19635 19613 0 98 18 - 4971 -  pts/3 00:00:00 ruby 
0 R 1000 19636 19613 0 80 0 - 7582 -  pts/3 00:00:00 ruby 
0 R 1000 19637 19613 0 82 2 - 7449 -  pts/3 00:00:00 ruby 
0 R 1000 19638 19613 0 84 4 - 7344 -  pts/3 00:00:00 ruby 
0 R 1000 19639 19613 0 86 6 - 7582 -  pts/3 00:00:00 ruby 
0 R 1000 19640 19613 0 88 8 - 7416 -  pts/3 00:00:00 ruby 
0 R 1000 19641 19613 0 90 10 - 6210 -  pts/3 00:00:00 ruby 
0 R 1000 19642 19613 0 92 12 - 6247 -  pts/3 00:00:00 ruby 
0 R 1000 19643 19613 0 94 14 - 5976 -  pts/3 00:00:00 ruby 
0 R 1000 19644 19613 0 96 16 - 6111 -  pts/3 00:00:00 ruby 
0 R 1000 19645 19613 0 98 18 - 4971 -  pts/3 00:00:00 ruby 
0 R 1000 19646 19613 0 80 0 - 7582 -  pts/3 00:00:00 ruby 
0 R 1000 19647 19613 0 82 2 - 7516 -  pts/3 00:00:00 ruby 
0 R 1000 19648 19613 0 84 4 - 7416 -  pts/3 00:00:00 ruby 
0 R 1000 19649 19613 0 86 6 - 6247 -  pts/3 00:00:00 ruby 
0 R 1000 19650 19613 0 88 8 - 6177 -  pts/3 00:00:00 ruby 
0 R 1000 19651 19613 0 90 10 - 6247 -  pts/3 00:00:00 ruby 
0 R 1000 19652 19613 0 92 12 - 6078 -  pts/3 00:00:00 ruby 
0 R 1000 19653 19613 0 94 14 - 6247 -  pts/3 00:00:00 ruby 
0 R 1000 19654 19613 0 96 16 - 4971 -  pts/3 00:00:00 ruby 
0 R 1000 19655 19613 0 98 18 - 4971 -  pts/3 00:00:00 ruby 
0 R 1000 19656 19613 0 80 0 - 3908 -  pts/3 00:00:00 ps 
19:16:26 up 20:55, 2 users, load average: 3.58, 3.59, 2.88 
19:17:37 up 20:56, 3 users, load average: 28.92, 11.25, 5.59 
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY   TIME CMD 
0 S 1000 4987 4977 0 80 0 - 7297 wait pts/3 00:00:00 bash 
0 S 1000 11743 2936 0 80 0 - 2515 wait pts/3 00:00:00 rubymine.sh 
0 S 1000 11808 11743 6 80 0 - 834604 futex_ pts/3 00:18:10 java 
0 S 1000 11846 11808 0 80 0 - 4061 poll_s pts/3 00:00:02 fsnotifier64 
0 S 1000 19613 4987 0 80 0 - 2515 wait pts/3 00:00:00 sh 
0 R 1000 19794 19613 0 80 0 - 3908 -  pts/3 00:00:00 ps 

risultati di sh ,cl - statistiche: (percentuale di ultima è la percentuale di questo totale confronta con il conteggio per l'ultimo gruppo di processi)

total of 99951 101725 100681 104046 is 406403 
nice -0 count , percentage: 100.000 
        percent of last: 100.000 

total of 64554 62971 64006 63462 is 254993 
nice -2 count , percentage: 62.743 
        percent of last: 62.743 

total of 42997 43041 43197 42717 is 171952 
nice -4 count , percentage: 42.310 
        percent of last: 67.434 

total of 26882 28250 27151 27244 is 109527 
nice -6 count , percentage: 26.950 
        percent of last: 63.696 

total of 17228 17189 17427 17769 is 69613 
nice -8 count , percentage: 17.129 
        percent of last: 63.557 

total of 10815 10792 11021 11307 is 43935 
nice -10 count , percentage: 10.810 
        percent of last: 63.113 

total of 7023 6923 7885 7323 is 29154 
nice -12 count , percentage: 7.173 
        percent of last: 66.357 

total of 5005 4881 4938 5159 is 19983 
nice -14 count , percentage: 4.917 
        percent of last: 68.542 

total of 3517 5537 3555 4092 is 16701 
nice -16 count , percentage: 4.109 
        percent of last: 83.576 

total of 4372 4307 5552 4527 is 18758 
nice -18 count , percentage: 4.615 
        percent of last: 112.316 
19:17:37 up 20:56, 3 users, load average: 28.92, 11.25, 5.59 
total count: 1141019 

(I puristi noteranno sto mescolando rubino, conchiglia e dc - lo faranno devo perdonarmi per le vecchie abitudini del secolo scorso che mostrano attraverso;))

3

Il comportamento che si sta vedendo è quasi certamente a causa della funzione di autogroup che è stata aggiunta in Linux 2.6.38 (nel 2010). Presumibilmente quando hai descritto di eseguire i due comandi, sono stati eseguiti in diverse finestre di terminale. Se li avessi eseguiti nella finestra del terminale stessa, avresti dovuto vedere che il bel valore ha un effetto. Il resto di questa risposta elabora la storia.

Il kernel fornisce una funzionalità nota come Autogrouping per migliorare le prestazioni desktop interattivo di fronte multiprocesso, carichi di lavoro intensivo della CPU come la costruzione del kernel Linux con un gran numero di processi di compilazione parallele (cioè la bandiera make(1) -j).

Un nuovo gruppo automatico viene creato quando viene creata una nuova sessione tramite setsid(2); questo accade, ad esempio, quando viene avviata una nuova finestra di terminale. Un nuovo processo creato da fork(2) eredita l'appartenenza al gruppo di auto del genitore genitore. Pertanto, tutti i processi in una sessione sono membri dello stesso gruppo automatico.

Quando il raggruppamento automatico è abilitato, tutti i membri di un gruppo automatico vengono inseriti nello stesso "gruppo di attività" del programma di pianificazione del kernel. Lo scheduler del kernel Linux utilizza un algoritmo che equalizza la distribuzione dei cicli di CPU tra i gruppi di attività. I vantaggi di questo per le prestazioni del desktop interattivo possono essere descritti mediante l'esempio seguente.

Supponiamo che ci sono due autogroups competono per lo stesso CPU (cioè, presume sia un sistema a singola CPU o l'uso di taskset(1) confinare tutti i processi per la stessa CPU su un sistema SMP). Il primo gruppo contiene dieci processi associati alla CPU da un kernel build avviato con make -j10. L'altro contiene un singolo processo basato su CPU : un lettore video. L'effetto del raggruppamento automatico è che a i due gruppi riceveranno ciascuno metà dei cicli della CPU. Cioè, il video player riceverà il 50% dei cicli della CPU, piuttosto che il solo il 9% dei cicli, il che probabilmente porterebbe alla riproduzione video degradata .La situazione su un sistema SMP è più complessa, ma l'effetto generale è lo stesso: lo scheduler distribuisce i cicli di CPU in gruppi di attività in modo che un gruppo di automazioni contenente un numero di grande numero di processi associati alla CPU non finisca per eseguire il ciclo della CPU a scapito degli altri lavori sul sistema.

Il valore bello e la pianificazione di gruppo

Quando si pianifica processi non in tempo reale (ad esempio, quelli previsti nell'ambito della politica di default SCHED_OTHER), lo scheduler impiega una tecnica nota come "la pianificazione di gruppo", sotto quali thread sono programmati in "gruppi di attività". I gruppi di attività sono formati nelle varie circostanze, con il caso pertinente in questo caso di raggruppamento automatico.

Se Autogrouping è abilitata, tutti i fili che sono (implicitamente) poste in un autogroup (cioè la stessa sessione, come creato da setsid(2)) formano un gruppo di lavoro. Ogni nuovo gruppo automatico è quindi un gruppo di attività separato.

Sotto pianificazione di gruppo, il valore nice di un thread ha un effetto per decisioni schedulazione solo relativi ad altri thread nel gruppo di task stesso . Ciò ha alcune sorprendenti conseguenze in termini di semantica tradizionale del valore piacevole sui sistemi UNIX. In particolare, se è abilitato il raggruppamento automatico (che è l'impostazione predefinita in varie distribuzioni Linux), lo su un processo ha solo per la pianificazione relativa ad altri processi eseguiti nella stessa sessione (in genere: la stessa finestra di terminale) .

contrario, per due processi che sono (per esempio) le sole processi legati alla CPU in diverse sessioni (ad esempio, diversi terminali finestre, ciascuna di cui posti di lavoro sono legate a differenti autogroups), modificano il valore nice di il processo in una delle sessioni ha nessun effetto in termini di decisioni dello scheduler relative al processo nell'altra sessione. Questo presumibilmente è lo scenario che hai visto, anche se non menzioni esplicitamente l'uso di due finestre di terminale.

Se si desidera impedire Autoraggruppamento interferire con la tradizionale nice comportamento come descritto qui, è possibile disattivare la funzione

echo 0 > /proc/sys/kernel/sched_autogroup_enabled 

essere consapevoli però che questo avrà anche l'effetto di disabilitare i benefici per l'interattività desktop che la funzione gruppo auto era destinata a fornire (vedi sopra).

Il valore nice autogroup

appartenenza autogroup di un processo può essere visualizzato tramite il file /proc/[pid]/autogroup:

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

Questo file può anche essere utilizzato per modificare la larghezza di banda della CPU allocata a un autogroup . Questo viene fatto scrivendo un numero nell'intervallo "bello" nel file per impostare il valore piacevole del gruppo di ricerca. L'intervallo consentito è compreso tra +19 (priorità bassa) e -20 (priorità alta).

L'autogroup ambiente piacevole ha lo stesso significato del valore nice processo , ma si applica alla distribuzione di cicli della CPU al autogroup nel suo complesso, sulla base dei valori relativi piacevoli di altre autogroups. Per un processo all'interno di un gruppo automatico, la CPU che riceve sarà un prodotto del valore piacevole del gruppo di ricerca (confrontato con lo in altri gruppi automatici) e il valore piacevole del processo (rispetto a altri processi nello stesso gruppo automatico).

Problemi correlati