GNU/Linux >> Linux Esercitazione >  >> Linux

Rallenta un solo processo per regolare la temperatura della CPU

CPULimit è esattamente ciò di cui hai bisogno. Si avvia il programma, quindi si esegue cpulimit rispetto al nome del programma o al PID, specificando quale percentuale si desidera limitare.

Il seguente comando limita il processo al PID 7777 al 5% di utilizzo della CPU.

cpulimit -p 7777 -l 5

In alternativa, puoi utilizzare il nome dell'eseguibile:

cpulimit -e myprogram -l 5

O il percorso assoluto dell'eseguibile:

cpulimit -P /path/to/myprogram -l 5

Nota che la percentuale è di tutti i core; quindi se hai 4 core, puoi usare il 400%.


Puoi renicere un processo in esecuzione per dargli più o meno priorità (il cosiddetto "nice value"). Si noti che la scala di priorità UNIX è alquanto controintuitiva:valori negativi significano che un processo è favorito rispetto ai processi concorrenti, cioè ha una priorità "maggiore".

Puoi quindi provare a "rallentare" il tuo processo dato il suo PID attraverso:

# lower priority of a process
renice +1 "PID"

Ogni volta che lo esegui, il processo "nice value" viene aumentato di 1; puoi usare valori interi diversi da +1 ovviamente.

Il comando nice ti consente di avviare un processo con una regolazione del valore di +10 nice (cambialo con l'opzione -n ). Ad esempio:

# start a CPU-intensive task with low priority
nice ./cpu-hog

Tuttavia, il "buon valore" influisce solo su quanto lo scheduler favorisce l'esecuzione di un particolare processo rispetto ad altri nel sistema:se il tuo computer è sostanzialmente inattivo, aumentare il "buon valore" di un singolo processo non impedire a quel processo di prendere il 100% della CPU. Cito dalla manpage di getpriority(2):(Il corsivo è stato aggiunto da me.)

Il grado in cui il loro relativo valore piacevole influisce sulla pianificazione dei processi varia tra i sistemi Unix e, su Linux, tra le versioni del kernel. A partire dal kernel 2.6.23, Linux ha adottato un algoritmo che fa sì che le differenze relative nei valori piacevoli abbiano un effetto molto più forte. Ciò fa sì che valori piacevoli molto bassi (+19) forniscano veramente poca CPU a un processo ogni volta che ce n'è un altro _carico di priorità più alta sul sistema._

La ragione di ciò risiede nel modo in cui i processi vengono eseguiti su un kernel simile a UNIX:ogni volta che il kernel decide di eseguire un processo, quel processo ha il pieno controllo di un core della CPU per un certo periodo di tempo (fisso e breve). Il "buon valore" può influenzare la frequenza con cui lo scheduler del kernel è disposto a concedere uno slot di tempo a un processo, ma non puoi modificare il fatto che, una volta pianificato, un processo viene eseguito indisturbato per un determinato periodo di tempo.

Pertanto, a parte il rallentamento della CPU, non c'è modo di rallentare l'esecuzione di un processo se non ci sono altri processi nel sistema che possono competere per l'accesso alla CPU.


cgroups sono stati creati esattamente per questo motivo.

http://www.kernel.org/doc/Documentation/cgroups/http://www.serverwatch.com/tutorials/article.php/3921001/Setting-Up-Linux-Cgroups.htm

Ci vuole un po' di tempo per familiarizzare con loro, e credo che tu abbia bisogno dell'accesso root per configurarli, ma tutto può essere programmato. I nuovi Ubuntu hanno un file .conf in modo da non dover scrivere il proprio script. Non sono sicuro del 10.10.

Un bel punto di partenza è in questa risposta:https://askubuntu.com/a/94743/170177

Nota che cgroups è ancora in fase di sviluppo attivo, quindi alcune funzionalità potrebbero non essere disponibili nel tuo attuale kernel.

Utilizzando cpu.shares di cgroups non fa niente che sia bello il valore non farebbe. Sembra che tu voglia effettivamente limitare i processi, cosa che può sicuramente essere fatta.

Dovrai usare uno o due script e/o modificare /etc/cgconfig.conf per definire i parametri desiderati.

In particolare, vuoi modificare i valori cpu.cfs_period_us e cpu.cfs_quota_us . Il processo potrà quindi essere eseguito per cpu.cfs_quota_us microsecondi per cpu.cfs_period_us microsecondi.

Ad esempio:

Se cpu.cfs_period_us =50000 e cpu.cfs_quota_us =10000 quindi il processo riceverà il 20% del tempo massimo della CPU, indipendentemente da cos'altro stia succedendo.

In questo screenshot ho assegnato al processo il 2% del tempo di CPU:

Per quanto riguarda il processo, funziona al 100%.

Impostazioni cpu.shares d'altra parte può e continuerà a utilizzare il 100% del tempo di inattività della CPU.

In questo esempio simile ho fornito il processo cpu.shares =100 (di 1024):

Come puoi vedere, il processo sta ancora consumando tutto il tempo di inattività della CPU.

Riferimenti:

http://manpages.ubuntu.com/manpages/precise/man5/cgconfig.conf.5.htmlhttp://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups. html


Linux
  1. Perché Windows10 VM è lento su OpenStack?

  2. Linux:come limitare un processo a un core della CPU in Linux??

  3. Come spostarsi verso il basso di una directory?

  4. Recuperare l'utilizzo della CPU e l'utilizzo della memoria di un singolo processo su Linux?

  5. handle di processo in lldbinit

Suggerimenti per l'inizio:monitoraggio del carico della CPU su Linux

Come controllare la temperatura della CPU su Linux

Come monitorare la temperatura della CPU su un sistema Linux Redhat 7

Come visualizzare la temperatura della CPU su Linux

Come ottenere l'utilizzo della CPU di un singolo processo in Linux

Come ottenere il pid del processo appena avviato