Linux: Por que a frequência da CPU flutua ao usar o regulador de desempenho?

8

Estou usando uma máquina Debian 8 amd64 para benchmarking. Durante a experimentação, eu gostaria que a CPU operasse em uma frequência fixa (de preferência o máximo possível). Isso descartará a velocidade do clock da CPU como fonte de variação nos resultados.

Após algumas leituras, parece que a coisa certa a fazer é mudar o controlador da CPU para performance, descrito aqui na documentação do kernel do Linux :

O "desempenho" do controlador CPUfreq define estaticamente a CPU com a frequência mais alta dentro dos limites de scaling_min_freq e scaling_max_freq.

Infelizmente, mais detalhes sobre scaling_min_freqe scaling_max_freqnão são fornecidos. Espero que isso não importe, pois a frequência da CPU usada é o valor máximo do intervalo.

Então, eu habilitei esse governador usando o cpufreq-set:

$ cat / sys / devices / system / cpu / cpu * / cpufreq / scaling_governor
desempenho
desempenho
desempenho
desempenho

E, para uma boa medida, também desabilitei o modo turbo boost na bios:

$ cat / sys / devices / system / cpu / intel_pstate / no_turbo
1

Com base na descrição acima do regulador de desempenho, eu não esperaria flutuação na velocidade do clock da CPU. No entanto, se eu correr repetidamente cpufreq-info, vejo a velocidade do relógio flutuando:

$ cpufreq-info | grep 'CPU atual fr'
  A frequência atual da CPU é de 4,00 GHz.
  A frequência atual da CPU é de 3,99 GHz.
  A frequência atual da CPU é de 4,00 GHz.
  A frequência atual da CPU é de 4,00 GHz.
$ cpufreq-info | grep 'CPU atual fr'
  A frequência atual da CPU é de 4,00 GHz.
  A frequência atual da CPU é de 4,00 GHz.
  A frequência atual da CPU é de 4,00 GHz.
  A frequência atual da CPU é de 3,96 GHz.
$ cpufreq-info | grep 'CPU atual fr'
  A frequência atual da CPU é de 4,00 GHz.
  A frequência atual da CPU é de 4,00 GHz.
  A frequência atual da CPU é de 4,00 GHz.
  A frequência atual da CPU é de 3,94 GHz.
$ cpufreq-info | grep 'CPU atual fr'
  A frequência atual da CPU é de 4,01 GHz.
  A frequência atual da CPU é de 4,00 GHz.
  A frequência atual da CPU é de 4,00 GHz.
  A frequência atual da CPU é de 3,98 GHz.

Essa flutuação é devida a hardware, BIOS, kernel ou algum outro fator? Existe uma maneira de definir a frequência da CPU para que ela não flutue?

Edd Barrett
fonte
Que tipo de hardware de servidor você está usando? Quais são as configurações de desempenho da CPU e de energia do BIOS desse hardware?
ewwhite
Na verdade, é uma máquina de desktop com uma CPU i7. Fiz upload do dmesg e do cpuinfo aqui: gist.github.com/vext01/73eea539eb041acf784b . Re: configurações do BIOS, eu precisaria ir para a máquina e olhar. Você tem em mente alguma configuração específica?
Edd Barrett
Isso não é "muita" flutuação em comparação com a variação pstate normal ... :)
rogerdpack 25/01

Respostas:

9

Depois de algumas experiências, acho que posso responder minha própria pergunta.

Conforme mencionado neste tópico , em certos hardwares da Intel, existem duas maneiras de gerenciar a frequência da CPU:

  • Usando pstate.
  • Usando ACPI regular.

Quando o pstate é usado, o BIOS tem alguma influência sobre a velocidade do relógio, e parece que essa é a fonte das flutuações.

Você pode forçar o pstate desligando intel_pstate=disableos argumentos do kernel (edite /etc/default/grube adicione o argumento em GRUB_CMDLINE_LINUX_DEFAULT. Finalmente, execute sudo update-grub).

Depois de fazer isso, a saída de cpufreq-infoparece muito diferente, e também noto que um conjunto diferente de governadores de CPU fica disponível (por exemplo, ondemandagora está disponível).

Mais importante ainda, depois de definir o governador como performance, a velocidade do relógio agora é fixa (no meu caso, para 4,00 GHz).

Você pode verificar /sys/devices/system/cpu/cpu*/cpufreq/scaling_driverse pstate ou ACPI está sendo usado para dimensionar a CPU. Esses arquivos podem assumir os valores acpi-cpufreqou intel_pstate.

Edd Barrett
fonte
Outro truque: use o ´lsmod´ para listar os módulos carregados pelo kernel, na lista negra de todos os módulos relacionados ao escalonamento da velocidade da CPU / p-state / c-states / qualquer outra coisa e reinicie a máquina. Pesquise "módulos do kernel da lista negra".
Rufo El Magufo
4

Para os processadores Intel contemporâneos, a frequência é controlada pelo próprio processador e os estados P expostos ao software estão relacionados aos níveis de desempenho. A ideia de que a frequência pode ser configurada para uma única frequência é ficção para os processadores Intel Core . Mesmo que o driver de escala selecione um único estado P, a frequência real na qual o processador será executado é selecionada pelo próprio processador. [1]

[1] https://www.kernel.org/doc/Documentation/cpu-freq/intel-pstate.txt

SaveTheRbtz
fonte
Interessante. Então, isso ainda se aplica quando eu passo intel_pstate=disablepara o kernel? Estou invocando o "modo legado" quando faço isso?
Edd Barrett
1) não tenho certeza. precisa consultar com Intel Architectures Software Developer's Manual.2) sim. PS. Você também pode querer jogar comx86_energy_perf_policy
SaveTheRbtz 3/15/15
Obrigado por seus comentários. Como ainda não tenho certeza, estou deixando a pergunta em aberto por enquanto. Talvez alguém possa esclarecer a situação mais tarde.
Edd Barrett
-1

Eu li esse tópico porque estava procurando definir uma frequência fixa para minha CPU, já que o ventilador não funciona mais (é claro que essas coisas acontecem quando você está no exterior em uma ilha perdida para lazer de mergulho!), então meu ponto era mais preciso a frequência mais baixa (800Mhz) .. finalmente consegui fazer alterações no scaling_max_freq em / sys / devices / system / cpu / cpu * / cpufreq / para cada cpu da configuração e agora está bom a frequência deve passar de 800Mhz para .... 800Mhz. Ele funciona e resolveu o problema de superaquecimento que tive experiência .. (a frequência agora é de 799Mhz e não se move, o que permitiu que a CPU permanecesse em torno de 50 ° C!)

PS: também desativo o modo turbo (3,1Ghz)

steve.29
fonte