Rallenta solo un processo per regolare la temperatura della CPU


9
  1. Ho un programma Quando è in esecuzione, la temperatura della CPU aumenta da 50 a 80 Celcius, che è la mia principale preoccupazione.

    Posso controllare la frequenza della CPU per rallentarla, ma anche altri processi verranno rallentati, cosa che non desidero.

    È possibile rallentare un determinato processo senza influire su altri processi per mantenere la CPU fresca?

    Il mio sistema operativo è Ubuntu 10.10.

  2. Ho cercato di impostare la priorità del processo nice -n 15 myprograme non sono sicuro che funzionerà. La CPU è alta 77 di Celcius.

    Non nicesolo impostare la priorità relativa di un processo WRT altri processi? Vale a dire, se altri processi non sono in esecuzione, questo processo ordinato funzionerà rapidamente? Vorrei impostare il processo in modo lento per tutto.


1
Cosa fa questo processo: input / output pesanti? Calcoli pesanti sulla CPU principale? Calcoli pesanti sulla GPU (scheda video) (di solito ma non limitato ai programmi che calcolano le immagini)?
Gilles 'SO- smetti di essere malvagio' il

Il programma è pdf2djvu, convertendo un file pdf in djvu. È IO pesante o CPU pesante o GPU pesante? Hai modi diversi per casi diversi?
Tim

4
80º è molto alto. Vivo in un luogo caldo della Spagna e la temperatura massima del mio processore è di ~ 60º. Aprire il computer, pulire tutti i pezzi e sostituire i dispositivi di raffreddamento. Penso che il tuo non sia l'uso della CPU.
Rufo El Magufo,

Prova a fare entrambe le cose.
stribika,

80 ° è in realtà alto ma non considerato estremo a seconda del modello di CPU. la maggior parte della CPU supporta fino a 90 ° C senza problemi
Kiwy,

Risposte:


16

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 comando seguente limita il processo con PID 7777 al 5% di utilizzo della CPU.

cpulimit -p 7777 -l 5

In alternativa, è possibile utilizzare il nome dell'eseguibile:

cpulimit -e myprogram -l 5

O il percorso assoluto dell'eseguibile:

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

Si noti che la percentuale è di tutti i core; quindi se hai 4 core, potresti usare il 400%.


1
Grazie! (1) CPULimit è utilizzato solo per il processo già in esecuzione? Non utilizzato durante l'invio di un programma da eseguire? (2) fissa la percentuale di utilizzo della CPU da parte di un processo o imposta il limite superiore per il processo e consente al suo utilizzo di fluttuare tra 0 e quel limite in base ad altri processi? (3) Ho anche scoperto che dopo aver usato CPULimit su un processo, non c'è modo di Ctrl + C per annullare l'esecuzione, perché presto tornerà a funzionare automaticamente. Mi chiedo perché?
Tim

2
Un piccolo avvertimento su CPULimit: utilizza SIGSTOP / SIGCONT per limitare la quantità di tempo della CPU utilizzata da un processo (i processi che superano l'utilizzo della CPU di destinazione vengono arrestati; quando è trascorso un tempo sufficiente, il processo viene inviato a SIGCONT e riprende l'esecuzione). Tuttavia, ci sono rari casi in cui i segnali possono interferire con le chiamate di sistema, vedere il manuale della libreria GNU C per i dettagli. Dato che CPULimit invia questi segnali più volte al secondo, c'è una possibilità di interruzione. Non è un grosso problema per l'esecuzione di pdftk su un desktop, comunque.
Riccardo Murri,

8

Puoi rinominare un processo in corso per dargli più o meno priorità (il cosiddetto "bel valore"). Si noti che la scala di priorità UNIX è in qualche modo controintuitiva: valori negativi indicano che un processo è favorito rispetto a processi simultanei, cioè ha una priorità "più".

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

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

Ogni volta che esegui questo, il "bel valore" del processo viene aumentato di 1; puoi usare valori interi diversi da quelli +1ovviamente.

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

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

Tuttavia, il "buon valore" influenza solo quanto lo scheduler preferisce eseguire un determinato processo rispetto ad altri nel sistema: se il tuo computer è sostanzialmente inattivo, aumentare il "buon valore" di un singolo processo non impedirà a quel processo di prendere il 100% PROCESSORE. Cito dalla manpage getpriority (2) : (Enfasi aggiunta da me.)

Il grado in cui il loro valore relativo 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 in valori positivi abbiano un effetto molto più forte. Questo fa sì che valori piacevoli molto bassi (+19) forniscano veramente poca CPU a un processo ogni volta che c'è un altro carico con 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 lasso di tempo (fisso e breve). Il "buon valore" può influenzare la frequenza con cui lo scheduler del kernel è disposto a concedere un intervallo di tempo a un processo, ma non è possibile modificare il fatto che, una volta programmato, un processo viene eseguito indisturbato per un determinato periodo di tempo.

Pertanto, a parte il rallentamento della CPU, non è possibile rallentare l'esecuzione di un processo se non vi sono altri processi nel sistema che possono contendere l'accesso alla CPU.


Grazie! È possibile rallentare l'esecuzione di un processo dall'inizio alla fine, indipendentemente da altri processi?
Tim

@ Tim Non penso che ciò che chiedi sia possibile; Ho aggiornato la risposta con maggiori dettagli. Spero che questo lo renda più chiaro.
Riccardo Murri,

1
L'altra risposta ha suggerito CPULimit, che sembra fare l'impossibile.
Tim

Ah, non sapevo di CPULimit - colma sicuramente un vuoto nel mio set di strumenti UNIX.
Riccardo Murri,

nicenon farà nulla per mantenere fresco il processore. Non è progettato per funzionare in questo modo.
Ken Sharp,

4

i cgroup sono stati creati proprio 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 può essere tutto scritto. Il nuovo Ubuntus ha un file .conf in modo da non dover scrivere il tuo script. Non sono sicuro del 10.10.

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

Si noti che i cgroups sono ancora in fase di sviluppo attivo, quindi alcune funzionalità potrebbero non essere disponibili nel kernel corrente.

L'uso di cpu.shares di cgroups non fa nulla che un buon valore non farebbe. Sembra che tu voglia effettivamente limitare i processi, il che può sicuramente essere fatto.

Sarà necessario utilizzare uno o due script e / o modificare /etc/cgconfig.conf per definire i parametri desiderati.

In particolare, si desidera modificare i valori cpu.cfs_period_us e cpu.cfs_quota_us . Sarà quindi possibile eseguire il processo per microsecondi cpu.cfs_quota_us per microsecondi cpu.cfs_period_us .

Per esempio:

Se cpu.cfs_period_us = 50000 e cpu.cfs_quota_us = 10000, il processo riceverà il 20% del tempo massimo della CPU, indipendentemente da ciò che sta succedendo.

In questa schermata ho dato al processo il 2% del tempo della CPU:

2% tempo CPU

Per quanto riguarda il processo, funziona al 100%.

Le impostazioni cpu.shares invece possono e continuano a utilizzare il 100% del tempo di inattività della CPU.

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

cpu.shares

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.html http://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups .html


Nota: systemdfa le cose un po 'diverse. Ubuntu Trusty, ad esempio, sembra avere due servizi per gestire i cgroups. Aggiornerò quando ne saprò di più.
Ken Sharp,

Ma puoi cambiare la percentuale massima di CPU quando il processo è già avviato, come renice?
Marco Sulla

renicenon cambia la quantità di CPU utilizzata, cambia solo la priorità del processo nello scheduler. i cgroups possono modificare il limite della CPU in qualsiasi momento. Da quando questa risposta è stata pubblicata, ai cgroups sono stati aggiunti tutti i tipi di modifiche ed è molto potente.
Ken Sharp

renice does not change the amount of CPU usesLo so;) Ho appena pubblicato come esempio di un programma che cambia le cose in fase di esecuzione. Grazie per la tua risposta, proverò cgroups.
Marco Sulla
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.