CPU frequency scaling (Português)

From ArchWiki
Status de tradução: Esse artigo é uma tradução de CPU frequency scaling. Data da última tradução: 2020-06-19. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

A escala de frequência da CPU permite que o sistema operacional aumente ou diminua a frequência da CPU para economizar energia. Frequências de CPU podem ser escalonadas automaticamente dependendo da carga do sistema, em resposta a eventos ACPI, ou manualmente por programas espaço do usuário.

O escalonamento de frequência da CPU é implementado no kernel do Linux, a infraestrutura é chamada de cpufreq. Desde o kernel 3.4, os módulos necessários são carregados automaticamente e o regulador ondemand recomendado é ativado por padrão. No entanto, as ferramentas de espaço do usuário, como cpupower, acpid, Laptop Mode Tools ou ferramentas GUI fornecidas para o seu ambiente de área de trabalho, ainda podem ser usadas para configuração avançada.

Ferramentas de espaço do usuário

thermald

thermald é um daemon do Linux usado para evitar o superaquecimento de plataformas. Esse daemon monitora a temperatura e aplica compensação usando os métodos de resfriamento disponíveis.

Por padrão, ele monitora a temperatura da CPU usando sensores de temperatura digital da CPU disponíveis e mantém a temperatura da CPU sob controle, antes que o hardware execute uma ação de correção agressiva. Se houver um sensor de temperatura da pele em sysfs térmicos, ele tentará manter a temperatura da pele abaixo de 45°C.

A unit de systemd associada é thermald.service, que deve ser iniciada e habilitada.

i7z

i7z é uma ferramenta de relatório de CPUs i7 (e agora i3, i5) para o Linux. Pode ser iniciada de um Terminal com o comando i7z ou como interface gráfica com i7z-gui.

cpupower

O cpupower é um conjunto de utilitários do espaço de usuário projetado para auxiliar no dimensionamento de frequência da CPU. O pacote não é necessário para usar o escalonamento, mas é altamente recomendado porque ele fornece utilitários de linha de comando úteis e um serviço systemd para alterar o gerenciador na inicialização.

O arquivo de configuração do cpupower encontra-se em /etc/default/cpupower. Esse arquivo de configuração é lido por um script em bash em /usr/lib/systemd/scripts/cpupower que é ativado por systemd com cpupower.service. Você pode querer habilitar cpupower.service para iniciar na inicialização.

cpupower-gui

cpupower-guiAUR é um utilitário gráfico desenvolvido para auxiliar no dimensionamento da frequência da CPU. A GUI é baseada em GTK e deve fornecer as mesmas opções que cpupower. O cpupower-gui pode alterar a frequência e o regulador máximo/mínimo da CPU para cada núcleo. O aplicativo manipula a concessão de privilégios por meio do polkit e permite que qualquer usuário do grupo de usuários wheel altere a frequência e o regulador.

Drivers de frequência de CPU

Nota:
  • O módulo nativo da CPU é carregado automaticamente.
  • O driver de escala de energia pstate é usado automaticamente para CPUs Intel modernas, em vez dos outros drivers abaixo. Este driver tem prioridade sobre outros drivers e é embutido em vez de ser um módulo. Este driver é usado automaticamente para o Sandy Bridge e CPUs mais recentes. Se você encontrar um problema ao usar este driver, adicione intel_pstate=disable à sua linha do kernel. Você pode usar os mesmos utilitários de espaço do usuário com este driver, mas não pode controlá-lo.
  • Mesmo o comportamento do estado P mencionado acima pode ser influenciado com /sys/devices/system/cpu/intel_pstate, por exemplo, o Intel Turbo Boost pode ser desativado com echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo como usuário root para manter baixas as temperaturas da CPU.
  • Controle adicional para os modernos processadores da Intel está disponível com o Linux Thermal Daemon[link inativo 2023-09-16 ⓘ] (disponível como thermald), que proativamente controla a térmica usando estados P, estados T e o driver da clamp de energia da Intel. Thermald também pode ser usado para CPUs Intel mais antigas. Se os drivers mais recentes não estiverem disponíveis, o daemon será revertido para registros específicos do modelo x86 e o "subsistema cpufreq" do Linux para controlar o resfriamento do sistema.

cpupower requer módulos para conhecer os limites da CPU nativa:

Módulo Descrição
intel_pstate Esse driver implementa um driver de escalonamento com um controlador interno para processadores Intel Core (Sandy Bridge e mais recentes).
acpi-cpufreq Driver CPUFreq que utiliza os estados de desempenho do processador ACPI. Este driver também possui suporte ao Intel Enhanced SpeedStep (anteriormente com suporte pelo módulo speedstep-centrino obsoleto).
speedstep-lib Driver CPUFreq para processadores habilitados para Intel SpeedStep (principalmente Atoms e Pentiums mais antigos (até III))
powernow-k8 Driver CPUFreq para processadores K8/K10 Athlon 64/Opteron/Phenom. Desde o Linux 3.7, "acpi-cpufreq" será automaticamente usado para CPUs mais modernas desta família.
pcc-cpufreq Este controlador possui suporte a interface de Processing Clocking Control da Hewlett-Packard e Microsoft Corporation, que é útil em alguns servidores ProLiant.
p4-clockmod Driver CPUFreq para processadores Intel Pentium 4/Xeon/Celeron que reduz a temperatura da CPU, ignorando os relógios. (Você provavelmente deseja usar um driver SpeedStep).

Para ver uma lista completa de módulos disponíveis, execute:

$ ls /usr/lib/modules/$(uname -r)/kernel/drivers/cpufreq/

Carregue o módulo apropriado (veja Módulos de kernel para detalhes). Depois que o driver cpufreq apropriado é carregado, informações detalhadas sobre a(s) CPU(s) podem ser exibidas executando

$ cpupower frequency-info

Configurando frequências máxima e mínima

Em alguns casos, pode ser necessário definir manualmente as frequências máxima e mínima.

Para definir a frequência máxima do relógio (freq_do_clock é uma frequência de relógio com unidades: GHz, MHz):

# cpupower frequency-set -u freq_do_clock

Para definir uma frequência de clock mínima:

# cpupower frequency-set -d freq_do_clock

Para definir a CPU para executar em uma frequência especificada:

# cpupower frequency-set -f freq_do_clock
Nota:
  • Para ajustar apenas para um único core de CPU, acrescente -c número_do_core.
  • As frequências máxima e mínima do regulador podem ser definidas em /etc/default/cpupower.

Alternativamente, você pode definir a frequência manualmente:

# echo valor > /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq

Os valores disponíveis podem ser definidos em /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies ou similar. [1][link inativo 2023-05-06 ⓘ]

Desabilitando Turbo Boost

intel_pstate

# echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo

acpi-cpufreq

  1. echo 0 > /sys/devices/system/cpu/cpufreq/boost

x86_energy_perf_policy

Com x86_energy_perf_policy:

# x86_energy_perf_policy --turbo-enable 0

Escalonando reguladores

Os reguladores (veja a tabela abaixo) são esquemas de energia para a CPU. Apenas um pode estar ativo de cada vez. Para detalhes, veja a documentação do kernel.

Regulador Descrição
performance Executa a CPU na frequência máxima.
powersave Executa a CPU na frequência mínima.
userspace Execute a CPU nas frequências especificadas pelo usuário.
ondemand Escalona a frequência dinamicamente conforme a carga atual. Pula para a frequência mais alta e então volta conforme o tempo de ociosidade aumenta.
conservative Escalona a frequência dinamicamente conforme a carga atual. Escalona a frequência de forma mais gradual que o "ondemand".
schedutil Seleção de frequência da CPU controlada pelo agendador [2], [3].

Dependendo do driver de escalonamento, um dos reguladores serão carregados por padrão:

  • ondemand para CPUs AMD e Intel mais antigos.
  • powersave para CPUs Intel mais novas usando o driver intel_pstate (Sandy Bridge e mais novas).
Nota: O driver intel_pstate possui suporte apenas aos reguladores de desempenho e de economia de energia, mas ambos fornecem escalonamento dinâmico. O regulador de desempenho deve oferecer melhor funcionalidade de economia de energia do que o antigo controlador "ondemand".
Atenção: Use as ferramentas de monitoramento da CPU (para temperaturas, voltagens, etc.) ao alterar o regulador padrão.

Para ativar um regulador em particular, execute:

# cpupower frequency-set -g regulador
Nota:
  • Para ajustar apenas para um único core de CPU, acrescente -c número_do_core ao comando acima.
  • A ativação de um regulador requer que um módulo de kernel específico (chamado cpufreq_regulador) esteja carregado. Desde o kernel 3.4, esses módulos são carregados automaticamente.

Alternativamente, você pode ativar um regulador a cada CPU disponível manualmente com:

# echo regulador > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

sendo regulador o nome do regulador, relacionado na tabela acima, que você deseja ativar.

Dica: Para monitorar a velocidade de CPU em tempo real, execute:
$ watch grep \"cpu MHz\" /proc/cpuinfo

Ajustando o regulador ondemand

Veja a documentação do kernel para detalhes.

Trocando o limite

Para definir o limite (threshold) para avançar para outra frequência:

# echo -n percentagem > /sys/devices/system/cpu/cpufreq/<regulador>/up_threshold

Para definir o limite para retroceder para outra frequência:

# echo -n percentagem > /sys/devices/system/cpu/cpufreq/<regulador>/down_threshold

Taxa de amostragem

A taxa de amostragem determina com que frequência o controlador verifica a sintonia da CPU. sampling_down_factor é um ajuste que multiplica a taxa de amostragem quando a CPU está com a frequência de clock mais alta, atrasando a avaliação da carga e melhorando o desempenho. Os valores permitidos para sampling_down_factor são de 1 a 100.000. Esse ajuste não tem efeito sobre o comportamento em frequências/cargas de CPU mais baixas.

Para ler o valor (padrão = 1), execute:

$ cat /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor

Para definir o valor, execute:

# echo -n valor > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor

Tornar as alterações permanentes

Para que o escalonamento desejado seja habilitado na inicialização, opções de módulo do kernel e systemd (Português)#systemd-tmpfiles - arquivos temporários são métodos regulares.

Por exemplo, alterar o up_threshold para 10:

/etc/tmpfiles.d/ondemand.conf
w- /sys/devices/system/cpu/cpufreq/ondemand/up_threshold - - - - 10

No entanto, em alguns casos, pode haver condições de corrida, conforme observado em systemd (Português#systemd-tmpfiles - arquivos temporários, podem existir e é possível usar o udev para evitá-los.

Por exemplo, para configurar o controlador de escala do núcleo da CPU 0 para desempenho enquanto o driver de escala for acpi_cpufreq, crie a seguinte regra de udev:

/etc/udev/rules.d/50-scaling-governor.rules
SUBSYSTEM=="module", ACTION=="add", KERNEL=="acpi_cpufreq", RUN+="/bin/sh -c 'echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor'"

Para ter a regra já aplicada no initramfs, siga o exemplo em udev#Debug output.

Dica: Alternativamente, configure o utilitário cpupower e habilite seu serviço de systemd.

Interação com eventos da ACPI

Os usuários podem configurar os reguladores de escala para alternar automaticamente com base em diferentes eventos ACPI, como conectar o adaptador AC ou fechar uma tampa do laptop. Um exemplo rápido é dado abaixo, no entanto, pode valer a pena ler o artigo completo sobre acpid.

Eventos são definidos em /etc/acpi/handler.sh. Se o pacote acpid estiver instalado, o arquivo já deverá existir e ser executável. Por exemplo, para alterar o regulador de escala de performance para conservative quando o adaptador de CA for desconectado e alterá-lo de volta, se reconectar:

/etc/acpi/handler.sh
[...]

ac_adapter)
    case "$2" in
        AC*)
            case "$4" in
                00000000)
                    echo "conservative" >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
                    echo -n $minspeed >$setspeed
                    #/etc/laptop-mode/laptop-mode start
                ;;
                00000001)
                    echo "performance" >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
                    echo -n $maxspeed >$setspeed
                    #/etc/laptop-mode/laptop-mode stop
                ;;
            esac
        ;;
        *) logger "ACPI action undefined: $2" ;;
    esac
;;

[...]

Concessão de privilégios no GNOME

Nota: systemd introduziu o logind que lida com ações consolekit e policykit. O código a seguir não funciona. Com logind, basta editar no arquivo /usr/share/polkit-1/actions/org.gnome.cpufreqselector.policy os elementos <defaults> conforme a suas necessidades e o manual do polkit [4].

GNOME tem um miniaplicativo legal para mudar o regulador na hora. Para usá-lo sem a necessidade de inserir a senha de root, basta criar o seguinte arquivo:

/var/lib/polkit-1/localauthority/50-local.d/org.gnome.cpufreqselector.pkla
[org.gnome.cpufreqselector]
Identity=unix-user:usuário
Action=org.gnome.cpufreqselector
ResultAny=no
ResultInactive=no
ResultActive=yes

sendo usuário o nome de usuário interessado.

O pacote desktop-privilegesAUR no AUR contém um arquivo .pkla para autorizar todos os usuários do grupo de usuários power para alterar o regulador.

Solução de problemas

  • Alguns aplicativos, como ntop, não respondem bem ao escalonamento automático de frequência. No caso de ntop, isso pode resultar em falhas de segmentação e muitas informações perdidas, pois mesmo o regulador on-demand não pode alterar a frequência com rapidez suficiente quando muitos pacotes chegam de repente à interface de rede monitorada que não pode ser manipulado pela velocidade atual do processador.
  • Algumas CPUs podem sofrer um desempenho ruim com as configurações padrão do regulador on-demand (por exemplo, vídeos em flash que não reproduzem suavemente ou animações instáveis de janelas). Em vez de desativar completamente o escalonamento de frequência para resolver esses problemas, a agressividade do escalonamento de frequência pode ser aumentada diminuindo a variável up_threshold do sysctl para cada CPU. Veja como alterar o limite do regulador sob demanda.
  • Às vezes, o regulador sob demanda pode não acelerar até a frequência máxima, mas um passo abaixo. Isto pode ser resolvido ajustando o valor de max_freq para ligeiramente mais alto que o máximo real. Por exemplo, se a faixa de frequência da CPU for de 2,00 GHz a 3,00 GHz, configurar max_freq para 3,01 GHz pode ser uma boa ideia.
  • Algumas combinações de drivers e chips de som ALSA podem causar saltos de áudio enquanto o regulador muda entre as frequências, e a mudança de volta para um regulador que não muda muda a parada do áudio.

Limitação de frequências da BIOS

Algumas configurações de CPU/BIOS podem ter dificuldades para escalar até a frequência máxima ou escalar para frequências mais altas. Isso é provavelmente causado por eventos do BIOS dizendo ao sistema operacional para limitar a frequência resultando em /sys/devices/system/cpu/cpu0/cpufreq/bios_limit definido como um valor mais baixo.

Ou você acabou de fazer uma configuração específica no utilitário de configuração da BIOS (frequência, gerenciamento térmico, etc.), você pode culpar uma BIOS com bugs/desatualizada ou a BIOS pode ter uma razão séria para limitar a CPU por conta própria.

Razões como essa podem ser (supondo que sua máquina seja um notebook) que a bateria está desconectada (ou quase no fim da vida útil), então você está apenas em energia da fonte de alimentação. Neste caso, uma fonte de alimentação fraca pode não fornecer eletricidade suficiente para atender às demandas de pico extremo pelo sistema geral e, como não há bateria para ajudar, isso pode levar à perda de dados, corrupção de dados ou, no pior dos casos, até mesmo danos ao hardware!

Nem todos as BIOS limitam a frequência da CPU neste caso, mas, por exemplo, a maioria dos thinkpads IBM/Lenovo. Consulte thinkwiki para obter mais informações relacionadas a thinkpad sobre este tópico.

Se você verificou que não há apenas uma configuração estranha do BIOS e sabe o que está fazendo, pode fazer com que o Kernel ignore essas limitações do BIOS.

Atenção: Certifique-se de ler e entender a seção acima. A limitação de frequência da CPU é um recurso de segurança da sua BIOS e você não deve precisar contorná-la.

Um parâmetro especial deve ser passado para o módulo do processador.

Para tentar isso temporariamente, alerte o valor em /sys/module/processor/parameters/ignore_ppc de 0 para 1.

Para definir permanentemente, Módulos de kernel#Opções de configuração de módulos descreve alternativas. Por exemplo, você pode adicionar processor.ignore_ppc=1 à sua linha de inicialização de kernel ou crie

/etc/modprobe.d/ignore_ppc.conf
# Se a frequência de sua máquina for limitada de forma errada pela BIOS, isso deve ajudar
options processor ignore_ppc=1

Veja também