Le pilotage en fréquence d'un processeur met en œuvre
un pilote, spécifique du processeur
un ou des régulateurs (governors en anglais) qui définissent des politiques de gestion de la fréquence, en fonction d'objectifs d'optimisation des performances ou de réduction de la consommation
Le pilote et le régulateur chargés par défaut pendant le démarrage du noyau offrent une solution prête à l'emploi, généralement immédiatement opérationnelle.
Il est néanmoins possible d'ajouter, de façon optionnelle, un gestionnaire de fréquence qui permet d'adapter le type et les paramètres des régulateurs aux circonstances d'utilisation (alimentation par batterie ou secteur, etc .....). Dans ce qui suit on décrit, pour cet usage, l'utilisation du gestionnaire de fréquence cpufreqd.
Le chargement du pilote "natif" est automatique pendant le démarrage du noyau.
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
intel_pstate
$ cpupower frequency-info -d
analyse du CPU 0 :
driver: intel_pstate
Selon les cas, le pilote est un module interne ou externe du noyau. Dans l'exemple ci-dessus, le pilote est intel_pstate qui est, à ce jour, un module interne du noyau et n'apparaît donc pas dans la liste des modules fournie par lsmod.
$ lsmod |grep intel_pstate
Sur les processeurs intel, le pilote par défaut est intel_pstate.
Voir https://wiki.archlinux.org/index.php/CPU_frequency_scaling
La politique de pilotage de la fréquence est définie par des régulateurs, par exemple performance, powersave, .... disponibles sous formes de modules (cpufreq_performance, cpufreq_powersave, ...). Pendant le chargement du noyau, le module du régulateur par défaut du pilote est chargé. Dans le cas du pilote intel_pstate, le régulateur par défaut est performance.
Pour obtenir la liste des régulateurs possibles, ici performance et powersave :
$ cpupower frequency-info -g
analyse du CPU 0 :
régulateurs disponibles : performance powersave
le régulateur effectivement utilisé, ici performance :
$ cpupower frequency-info -p
analyse du CPU 0 :
tactique actuelle : la fréquence doit être comprise entre 3.10 GHz et 3.10 GHz.
Le régulateur "performance" est libre de choisir la vitesse
dans cette plage de fréquences.
ou
$ cat /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
performance
les fréquences minima / maxima autorisées :
$ cpupower frequency-info -l
analyse du CPU 0 :
limitation matérielle : 800 MHz - 3.10 GHz
Pour des besoins de test, par exemple, il est possible de charger un autre régulateur que le régulateur par défaut et de modifier ses paramètres, tels que les fréquences mini et maxi des échelles.
Les modifications peuvent s'effectuer, soit directement dans les fichiers systèmes /sys/devices/system/cpu/.... , soit en utilisant cpupower.
A noter que, en l'absence d'un gestionnaire de fréquence tel que cpufreqd (voir plus loin),
Le chargement des modules des régulateurs autres que ceux des régulateurs par défaut, doit être effectué manuellement.
Les modifications ne seront pas mémorisées lors du prochain redémarrage
Utilisation du régulateur powersave à la place du régulateur par défaut performance et modification des fréquences mini et maxi
Charger le module du régulateur powersave
# modprobe cpufreq_powersave
Sélectionner avec cpupower le governor powersave (option -g) et définir les fréquences mini (option -d) et maxi (option -u) à 800 MHz :
# cpupower frequency-set -g powersave -d 800MHz -u 800MHz
Setting cpu: 0
Setting cpu: 1
Setting cpu: 2
Setting cpu: 3
Vérification de la modification
$ cpupower frequency-info -p
analyse du CPU 0 :
tactique actuelle : la fréquence doit être comprise entre 800 MHz et 800 MHz.
Le régulateur "powersave" est libre de choisir la vitesse
dans cette plage de fréquences.
Mode turbo : Par défaut le mode turbo est activé, pour le désactiver :
# echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
Limitation de la température du processeur par l'utilisation des états P-states, T-states et du module Intel power clamp : voir thermald
Les modes powersave et performance peuvent être utilisés pour économiser l'énergie lorsque le système fonctionne sur batterie et disposer de la pleine puissance lorsque le secteur est présent. Cette fonction peut-être réalisée à l'aide d'une règle udev
Vérifier que lorsque le secteur est absent, respectivement présent, le paramètre POWER_SUPPLY_ONLINE vaut respectivement 0 et 1 :
Secteur débranché :
$ udevadm info -p /sys/class/power_supply/AC0
P: /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/ACPI0003:00/power_supply/AC0
E: DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/ACPI0003:00/power_supply/AC0
E: POWER_SUPPLY_NAME=AC0
E: POWER_SUPPLY_ONLINE=0
E: SUBSYSTEM=power_supply
Secteur branché :
$ udevadm info -p /sys/class/power_supply/AC0
P: /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/ACPI0003:00/power_supply/AC0
E: DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/ACPI0003:00/power_supply/AC0
E: POWER_SUPPLY_NAME=AC0
E: POWER_SUPPLY_ONLINE=1
E: SUBSYSTEM=power_supply
Créer une règle udev du type :
$ cat /etc/udev/rules.d/80-governor.rules
# Choix de la politique de pilotage de la fréquence CPU
# si secteur absent, choix du governor powersave
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="0", RUN+="/usr/bin/cpupower frequency-set -g powersave -d 800MHz -u 800MHz"
# si secteur présent, choix du governor performance
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="1", RUN+="/usr/bin/cpupower frequency-set -g performance -d 1200MHz -u 3100MHz"
Faire prendre en compte la nouvelle règle :
# systemadm control --reload
Débrancher le secteur et vérifier que le mode de pilotage est powersave :
# cpupower frequency-info
analyse du CPU 0 :
driver: intel_pstate
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: Cannot determine or is not supported.
limitation matérielle : 800 MHz - 3.10 GHz
régulateurs disponibles : performance powersave
tactique actuelle : la fréquence doit être comprise entre 800 MHz et 800 MHz.
Le régulateur "powersave" est libre de choisir la vitesse
dans cette plage de fréquences.
current CPU frequency: 800 MHz (asserted by call to hardware)
boost state support:
Supported: yes
Active: yes
2900 MHz max turbo 4 active cores
2900 MHz max turbo 3 active cores
2900 MHz max turbo 2 active cores
3100 MHz max turbo 1 active cores
Rebrancher le secteur et vérifier que le mode de pilotage est performance :
# cpupower frequency-info
analyse du CPU 0 :
driver: intel_pstate
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: Cannot determine or is not supported.
limitation matérielle : 800 MHz - 3.10 GHz
régulateurs disponibles : performance powersave
tactique actuelle : la fréquence doit être comprise entre 1.20 GHz et 3.10 GHz.
Le régulateur "performance" est libre de choisir la vitesse
dans cette plage de fréquences.
current CPU frequency: 1.83 GHz (asserted by call to hardware)
boost state support:
Supported: yes
Active: yes
2900 MHz max turbo 4 active cores
2900 MHz max turbo 3 active cores
2900 MHz max turbo 2 active cores
3100 MHz max turbo 1 active cores
Le gestionnaire de fréquence cpufreqd (à ne pas confondre avec cpufrequtils déprécié et remplacé par linux-cpupower) permet de définir des politiques de pilotage plus complexes que celles décrites ci-dessus, selon des évènements tels que présence secteur ou batterie, niveau de la batterie, température processeur, etc...
La configuration est définie dans un fichier cpufred.conf.
Installer, s'il n'est pas déjà présent, cpufreqd, à partir du paquet homonyme :
# aptitude install cpufreqd
Le démon est immédiatement démarré et met en œuvre la stratégie définie dans le fichier cpufreqd.conf. (Un redémarrage peut être nécessaire pour obtenir le chargement automatique des modules des régulateurs ?)
$ systemctl status cpufreqd.service
● cpufreqd.service - LSB: start and stop cpufreqd
Loaded: loaded (/etc/init.d/cpufreqd)
Active: active (running) since lun. 2016-08-29 01:55:39 CEST; 42min ago
Process: 632 ExecStart=/etc/init.d/cpufreqd start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/cpufreqd.service
└─697 /usr/sbin/cpufreqd -f /etc/cpufreqd.conf
Le fichier de configuration /etc/cpufred.conf est un fichier personnalisable permettant de définir :
des profils caractérisés par une politique de pilotage de fréquence (régulateur), des fréquences mini et maxi
Lors de l'exécution, chaque règle est évaluée et, dans une règle donnée, chaque condition respectée, augmente le niveau global de priorité de la règle. In fine, la règle de priorité globale la plus élevée est appliquée.
La configuration initiale est basée sur 4 profiles et 6 règles :
$ cat /etc/cpufreqd.conf
# this is a comment
# see CPUFREQD.CONF(5) manpage for a complete reference
#
# Note: ondemand/conservative Profiles are disabled because
# they are not available on many platforms.
[General]
pidfile=/var/run/cpufreqd.pid
poll_interval=2
verbosity=4
#enable_remote=1
#remote_group=root
[/General]
#[acpi]
#acpid_socket=/var/run/acpid.socket
#[/acpi]
#[nforce2_atxp1]
#vcore_path=/some/path
#vcore_default=1500
#[/nforce2_atxp1]
#[sensors_plugin]
#sensors_conf=/some/file
#[/sensors_plugin]
#[Profile]
#name=On Demand High
#minfreq=40%
#maxfreq=100%
#policy=ondemand
#[/Profile]
#
#[Profile]
#name=On Demand Low
#minfreq=20%
#maxfreq=80%
#policy=ondemand
#[/Profile]
[Profile]
name=Performance High
minfreq=100%
maxfreq=100%
policy=performance
#exec_post=echo 8 > /proc/acpi/sony/brightness
[/Profile]
[Profile]
name=Performance Low
minfreq=80%
maxfreq=80%
policy=performance
[/Profile]
[Profile]
name=Powersave High
minfreq=60%
maxfreq=60%
policy=powersave
[/Profile]
[Profile]
name=Powersave Low
minfreq=40%
maxfreq=40%
policy=powersave
[/Profile]
#[Profile]
#name=Conservative High
#minfreq=33%
#maxfreq=100%
#policy=conservative
#[/Profile]
#
#[Profile]
#name=Conservative Low
#minfreq=0%
#maxfreq=66%
#policy=conservative
#[/Profile]
##
# Basic states
##
# when AC use performance mode
[Rule]
name=AC Rule
ac=on # (on/off)
profile=Performance High
[/Rule]
# stay in performance mode for the first minutes
[Rule]
name=AC Off - High Power
ac=off # (on/off)
battery_interval=70-100
#exec_post=echo 5 > /proc/acpi/sony/brightness
profile=Performance Low
[/Rule]
# conservative mode when not AC
[Rule]
name=AC Off - Medium Battery
ac=off # (on/off)
battery_interval=30-70
#exec_post=echo 3 > /proc/acpi/sony/brightness
profile=Powersave High
[/Rule]
# conservative mode when not AC
[Rule]
name=AC Off - Low Battery
ac=off # (on/off)
battery_interval=0-30
#exec_post=echo 3 > /proc/acpi/sony/brightness
profile=Powersave Low
[/Rule]
##
# Special Rules
##
# CPU Too hot!
[Rule]
name=CPU Too Hot
acpi_temperature=55-100
cpu_interval=50-100
profile=Performance Low
[/Rule]
# use performance mode if I'm watching a movie
# I don't care for batteries!
# But don't heat too much.
[Rule]
name=Movie Watcher
programs=xine,mplayer,gmplayer
battery_interval=0-100
acpi_temperature=0-60
cpu_interval=0-100
profile=Performance High
[/Rule]
Le fichier ci-dessous définit une configuration basique, généralement suffisante, avec
deux profils : Performance et Powersave, basée respectivement sur les régulateurs performance et powersave
deux règles: utilisation de performance lorsque le PC fonctionne sur secteur, utilisation de powersave lorsque le PC fonctionne sur batterie
$ cat /etc/cpufreqd.conf
# Exemple de configuration minimum
#
# see CPUFREQD.CONF(5) manpage for a complete reference
#
[General]
pidfile=/var/run/cpufreqd.pid
poll_interval=2
verbosity=4
#enable_remote=1
#remote_group=root
[/General]
########### Profile 1
[Profile]
name=Performance
minfreq=100%
maxfreq=100%
policy=performance
#exec_post=echo 8 > /proc/acpi/sony/brightness
[/Profile]
########## Profile 2
[Profile]
name=Powersave
minfreq=40%
maxfreq=40%
policy=powersave
[/Profile]
########## Règle 1
# when AC use performance mode
[Rule]
name=AC Rule
ac=on # (on/off)
profile=Performance
[/Rule]
########## Règle 2
# powersave mode when not AC
[Rule]
name=AC Off - Low Battery
ac=off # (on/off)
battery_interval=0-99
#exec_post=echo 3 > /proc/acpi/sony/brightness
profile=Powersave
[/Rule]
Pour tester une configuration en utilisant le mode debug, arrêter le daemon cpufreqd
# systemctl stop cpufreqd.service
et le redémarrer en avant plan (-D ou --no-daemon), avec une verbosité 6 ou 7 selon le niveau d'informations recherchées. Après la phase d'initialisation, le score de chaque règle est évalué et affiché à la fréquence du daemon :
# cpufredq -D -V6
.......
acpi_ac_update : ac_adapter is on-line
acpi_battery_update : BAT0 - present
acpi_battery_update : battery life for BAT0 is 100%
acpi_battery_update : average battery life 100%
acpi_temperature_update : temperature for thermal_zone0 is 48.0C
acpi_temperature_update : temperature average is 48.0C
get_cpu : CPU4 c_user=86643 c_nice=27 c_sys=41626 c_idle=3965922 c_iowait=81311 c_irq=0 c_softirq=194.
get_cpu : CPU0 c_user=19198 c_nice=6 c_sys=12074 c_idle=1003166 c_iowait=10187 c_irq=0 c_softirq=20.
get_cpu : CPU1 c_user=19045 c_nice=12 c_sys=13584 c_idle=996059 c_iowait=12714 c_irq=0 c_softirq=115.
get_cpu : CPU2 c_user=25196 c_nice=4 c_sys=8916 c_idle=977843 c_iowait=31172 c_irq=0 c_softirq=56.
get_cpu : CPU3 c_user=23202 c_nice=4 c_sys=7052 c_idle=988853 c_iowait=27236 c_irq=0 c_softirq=2.
update_rule_scores : Rule "AC Rule" score: 101%
update_rule_scores : Rule "AC Off - High Power" score: 51%
update_rule_scores : Rule "AC Off - Medium Battery" score: 0%
update_rule_scores : Rule "AC Off - Low Battery" score: 0%
update_rule_scores : Rule "CPU Too Hot" score: 0%
update_rule_scores : Rule "Movie Watcher" score: 78%
Dans le cas ci-dessus, la règle "AC Rule" (fonctionnement sur secteur) a le score le plus élevé et le profil correspondant (Performance) sera donc appliqué.