Eseguire il processo Linux con una priorità molto bassa?


12

Ho un processo regolare che non è così importante, ma consumerà così tanta potenza della CPU, e ho un altro processo che è davvero importante, ma trascorre la maggior parte del tempo inattivo, ma quando ha un lavoro ha davvero bisogno di un'alta potenza di calcolo

Ho provato a correre con nice -20 ./low_priority_processe, nice --20 ./high_priority_processtuttavia, la priorità più bassa consuma una quantità significativa di CPU quando è necessario un processo ad alta priorità, come posso eseguire un processo che produrrà davvero o addirittura sospendere automaticamente quando un altro processo utilizza la potenza della CPU


In che modo stai determinando che il processo ad alta priorità è effettivamente necessario?
muru,

genererà molti thread o il processo
consumerà

Utilizzare la RRpianificazione per il processo ad alta priorità.
Ramesh,

@Ramesh Quale possibile differenza farà?
Ken Sharp,

Risposte:


10

Dai un'occhiata ai cgroups , dovrebbe fornire esattamente ciò di cui hai bisogno: prenotazioni CPU (e altro). Suggerirei di leggere la priorità di controllo delle applicazioni usando i cgroups .

Detto questo, metti insieme i processi importanti ma spesso inattivi con il 95% di CPU allocato e le altre tue applicazioni in un altro con il 5% allocato: otterrai (quasi) tutta la potenza per i tuoi lavori quando necessario, mentre il costante il processo affamato di energia otterrà al massimo il 5% in quei momenti. Quando i picchi computazionali scompaiono, tutte le prestazioni della CPU verranno scaricate sui processi rimanenti. Come vantaggio, se crei un cgroup speciale (con requisiti minimi di prestazione) per processi come sshd, sarai in grado di accedere indipendentemente da ciò che sta cercando di ottenere tutta la CPU possibile: un po 'di tempo della CPU sarà riservato sshd.


1
c'è un comando simile cpulimito niceper modificare il cgroup del processo? perché se cgroup è una chiamata API, sono in grado di ricompilare nessuna di quelle app per usare cgroup
uray

No, devi solo montare la gerarchia di cgroup da qualche parte, creare directory per gruppo e scrivere PID di processi in alcuni file. Tutto ciò deve essere fatto come root (o, più precisamente con i privilegi appropriati). Alcuni sistemi init (vale systemda dire , almeno in alcuni casi) "rubano" l'interfaccia cgroups agli utenti che devono utilizzare l'interfaccia del sistema init (di solito un comando speciale). Leggi la risposta collegata e l'articolo di Wikipedia. Veramente. :)
peterph,

Oh, e c'è anche un libcgrouppacchetto, che viene fornito con utility per lavorare con cgroups incluso un demone ( cgrulesengd) che può effettivamente ordinare i processi in gruppi a seconda di alcune condizioni.
peterph,

7

Se la priorità del processo (buon valore) è bassa, non interromperà un processo con priorità più alta. Il motivo per cui stai vedendo che il processo a bassa priorità consuma ancora una quantità significativa di CPU quando è in esecuzione il processo con priorità più alta è perché il processo con priorità più alta non è così occupato. Probabilmente in attesa di IO. Utilizzalo chrt -p -i 0 $PIDper eseguire il processo con una priorità ancora inferiore rispetto a nice 19 -p $PID(supponendo che stiamo parlando di Linux qui).

chrt -p -i 0 $PID inserisce il processo nel "vero" programmatore inattivo.

http://linux.die.net/man/1/chrt


2
chrt -p -i 0 $ PID
Robert Foss

chrt non è ancora abbastanza. Quello che sto cercando di fare è guardare video mentre ricodificare altri video in background. L'utilizzo di chrt ha aiutato con i video di YouTube, ma i mkv di altissima qualità continuano a saltare. Quello che desideravo è riprodurre normalmente il mio video, ma usare tutta la potenza della CPU rimasta per la ricodifica perché ho un grosso batch da fare.
soger

0

Prova questo esempio per eseguire un processo come processo basso.

Se il tuo lavoro è bello tar xvf asets.zip

Uso

bel tar xvf assets.zip

Successivamente, rilasciare

top per monitorare il processo decomprimere con

ps aux | grep "tar"

Prova qualcosa di specifico con cpulimit

wget -O cpulimit.zip https://github.com/opsengine/cpulimit/archive/master.zip
unzip cpulimit.zip
cd cpulimit-master
make
sudo cp src/cpulimit /usr/bin

cpulimit -l 50 python 0 9999999999> / dev / null &


sì, -20è "bassa priorità" ed --20è "alta priorità" guarda il doppio trattino per il nicecomando. e sì, ho capito tutto sul buon valore, ma la mia domanda è: c'è un modo per dire allo scheduler se non usare un buon valore
uray

2
@ user77710 sei sicuro? Né la manpage di Ubuntu né la manpage POSIX specificano questa sintassi. Entrambi usano -n -20, -n 20ecc.
Muru,

sì, comunque, la sintassi non è importante, il mio punto è impostare un valore molto basso e molto alto per entrambi i processi non dà il risultato di quello che volevo
Uray,

2
@ user77710 CHE COSA? "la sintassi non è importante"? Come puoi essere sicuro di aver impostato i valori di gentilezza allora?
muru,

perché posso vedere il valore bel processo su htopo topoppure pso qualsiasi altra cosa
Uray

-1

Per i futuri venuti, qui è un esempio completo di nicecon lo stress .

  1. La macchina di prova ha 2 CPU
$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              2 
On-line CPU(s) list: 0,1
Thread(s) per core:  2
...
  1. Installa stress:apt-get install stress
  2. Rendi impegnate le 2 CPU con una chiamata a bassa priorità per stressare: nice -20 stress --cpu 2
  3. Controlla l'utilizzo della CPU con top:
                                                 v
                                                 v
                                                 v
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
15894 ubuntu    39  19    8240     96      0 R  99.7  0.0   0:06.43 stress                                                                                    
15895 ubuntu    39  19    8240     96      0 R  99.7  0.0   0:06.42 stress                                                                                    

Ciò dimostra che entrambe le CPU sono completamente occupate.

  1. Avviare un processo di stress a CPU singola con priorità alta: nice --20 stress --cpu 1
  2. Controlla di nuovo l'utilizzo della CPU con top
                                                 v
                                                 v
                                                 v
                                                 v
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
15928 ubuntu    20   0    8240    100      0 R  99.7  0.0   0:24.02 stress                                                                                    
15894 ubuntu    39  19    8240     96      0 R  51.2  0.0   1:12.46 stress                                                                                    
15895 ubuntu    39  19    8240     96      0 R  48.8  0.0   1:12.35 stress                                                                                    

Ciò dimostra che il processo di stress single-core ottiene la sua CPU completa, mentre i processi con priorità inferiore condividono entrambi i 1 cpu rimanenti

  1. D'altra parte, uccidere tutte le stresschiamate sopra e innescare un singolo processo 3 stress --cpu 3darebbe il 66% di CPU a ciascuna
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.