Come posso impostare il regolatore di ridimensionamento della frequenza della CPU per tutti i core contemporaneamente?


38

Vorrei impostare il regolatore di ridimensionamento della frequenza della CPU per tutti i core contemporaneamente invece di farlo individualmente per ciascun core. C'è un modo per fare questo?

(So ​​che sarebbe facile fare eco al governatore /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor, ma non sto cercando una soluzione personalizzata.)


2
Con "soluzione personalizzata" intendi che uno script di shell è inaccettabile, deve essere un pulsante GUI integrato?
jg-faustus,

Mi chiedo solo se esiste già una soluzione in un'installazione standard (non è necessario disporre di una GUI).
htorque,

Controlla questa pagina: idebian.wordpress.com/2008/06/22/cpu-frequency-scaling-in-linux sotto "implementazione debian": Apparentemente è possibile cambiare il default di avvio, e c'è uno strumento di spazio utente chiamato powernowd. (Questo è un commento piuttosto che una risposta perché il post è del 2008 e non ho testato se funziona ancora ...)
jg-faustus,

Risposte:


26

Sono ancora un noob di Linux, ma non credi che cpufrequtils ti permetta di farlo usando (non è raggruppato nel sistema operativo Ubuntu ma è lì nel repository)

sudo apt-get install cpufrequtils
sudo cpufreq-set -r -g performance
  • Il -rflag viene utilizzato per impostare la modifica per tutti i core ("tutti relativi all'hardware")

6
L'opzione relativa a -r non lo fa per tutti i core. Dobbiamo specificare il numero cpu con l'opzione -c <numero> tuttavia questo script lo farà per tutto cpus in una volta sola: for ((i = 0; i <$ (nproc); i ++)); esegui cpufreq-set -c $ i -r -g performance; fatto
Sri

6
Esatto, @Sri ha ragione. cpufreq-setin realtà manca di funzionalità alla fine semplice ma necessaria. Molte persone, come dimostra chiaramente questo segnalino voto, non ne sono consapevoli perché la sua descrizione è semplicemente fuorviante per finire.
poige,

2
Chi dà questi +1 senza test ???? Questo non funziona affatto. Ho pubblicato la soluzione di lavoro più semplice che ho trovato.
switch87

20

Ho cercato su Google molto e penso che non sia possibile, quindi ho aggiunto il seguente one-liner al mio .bashrc:

function setgov ()
{
    echo "$1" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 
}

Ora posso eseguire qualcosa del genere setgov ondemande tutti i core passeranno al governatore della ondemand .


2
Questo non funziona poiché il file scaling_governor è di proprietà di root e ha autorizzazioni limitate. La modifica delle autorizzazioni non è sempre consigliata.
Sri

Si prega di vedere lo script alternativo nel mio commento alla risposta dell'utente49449.
Sri

6

il comando più breve per cambiare governatore di tutti i core è il seguente:

sudo bash -c 'for i in {0..7}; do cpufreq-set -c $i -g performance; done'

Potresti aggiungerlo a .bashrc come citato da htorque, dovrai eseguirlo come root sudo setgov performance:

function setgov ()
{
     for i in {0..7}; 
     do 
         cpufreq-set -c $i -g $1; 
     done
}

2

Potrebbe anche aggiungere il completamento del codice bash, mentre ci siamo:

function setgovernor () {
    echo "$1" | sudo tee 
    /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 
}
complete -W "$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors)" setgovernor

2

Il modo in cui ho impostato questo per rimanere fedele poiché il governatore torna alla modalità di risparmio energetico dopo circa 30 secondi a partire da Ubuntu 16.04 o più recente (sono su Ubuntu Mate);

  1. Inserisci questo (una riga di) codice (grazie, per gentile concessione di switch87 nella risposta precedente)

    sleep 60 && bash -c 'for i in {0..7}; do cpufreq-set -c $i -g performance; done'
    
  2. nel file nella directory

    /etc/rc.local
    

La mia è una riga sopra "exit 0" e non commentata, sotto quelle commentate.

"rc.local" per coloro che non lo sanno, esegue il comando come sudo. Sembra che qualsiasi comando, per cambiare il governatore, debba essere eseguito come sudo.

Permette al regolatore di ripristinare la funzione di risparmio energetico ed esegue il codice come sudo dopo 60 secondi per riportarlo alle prestazioni.

Cambia "60" (nel codice che copi) in qualsiasi momento (in secondi. 60 = 60 secondi = 1 minuto) devi ritardare il comando e "performance" (nella parte del comando) a quale governatore vuoi che sia cambia in.

Tra le mie ore e ore di ricerca non ho trovato una soluzione più permanente per questo di questo. Immagino che cosa ci vorrà un paio di minuti su powersave se questa è la soluzione migliore che ho trovato, giusto? Destra.

Non è la soluzione migliore, ma lo rende in qualche modo permanente dopo aver fatto il piccolo passaggio al risparmio energetico. Se vuoi avviarti subito e saltare in un gioco o qualcosa del genere dovrai aspettare un minuto per il codice che hai appena inserito per tornare indietro da powersave o ridurre i tempi (a seconda di quanto tempo impiega tutto per avviarsi in modo da tornare correttamente alle prestazioni).

E, come sempre, per tornare ai valori predefiniti (ho visto alcuni problemi con il surriscaldamento dei PC delle persone, motivo per cui potrebbero averlo predefinito per risparmiare energia in primo luogo) basta rimuovere il codice da rc.local e riavviare o ripristinarlo manualmente con il commutatore o la corsa dell'indicatore dell'icona della CPU;

 sudo /etc/init.d/cpufrequtils restart

nel terminale eo riavvio.


1

Puoi farlo per tutti i core contemporaneamente eseguendo

sudo cpupower frequency-set --governor performance

0

Basandomi sulla risposta di switch87, ho realizzato un semplice script cpufreq-set-all, che consentirà di fare altre cpufreq-setcose con tutte le CPU:

   #!/bin/bash
   MAX_CPU=$((`nproc --all` - 1))
   for i in $(seq 0 $MAX_CPU); do
       echo "Changing CPU " $i " with parameter "$@;
       cpufreq-set -c $i $@ ;
   done

Ora può essere invocato (dopo chmod +x, ovviamente) in questo modo:

cpufreq-set-all -g powersave

o

cpufreq-set-all -f 800Mhz
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.