Linux: ¿Por qué fluctúa la frecuencia de la CPU cuando se utiliza el regulador de rendimiento?

Linux: ¿Por qué fluctúa la frecuencia de la CPU cuando se utiliza el regulador de rendimiento?

Estoy usando una máquina Debian 8 AMD64 para realizar evaluaciones comparativas. Durante la experimentación, me gustaría que la CPU funcionara a una frecuencia fija (preferiblemente la máxima posible). Esto descartará la velocidad del reloj de la CPU como fuente de variación en los resultados.

Después de leer un poco, parece que lo correcto es cambiar el regulador de la CPU a performance, que se describeaquí en la documentación del kernel de Linux:

El "rendimiento" del gobernador CPUfreq establece la CPU estáticamente a la frecuencia más alta dentro de los límites de scaling_min_freq y scaling_max_freq.

Lamentablemente, no se proporcionan más detalles sobre scaling_min_freqy . scaling_max_freqCon suerte, no debería importar, ya que la frecuencia de la CPU utilizada es el valor máximo del intervalo.

Entonces habilité este gobernador usando cpufreq-set:

$ gato /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
actuación
actuación
actuación
actuación

Y por si acaso, también desactivé el modo turbo boost en la BIOS:

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

Según la descripción anterior del regulador de rendimiento, no esperaría ninguna fluctuación en la velocidad del reloj de la CPU. Sin embargo, si corro repetidamente cpufreq-info, veo que la velocidad del reloj fluctúa:

$ cpufreq-info | grep 'CPU actual fr'
  La frecuencia actual de la CPU es de 4,00 GHz.
  La frecuencia actual de la CPU es de 3,99 GHz.
  La frecuencia actual de la CPU es de 4,00 GHz.
  La frecuencia actual de la CPU es de 4,00 GHz.
$ cpufreq-info | grep 'CPU actual fr'
  La frecuencia actual de la CPU es de 4,00 GHz.
  La frecuencia actual de la CPU es de 4,00 GHz.
  La frecuencia actual de la CPU es de 4,00 GHz.
  La frecuencia actual de la CPU es de 3,96 GHz.
$ cpufreq-info | grep 'CPU actual fr'
  La frecuencia actual de la CPU es de 4,00 GHz.
  La frecuencia actual de la CPU es de 4,00 GHz.
  La frecuencia actual de la CPU es de 4,00 GHz.
  La frecuencia actual de la CPU es de 3,94 GHz.
$ cpufreq-info | grep 'CPU actual fr'
  La frecuencia actual de la CPU es de 4,01 GHz.
  La frecuencia actual de la CPU es de 4,00 GHz.
  La frecuencia actual de la CPU es de 4,00 GHz.
  La frecuencia actual de la CPU es de 3,98 GHz.

¿Esta fluctuación se debe al hardware, el BIOS, el kernel o algún otro factor? ¿Hay alguna manera de configurar la frecuencia de la CPU de manera que no fluctúe en absoluto?

Respuesta1

Después de un poco de experimentación, creo que puedo responder mi propia pregunta.

Como se mencionóen este hilo, en determinado hardware Intel, hay dos formas de administrar la frecuencia de la CPU:

  • Usando pstate.
  • Utilizando ACPI normal.

Cuando se usa pstate, el BIOS tiene algo que decir sobre la velocidad del reloj y parece que esta es la fuente de las fluctuaciones.

Puede forzar la desactivación de pstate agregando intel_pstate=disablelos argumentos del kernel (edite /etc/default/gruby agregue el argumento a GRUB_CMDLINE_LINUX_DEFAULT. Finalmente ejecute sudo update-grub).

Después de hacer esto, el resultado de cpufreq-infose ve muy diferente y también noto que un conjunto diferente de reguladores de CPU está disponible (por ejemplo, ondemandahora está disponible).

Lo más importante es que después de configurar el regulador en performance, la velocidad del reloj ahora está fija (en mi caso en 4,00 GHz).

Puede consultar /sys/devices/system/cpu/cpu*/cpufreq/scaling_driverpara determinar si se está utilizando pstate o ACPI para escalar la CPU. Estos archivos pueden asumir los valores acpi-cpufreqo intel_pstate.

Respuesta2

Para los procesadores Intel contemporáneos, la frecuencia está controlada por el propio procesador y los estados P expuestos al software están relacionados con los niveles de rendimiento. La idea de que la frecuencia se puede establecer en un solo La frecuencia es ficción para los procesadores Intel Core.. Incluso si el controlador de escala selecciona un único estado P, la frecuencia real a la que funcionará el procesador la selecciona el propio procesador. [1]

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

Respuesta3

Leí este hilo porque también estaba buscando establecer una frecuencia fija para mi CPU ya que el ventilador ya no funciona (¡por supuesto, esas cosas suceden cuando estás en el extranjero en una isla perdida para bucear!), así que mi punto era más establecer la frecuencia más baja (800 Mhz) ... finalmente logré hacer cambios en scaling_max_freq en /sys/devices/system/cpu/cpu*/cpufreq/ para cada cpu de la configuración y ahora está bien, se supone que la frecuencia debe pasar de 800 Mhz a....800Mhz. Funciona y resolvió el problema de sobrecalentamiento que he tenido... (¡la frecuencia ahora es de 799 Mhz y no se mueve, lo que permitió que la CPU permaneciera alrededor de 50 °C!)

PD: también desactivo el modo turbo (3,1Ghz)

información relacionada