Como defino o regulador de escala de frequência da CPU para todos os núcleos de uma só vez?

37

Gostaria de definir o regulador de escala de frequência da CPU para todos os núcleos de uma só vez, em vez de fazê-lo individualmente para cada núcleo. Existe uma maneira de fazer isso?

(Eu sei que seria fácil /sys/devices/system/cpu/cpu*/cpufreq/scaling_governorfalar com o governador , mas não estou procurando uma solução personalizada.)

htorque
fonte
2
Com "solução personalizada", você quer dizer que um script de shell é inaceitável, precisa ser um botão da GUI embutido?
Jg-faustus
Só estou me perguntando se já existe uma solução em uma instalação padrão (não precisa ter uma GUI).
Htorque 6/01/11
Verifique esta página: idebian.wordpress.com/2008/06/22/cpu-frequency-scaling-in-linux em "implementação debian": aparentemente é possível alterar o padrão de inicialização e existe uma ferramenta de espaço de usuário chamada powernowd. (Este é um comentário, e não uma resposta, porque o post é de 2008 e ainda não testei se ele ainda funciona ...) #
1160 jg-

Respostas:

25

Eu ainda sou um linux noob, mas você não acha que o cpufrequtils permite fazer isso usando (não está incluído no Ubuntu OS, mas existe no repositório)

sudo apt-get install cpufrequtils
sudo cpufreq-set -r -g performance
  • O -rsinalizador é usado para definir a alteração para todos os núcleos ("todos os relacionados ao hardware")
user49449
fonte
6
A opção relacionada -r não faz isso para todos os núcleos. Temos que especificar o número da cpu com a opção -c <número>, no entanto, esse script fará isso para todos os cpus de uma só vez: for ((i = 0; i <$ (nproc); i ++)); cpufreq-set -c $ i -r -g performance; feito
Sri
6
Exatamente, @Sri está certo. cpufreq-setna verdade, falta de funcionalidade simples, mas necessária. Muitas pessoas, como mostra este contador de votos, claramente não estão cientes disso, porque sua descrição é simplesmente enganosa para completar.
poige
2
Quem dá esses + 1s sem testar ???? Isso não funciona. Publiquei a solução de trabalho mais simples que pude encontrar.
usar o seguinte comando
20

Pesquisei bastante no Google e acho que não é possível, então adicionei a seguinte linha ao meu .bashrc:

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

Agora eu posso executar algo como setgov ondemande todos os núcleos mudarão para o governador ondemand .

htorque
fonte
2
Isso não funciona, pois o arquivo scaling_governor pertence à raiz e possui permissões restritas. Alterar as permissões nem sempre é recomendado.
Sri
Por favor, veja um script alternativo no meu comentário para a resposta do usuário49449.
Sri
6

o comando mais curto para alterar o governador de todos os núcleos é o seguinte:

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

Você pode adicioná-lo ao .bashrc como o htorque mencionado, terá que executá-lo como root sudo setgov performance:

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

Também é possível adicionar a conclusão do código bash, enquanto estamos nisso:

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
Ray Malanga
fonte
2

A maneira como defini isso para permanecer, já que o governador volta ao padrão de economia de energia após cerca de 30 segundos agora a partir do Ubuntu 16.04 ou mais recente (estou no Ubuntu Mate);

  1. Coloque este código (uma linha de) (obrigado, cortesia do switch87 na resposta anterior)

    sleep 60 && bash -c 'for i in {0..7}; do cpufreq-set -c $i -g performance; done'
    
  2. no arquivo no diretório

    /etc/rc.local
    

A minha é uma linha acima da "saída 0" e não comentada, abaixo das comentadas.

"rc.local" para quem não sabe, executa o comando como sudo. Qualquer comando que pareça, para mudar o governador, precisa ser executado como sudo.

Ele permite que o governador retorne ao powersave e execute o código como sudo após 60 segundos para voltar ao desempenho.

Altere o "60" (no código que você copia) para o tempo que for necessário (em segundos. 60 = 60 segundos = 1 minuto) para adiar o comando e a "performance" (na parte de comando) para qual governador você deseja mudar para.

Fora das minhas horas e horas de pesquisa, não encontrei uma solução mais permanente para isso do que isso. Eu acho que há alguns minutos em economia de energia, se essa é a melhor solução que eu encontrei, certo? Direita.

Não é a melhor solução, mas a torna um pouco permanente depois que faz, é uma pequena mudança para a economia de energia. Se você deseja inicializar e saltar para um jogo ou algo do tipo, terá que esperar um minuto para o código que você inseriu para voltar ao powersave ou diminuir o tempo (dependendo de quanto tempo leva tudo para iniciar, para voltar ao desempenho corretamente).

E, como sempre, para voltar ao padrão (vi alguns problemas com o superaquecimento dos PCs das pessoas, e é por isso que eles podem ter o padrão de economia de energia em primeiro lugar) basta remover o código do rc.local e reiniciá-lo ou ligá-lo novamente manualmente com o comutador do indicador de ícone da CPU ou execute;

 sudo /etc/init.d/cpufrequtils restart

no terminal e ou reinicie.

Roiikka
fonte
1

Você pode fazer isso para todos os núcleos de uma só vez executando

sudo cpupower frequency-set --governor performance
Martin Andersson
fonte
0

Baseando-me na resposta do switch87, criei um script simples cpufreq-set-all, que permitirá fazer outras cpufreq-setcoisas com todas as CPUs:

   #!/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

Agora pode ser invocado (depois chmod +x, é claro) assim:

cpufreq-set-all -g powersave

ou

cpufreq-set-all -f 800Mhz
side2k
fonte