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

8

Estoy usando una máquina Debian 8 amd64 para la evaluación comparativa. Durante la experimentación, me gustaría que la CPU funcione a una frecuencia fija (preferiblemente la máxima posible). Esto descartará la velocidad del reloj de la CPU como una 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 describe aquí en la documentación del kernel de Linux :

El "rendimiento" del gobernador CPUfreq establece la CPU estáticamente en 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_freqno. Esperemos que no importe, ya que la frecuencia de CPU utilizada es el valor máximo del intervalo.

Así que habilité este gobernador usando cpufreq-set:

$ cat / 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:

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

Según la descripción anterior del regulador de rendimiento, no esperaría fluctuaciones 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 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 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 3.98 GHz.

¿Es esta fluctuación debido al hardware, el BIOS, el núcleo o algún otro factor? ¿Hay alguna manera de configurar la frecuencia de la CPU de modo que no fluctúe en absoluto?

Edd Barrett
fuente
¿Qué tipo de hardware de servidor estás usando? ¿Cuáles son las configuraciones de potencia de BIOS y rendimiento de CPU de ese hardware?
ewwhite
En realidad es una máquina de escritorio con una CPU i7. He subido dmesg y cpuinfo aquí: gist.github.com/vext01/73eea539eb041acf784b . Re: configuración de BIOS, necesitaría ir a la máquina y mirar. ¿Hay alguna configuración específica que tenga en mente?
Edd Barrett
Eso no es "mucha" fluctuación en comparación con la variación normal del estado ... :)
rogerdpack

Respuestas:

9

Después de experimentar un poco, creo que puedo responder mi propia pregunta.

Como se menciona en este hilo , en cierto hardware Intel, hay dos formas de administrar la frecuencia de la CPU:

  • Usando pstate.
  • Usando ACPI regular.

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=disablea los argumentos del núcleo (edite /etc/default/gruby agregue el argumento a GRUB_CMDLINE_LINUX_DEFAULT. Finalmente ejecute sudo update-grub).

Después de hacer esto, la salida de se cpufreq-infove muy diferente, y también noto que un conjunto diferente de gobernadores de CPU está disponible (por ejemplo, ondemandahora está disponible).

Lo más importante, después de configurar el gobernador en performance, la velocidad del reloj ahora está fija (en mi caso a 4.00GHz).

Puede mirar /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.

Edd Barrett
fuente
Otro truco: use ´lsmod´ para enumerar los módulos cargados por el núcleo, haga una lista negra de cada módulo relacionado con el escalado de velocidad de la CPU / p-state / c-states / whatever y reinicie la máquina. Buscar "módulos del núcleo de la lista negra".
Rufo El Magufo
4

Para los procesadores Intel contemporáneos, la frecuencia es 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 una sola frecuencia es una ficción para los procesadores Intel Core . Incluso si el controlador de escala selecciona un solo estado P, la frecuencia real a la que se ejecutará el procesador es seleccionada por el propio procesador. [1]

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

SaveTheRbtz
fuente
Interesante. Entonces, ¿esto todavía se aplica cuando paso intel_pstate=disableal kernel? ¿Estoy invocando el "modo heredado" cuando hago eso?
Edd Barrett
1) no estoy seguro Necesito consultar con Intel Architectures Software Developer's Manual.2) sí. PD. También es posible que desee jugar conx86_energy_perf_policy
SaveTheRbtz
Gracias por tus comentarios. Como todavía no estoy seguro, dejo la pregunta abierta por ahora. Tal vez alguien arroje luz sobre la situación más tarde.
Edd Barrett
-1

Leí este hilo porque también estaba buscando configurar 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 que establecer la frecuencia más baja (800Mhz) ... finalmente logré cambiar el 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 se moverá desde 800Mhz a .... 800Mhz. Funciona y resolvió el problema de sobrecalentamiento que he tenido ... (¡la frecuencia ahora es de 799Mhz y no se mueve, lo que permitió que la CPU permaneciera alrededor de 50 ° C!)

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

steve.29
fuente