Pilotage du processeur

Le pilotage en fréquence d'un processeur met en œuvre

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.

1 - Pilote de processeur

1.1 - Chargement et identification

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
intel_pstate

$ cpupower frequency-info -d
analyse du CPU 0 :
driver: intel_pstate
$ lsmod |grep intel_pstate

1.2 - Pilotes pour les processeurs "récents"

1.3 - Pilotes pour les processeurs "anciens"

Voir https://wiki.archlinux.org/index.php/CPU_frequency_scaling

2 - Politique de pilotage de la fréquence

2.1 - Chargement et identification

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.

$ cpupower frequency-info -g
analyse du CPU 0 :
régulateurs disponibles : performance powersave
$ 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
$ cpupower frequency-info -l
analyse du CPU 0 :
limitation matérielle : 800 MHz - 3.10 GHz

2.2 - Modification de la politique et des paramètres

2.2.1 Principe

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),

2.2.2 Exemple de modification

Utilisation du régulateur powersave à la place du régulateur par défaut performance et modification des fréquences mini et maxi

# modprobe cpufreq_powersave
# cpupower frequency-set -g powersave -d 800MHz -u 800MHz
Setting cpu: 0
Setting cpu: 1
Setting cpu: 2
Setting cpu: 3
$ 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.

2.2.3 Autres paramètres de intel_pstate

# echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo 

3 - Sélection du mode de pilotage en fonction de la présence secteur

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

3.1 - Vérification des paramètres udev

Vérifier que lorsque le secteur est absent, respectivement présent, le paramètre POWER_SUPPLY_ONLINE vaut respectivement 0 et 1 :

$ 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
$ 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

3.2 - Création de la règle udev

$ 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"
# systemadm control --reload
# 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
# 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

Annexe - Gestionnaire de pilotage cpufreqd

1 - Principe

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.

2 - Installation

# aptitude install cpufreqd
$ 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

3 - Configuration

3.1 - Principe

Le fichier de configuration /etc/cpufred.conf est un fichier personnalisable permettant de définir :

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.

3.2 - Configuration initiale

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]

3.3 - Configuration minimum

Le fichier ci-dessous définit une configuration basique, généralement suffisante, avec

$ 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]

3.4 - Mode debug

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é.