¿Cómo configuro el regulador de escala de frecuencia de la CPU para todos los núcleos a la vez?

38

Me gustaría configurar el regulador de escala de frecuencia de la CPU para todos los núcleos a la vez en lugar de hacerlo individualmente para cada núcleo. ¿Hay alguna forma de hacer esto?

(Sé que sería fácil hacerle eco al gobernador /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor, pero no estoy buscando una solución personalizada).

htorque
fuente
2
Con "solución personalizada" quiere decir que un script de shell es inaceptable, ¿debe ser un botón GUI incorporado?
jg-faustus
Me pregunto si ya existe una solución en una instalación estándar (no necesita tener una GUI).
htorque
Consulte esta página: idebian.wordpress.com/2008/06/22/cpu-frequency-scaling-in-linux en "implementación de debian": aparentemente es posible cambiar el valor predeterminado de arranque, y hay una herramienta de espacio de usuario llamada powernowd. (Este es un comentario en lugar de respuesta debido a que el mensaje es de 2008, y no he probado si todavía funciona ...)
JG-Fausto

Respuestas:

26

Todavía soy un novato de Linux, pero ¿no crees que cpufrequtils te permite hacerlo usando (no está incluido en el sistema operativo Ubuntu pero está allí en el repositorio)

sudo apt-get install cpufrequtils
sudo cpufreq-set -r -g performance
  • El -rindicador se usa para establecer el cambio para todos los núcleos ("todos relacionados con el hardware")
usuario49449
fuente
66
La opción relacionada con -r no lo hace para todos los núcleos. Tenemos que especificar el número de CPU con la opción -c <número> sin embargo, este script lo hará para todos los cpus de una vez: for ((i = 0; i <$ (nproc); i ++)); hacer cpufreq-set -c $ i -r -g rendimiento; hecho
Sri
66
Exactamente, @Sri tiene razón. cpufreq-setde hecho carece de una funcionalidad en última instancia simple pero necesaria. Muchas personas, como muestra claramente este contador de votos, simplemente no lo saben porque su descripción es simplemente engañosa para colmo.
poige
2
¿Quién da estos +1 sin probar? Esto no funciona en absoluto. Publiqué la solución de trabajo más simple que pude encontrar.
switch87
20

Busqué en Google mucho y creo que simplemente no es posible, así que agregué la siguiente línea a mi .bashrc:

function setgov ()
{
    echo "$1" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 
}

Ahora puedo ejecutar algo así setgov ondemandy todos los núcleos cambiarán al gobernador bajo demanda .

htorque
fuente
2
Esto no funciona ya que el archivo scaling_governor es propiedad de root y tiene permisos restringidos. No siempre se recomienda cambiar los permisos.
Sri
Consulte la secuencia de comandos alternativa en mi comentario a la respuesta del usuario 49449.
Sri
6

El comando más corto para cambiar el gobernador de todos los núcleos es el siguiente:

sudo bash -c 'for i in {0..7}; do cpufreq-set -c $i -g performance; done'

Puede agregarlo a .bashrc como se mencionó htorque, tendrá que ejecutarlo como root sudo setgov performance:

function setgov ()
{
     for i in {0..7}; 
     do 
         cpufreq-set -c $i -g $1; 
     done
}
switch87
fuente
2

También podría agregar la finalización del código bash, mientras estamos en eso:

function setgovernor () {
    echo "$1" | sudo tee 
    /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 
}
complete -W "$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors)" setgovernor
Ray Malanga
fuente
2

La forma en que configuré esto para que se mantenga, ya que el gobernador vuelve por defecto a ahorro de energía después de aproximadamente 30 segundos a partir de Ubuntu 16.04 o más reciente (estoy en Ubuntu Mate);

  1. Ponga este (una línea de) código (gracias, cortesía de switch87 en la respuesta anterior)

    sleep 60 && bash -c 'for i in {0..7}; do cpufreq-set -c $i -g performance; done'
    
  2. en el archivo en el directorio

    /etc/rc.local
    

La mía es una línea sobre "salida 0" y sin comentarios, debajo de los comentados.

"rc.local" para aquellos que no saben, ejecuta el comando como sudo. Cualquier comando que parezca, para cambiar el gobernador, debe ejecutarse como sudo.

Permite que el gobernador vuelva a restablecer el ahorro de energía y ejecuta el código como sudo después de 60 segundos para volver a cambiarlo al rendimiento.

Cambie el "60" (en el código que copia) a cualquier tiempo (en segundos. 60 = 60 segundos = 1 minuto) que necesita para retrasar el comando y el "rendimiento" (en la parte del comando) a qué gobernador desea cambiar a.

Fuera de mis horas y horas de búsqueda, no he encontrado una solución más permanente para esto que esto. Me imagino que son unos minutos que está en PowerSave si esta es la mejor solución que he encontrado, ¿verdad? Correcto.

No es la mejor solución, pero lo hace algo permanente después de hacerlo, es un pequeño cambio a la cosa de ahorro de energía. Si quieres arrancar y saltar a un juego o algo así, tendrás que esperar un minuto por el código que acabas de poner para volver a activar el ahorro de energía o reducir el tiempo (dependiendo del tiempo que tarde todo para iniciar para que vuelva al rendimiento correctamente).

Y, como siempre, para volver a los valores predeterminados (he visto algunos problemas con el sobrecalentamiento de las PC de las personas, por lo que podrían haberlo omitido en PowerSave en primer lugar) simplemente elimine el código de rc.local y reinicie o vuelva a encenderlo manualmente con su conmutador indicador de icono de CPU o ejecutar;

 sudo /etc/init.d/cpufrequtils restart

en la terminal y / o reiniciar.

Roiikka
fuente
1

Puede hacer esto para todos los núcleos a la vez ejecutando

sudo cpupower frequency-set --governor performance
Martin Andersson
fuente
0

Basándome en la respuesta de switch87, hice un script simple cpufreq-set-all, que permitirá hacer otras cpufreq-setcosas con todas las CPU:

   #!/bin/bash
   MAX_CPU=$((`nproc --all` - 1))
   for i in $(seq 0 $MAX_CPU); do
       echo "Changing CPU " $i " with parameter "$@;
       cpufreq-set -c $i $@ ;
   done

Ahora se puede invocar (después chmod +x, por supuesto) así:

cpufreq-set-all -g powersave

o

cpufreq-set-all -f 800Mhz
lado2k
fuente