CPU Throttling/Dynamic frequency scaling: Configurando Cool'n'Quiet/SpeedStep no Linux (Parte 2)

Esta é a continuação do artigo sobre CPU Throttling no linux. Veja a parte 1 primeiro .
Veja também o artigo sobre como implementar o Cool'n'Quiet no Windows .

Conhecendo o cpufrequtils:

O pacote que foi instalado (cpufrequtils) fornece dois programas: cpufreq-info e cpufreq-set. Conforme o próprio nome sugere, o primeiro exibe informações do sistema, enquanto o segundo faz as alterações propriamente ditas.

Primeiro vamos ver detalhes sobre a CPU utilizada (por questões de espaço vou colocar apenas as linhas que nos interessam):
debian:~# cat /proc/cpuinfo
processor     : 0
vendor_id     : AuthenticAMD
cpu family     : 15
model           : 95
model name  : AMD Sempron(tm) Processor 3200+
stepping        : 2
cpu MHz      : 1800.000
cache size     : 128 KB
Este processador é um Sempron 3200+ (que roda a um clock de 1800MHz = 1.8GHz). Vamos ver o que o cpufreq-info tem a dizer sobre ele:
debian:~# cpufreq-info
cpufrequtils 002: cpufreq-info (C) Dominik Brodowski 2004-2006
Report errors and bugs to linux@brodo.de, please.
analyzing CPU 0:
  driver: powernow-k8
  CPUs which need to switch frequency at the same time: 0
  hardware limits: 1000 MHz - 1.80 GHz
  available frequency steps: 1.80 GHz, 1000 MHz
  available cpufreq governors: userspace, conservative, powersave, ondemand, performance
  current policy: frequency should be within 1000 MHz and 1.80 GHz.
                  The governor "userspace" may decide which speed to use
                  within this range.
  current CPU frequency is 1.80 GHz (asserted by call to hardware).
Interpretando a saída do cpufreq-info, linha por linha (só as mais importantes):
driver: powernow-k8
Driver carregado via módulo(como dito antes, depende da arquitetura do processador)

hardware limits: 1000 MHz - 1.80 GHz
Clock mínimo e máximo que seu processador suporta. Obviamente vai depender do processador. Tenho um Athlon 64 AM2 3200+ que suporta entre 1GHz e 2GHz.

available frequency steps: 1.80 GHz, 1000 MHz
Quais são as frequencias disponíveis para esse processador. Nesse caso, ele só aceita os extremos. Meu outro Athlon citado anteriormente suporta 1GHz, 1.8GHz e 2GHz

available cpufreq governors: userspace, conservative, powersave, ondemand, performance
Governors disponíveis (vai depender dos módulos que foram carregados no passo anterior - vide a 1ª parte do artigo)

current policy:
A segunda linha mostra qual o governor em uso atualmente. No exemplo, é o userspace.

current CPU frequency is 1.80 GHz (asserted by call to hardware).
Informa a frequencia atual do processador (que também pode ser verificada por cat /proc/cpuinfo)

De posse dessas informações, já podemos começar a brincadeira. Vamos ver alguns cenários abaixo:
1) Selecionar uma frequência manualmente:
debian:~#cpufreq-set -f 1000000
Obs: A frequência deve ser informada em Khz (kilohertz). Para saber os valores disponíveis em kilohertz, execute o cpufreq-info e veja a linha available frequency steps. Para converter MHz em KHz, multiplique o valor por 1.000. Para converter GHz em KHz, multiplique o valor por 1.000.000

2) Configurar o clock dentro de uma determinada faixa:
As opções -d e -u do cpufreq-set permitem configurar as frequências mínima e máxima respectivamente. Por exemplo, suponhamos que você possua um processador, que suporte as seguintes frequências:
debian:~#cpufreq-info | grep steps
available frequency steps: 2.8GHz, 2GHz, 1.5GHz, 1000MHz
Que em KHz são  respectivamente 2800000 2000000 1500000 1000000.

Para fazer com que ele nunca trabalhe abaixo de 1.5GHz execute
debian:~#cpufreq-set -d 1500000
Por outro lado, se você não quer que seu processador trabalhe acima de determinada frequência, informe ela com a opção -u:
debian:~#cpufreq-set -d 2000000
3) Selecionar um governor específico:
debian:~# cpufreq-set -g <nome>

Atenção: em <nome> você deve colocar o nome do governor, não o nome do módulo. Ex: para carregar o governor powersave (que fixa a frequência no valor mínimo, independente da demanda) execute:
debian:~# cpufreq-set -g powersave
Para exibir a lista de governors disponíveis, execute:
debian:~# cpufreq-info -g
userspace conservative powersave ondemand performance
Para confirmar a mudança de frequencia, execute (a opção -m exibe as frequências em um formato que facilita a leitura):
debian:~# cpufreq-info -f -m
1000 MHz
Ou via /proc/cpuinfo:
debian:~# cat /proc/cpuinfo
processor      : 0
vendor_id      : AuthenticAMD
cpu family      : 15
model            : 95
model name   : AMD Sempron(tm) Processor 3200+
stepping         : 2
cpu MHz       : 1000.000
cache size      : 128 KB
Lendo as estatísticas:
Se você carregou o módulo cpufreq_stats, pode acessar algumas estatísticas do gerenciamento de energia em dois arquivos dentro do diretório /sys/devices/system/cpu/cpu0/cpufreq/stats/:
total_trans: mostra quantas vezes o sistema trocou o nível de clock do processador.
Ex:
debian:~# cat /sys/devices/system/cpu/cpu0/cpufreq/stats/total_trans
963
Meu processador mudou o clock 963 vezes.

time_in_state: Lista quanto tempo o processador ficou em cada nível de clock. A primeira coluna mostra o clock (divida o valor por 1.000.000 para obter a velocidade em GHz) e a segunda coluna mostra os segundos em que o (divida o valor obtido por 100 para obter o tempo em segundos).
Ex:
debian:~# cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state
1800000 1455033
1000000 7436681

Meu processador passou 14550 segundos funcionando em 1.8GHz e 74366 segundos funcionando em 1GHz

Configurando manualmente:
Se você prefere fazer as coisas do "modo difícil", você pode ignorar o cpufrequtils e ler/escrever os valores desejados diretamente nos arquivos do diretório /sys/devices/system/cpu/cpu0/cpufreq/ :
Obs: Para ler os valores utilize cat . Para escrever os valores utilize echo <valor> > <arquivo>. Os valores de frequência são informados em KHz. Divida por 1.000.000 para obter o valor em GHz.
Ex: 1800000 / 1.000.000 = 1.8GHz

scaling_available_frequencies: Lista as velocidades disponíveis (equivalente a cpufreq-info)
scaling_available_governors: Lista os governors disponíveis (equivalente a cpufreq-info -g)
scaling_cur_freq: Permite ler/selecionar a velocidade atual da CPU (equivalente a cpufreq-info -f/cpufreq-info -f)
scaling_governor: Permite ler/selecionar o governor atualmente em uso (equivalente a cpufreq-info -g/cpufreq-set -g)
scaling_min_freq: Permite ler/selecionar a velocidade mínima que se deseja para a CPU. A velocidade deve ser igual ou superior à velocidade mínima (equivalente a cpufreq-set -d)
scaling_max_freq: Permite ler/selecionar a velocidade máxima que se deseja para a CPU. A velocidade deve ser igual ou inferior à velocidade máxima (equivalente a cpufreq-set -u)
cpuinfo_cur_freq: Velocidade atual da CPU (equivalente a cpufreq-info -f)
cpuinfo_max_freq: Velocidade máxima suportada pela CPU (equivalente a cpufreq-info -l)
cpuinfo_min_freq: Velocidade mínima suportada pela CPU (equivalente a cpufreq-info -l)

4 comentários:

Anônimo disse...

Quite good topic

Anônimo disse...

Necessidade de manter testando meu blog. Não funciona como eu quero que ela ainda. Thx para o tema. Talvez isto vai ter o meu olhar melhor.

Anônimo disse...

hola, Chicos, Acabo de añadir el feed a mis favoritos. Me gusta mucho leer sus mensajes.

Fabiano Pires disse...

gracias! Sus comentarios me animan a seguir escribiendo. abrazos!