46 votes

Comment régler le régulateur d'échelle de fréquence du processeur pour tous les cœurs à la fois ?

J'aimerais régler le régulateur d'échelle de fréquence du CPU pour tous les cœurs en même temps au lieu de le faire individuellement pour chaque cœur. Existe-t-il un moyen de le faire ?

(Je sais qu'il serait facile de se faire l'écho du gouverneur pour /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor mais je ne cherche pas de solution personnalisée).

2voto

Roiikka Points 46

La façon dont j'ai configuré cela pour rester en place depuis que le gouverneur revient par défaut à powersave après environ 30 secondes à partir d'Ubuntu 16.04 ou plus récent (je suis sur Ubuntu Mate) ;

  1. Mettez cette (une ligne de) code (merci, gracieuseté de switch87 dans la réponse précédente)

    sleep 60 && bash -c 'for i in {0..7}; do cpufreq-set -c $i -g performance; done'
  2. dans le fichier du répertoire

    /etc/rc.local

La mienne est une ligne au-dessus de "exit 0" et non commentée, sous les lignes commentées.

"rc.local" pour ceux qui ne connaissent pas, il exécute la commande en tant que sudo. Toute commande visant à modifier le gouverneur doit être exécutée en tant que sudo.

Il laisse le gouverneur revenir à powersave et exécute le code en tant que sudo après 60 secondes pour revenir à la performance.

Remplacez "60" (dans le code que vous copiez) par le temps (en secondes. 60 = 60 secondes= 1 minute) dont vous avez besoin pour retarder la commande et "performance" (dans la partie commande) par le gouverneur auquel vous voulez qu'il passe.

Après des heures et des heures de recherche, je n'ai pas trouvé de solution plus permanente que celle-ci. Je me suis dit que ce n'était pas la peine de passer quelques minutes en mode veille si c'était la meilleure solution que j'avais trouvée, n'est-ce pas ? C'est vrai.

Ce n'est pas la meilleure solution, mais elle rend la situation quelque peu permanente après qu'il ait fait son petit truc pour passer en mode "économie d'énergie". Si vous voulez démarrer directement et vous lancer dans un jeu ou autre, vous allez devoir attendre une minute pour que le code que vous venez de mettre en place le ramène de powersave ou réduise le timing (en fonction du temps qu'il faut pour que tout démarre et qu'il revienne à la performance correctement).

Et, comme toujours, pour revenir à la configuration par défaut (j'ai vu des problèmes de surchauffe sur des PC, c'est pourquoi ils ont peut-être mis powersave par défaut), il suffit de supprimer le code de rc.local et de redémarrer ou de revenir manuellement à la configuration par défaut à l'aide de l'indicateur de l'icône du processeur ou de run ;

 sudo /etc/init.d/cpufrequtils restart

dans le terminal et ou redémarrer.

1voto

side2k Points 111

En me basant sur la réponse de switch87, j'ai créé un simple script. cpufreq-set-all qui permettra de faire d'autres cpufreq-set avec tous les processeurs :

   #!/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

Il peut maintenant être invoqué (après chmod +x bien sûr) comme ceci :

cpufreq-set-all -g powersave

ou

cpufreq-set-all -f 800Mhz

0voto

jsaddwater Points 111

Parfois, il ne suffit pas de fixer le gouverneur. J'ai également dû régler les variables MAX et MIN pour la fréquence, car les politiques de mise à l'échelle les avaient réglées sur le minimum. 1. Obtenir les fréquences min et max de mise à l'échelle du CPU 0 2. Les diviser par un million pour obtenir la fréquence en GHz 3. Faire passer le résultat par bc pour obtenir le résultat en virgule flottante (BASH ne peut traiter que les entiers) - scale=1 est le nombre de décimales 4. Vérifier si un gouverneur d'échelle est fourni sur la ligne de commande 5. Si ce n'est pas le cas, mettre ONDEMAND - économiser de l'argent au ralenti 6. Exécuter la commande cpufreq-set en boucle sur tous les processeurs.

#!/bin/bash
echo "Setting all CPUs to " "$@"
CPUINFO_MIN_FREQ=$(cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq)
CPUINFO_MAX_FREQ=$(cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq)
MIN=$(echo "scale=1; $CPUINFO_MIN_FREQ / 1000000" | bc)"G"
MAX=$(echo "scale=1; $CPUINFO_MAX_FREQ / 1000000" | bc)"G"

echo "Minimum frequency: " $MIN ", Maximum frequency: " $MAX

GOVERNOR=@0
if [ $# -eq 0 ]
    then
        echo "No arguments supplied, using ONDEMAND governor"
        GOVERNOR="ondemand"
    else
        echo "Governor " $1 " supplied"
        GOVERNOR=$1
fi

for ((i=0;i<$(nproc);i++));
    do cpufreq-set -c $i -r -g $GOVERNOR  --min $MIN --max $MAX;
done

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X