Comment réduire sa consommation électrique avec GNU/Linux ?
image/svg+xml
Comment réduire sa consommation électrique avec GNU/Linux ?
Michael Opdenacker
Toulouse, 2023
Comment réduire sa consommation
électrique avec GNU/Linux ?
Passionné de logiciels libres
Fondateur de la société Bootlin
Ingénierie en systèmes embarqués
Une forte présence à Toulouse ;-)
Auteur de supports de formation libres
(Linux embarqué, noyau Linux, réduction
du temps de démarrage...)
Contributeur au Linux Ecology HOWTO
dans les années 2000.
Michael Opdenacker
- Suite à la crise énergétique et à l'urgence écologique
Besoin d'économiser l'énergie plutôt que d'en produire plus
- GNU/Linux permet aussi d'utiliser son matériel plus longtemps
Pourquoi cette présentation ?
Avoir plus d'autonomie sur batterie,
prolonger sa durée de vie
Savoir faire hiberner son pingouin
Partager nos meilleures pratiques
Motivations plus techniques
Matériel cible principal : ordinateurs portables sous GNU/Linux
Aussi : ordinateurs de bureau, serveurs
Aussi (un peu) : cartes électroniques embarquées
Objet de cette présentation
Mesurez votre consommation
Mise en veille, mise en hibernation
Gestion de l'écran
Gestion de la fréquence
Identifier les programmes les
plus consommateurs
Sujets abordés (1)
Mesurez votre consommation
Mettez votre pingouin au repos
Suspend to Idle
Signification de "mem" dans /sys/power/state
Désactiver les périphériques non utilisés
Récupérer la chaleur générée
Sujets abordés (2)
Licence Creative Commons - BY - SA - 4.0
https://creativecommons.org/licenses/by-sa/4.0/
Raspberry Pi 3 Model B V1.2
Power
HDMI
Audio
USB 2x
USB 2x
ETHERNET
DSI (DISPLAY)
CSI (CAMERA)
GPIO
© Raspberry Pi 2015
Des questions ?
michael.opdenacker.org@bootlin.com
Lien vers la présentation et ses sources :
https://bootlin.com/pub/conferences/2023/cdl/
Présentation réalisée avec les logiciels libres Sozi et Inkscape
Bootlin recrute stagiaires et ingénieurs
https://bootlin.com/company/careers/
Procurez-vous un wattmètre
Neuf : environ 20 EUR
Pas génial pour la conso totale d'un
PC (kW), mais bien pour la conso
instantannée (W)
Vous servira pour les autres appareils
de votre domicile.
Mettez votre système en veille
Presque tout est éteint, sauf la RAM
Consommation d'énergie négligeable pour
le wattmètre. Sauf si vous êtes sur batterie.
Facile à faire dès que vous laissez votre ordi.
- Sur ligne de commande
- Avec systemd
Quand vous n'utilisez plus votre ordi.
Linux peut prendre en charge 4 niveaux d'économie d'énergie :
- "Suspend-To-Idle" (
freeze
) : mise veille des périphériques,
le CPU arrête d'exécuter les processus ("idle").
- "Standby / Power-On Suspend" (
standby
) :
idem, avec certains processeurs éteints.
Pas observé sur les systèmes que je possède
- "Suspend-to-RAM" (
mem
) : mise en veille - tout éteint sauf la mémoire
- "Suspend-to-disk" (
disk
) : hibernation sur disque - tout éteint et
le contenu de la mémoire conservé sur disque.
Voir ceux qui sont disponibles:
$ cat /sys/power/state
freeze mem disk
https://www.kernel.org/doc/Documentation/power/states.txt
D'après la doc du noyau, le mode "Freeze" est toujours disponible et ne demande pas
de prise en charge particulière du matériel, au moins au niveau du processeur.
- Le processeur arrête d'exécuter les processus
- Les périphériques sont mis en veille voire éteints
(requiert des drivers qui savent les mettre en veille)
- Le processeur n'a plus rien à faire et donc passe en mode inactif ("idle"), ce qui lui permet
de couper l'alimentation de certains de ses circuits et économiser beaucoup d'énergie.
- Suspend to Idle remplace le mode "veille" quand celui-ci n'est pas pris en charge sur votre
matériel. Sinon, à part un temps de réveil un peu plus court (< 1s au lieu de 3-4s), ce mode
n'a pas l'air d'avoir d'autre intérêt sur un PC
mem
dans
/sys/power/state
peut prendre des sens différents.
Si le mode "veille" est disponible,
deep
apparaît dans
/sys/power_memsleep
:
s2idle [deep]
- Ici
[deep]
signifie que par défaut,
mem
correspond au mode "veille"
(Suspend-to-RAM)
-
s2idle
(Suspend-To-Idle, "freeze") est disponible mais n'est pas sélectionné.
On peut changer temporairement le réglage par défaut:
sudo sh -c "echo s2idle > /sys/power/power_memsleep"
Ou de façon permanente en modifiant la ligne de commande du noyau, en
rajoutant
mem_sleep_default=s2idle
à
GRUB_CMDLINE_LINUX_DEFAULT
dans
/etc/default/grub
. Exécuter ensuite
sudo update-grub
.
Comment mettre votre système en veille ?
Normalement facile sur toute distro graphique
Depuis la ligne de commande (avec systemd):
systemctl suspend
ou commande bas niveau (ne verrouille pas l'écran):
sudo sh -c "echo mem > /sys/power/state"
Comment réveiller votre système ?
Toujours plus facile de s'endormir !
Sur PC, réveiller en appuyant sur le bouton d'allumage
des fois, en bougeant une souris USB
Les sources qui peuvent réveiller votre PC se trouvent dans
/sys/class/wakeup/
Plus de détails sur
https://wiki.archlinux.org/title/Power_management/Wakeup_triggers
Sur un serveur à distance, pas de solution
simple pour sortir de veille.
En résumé
Mettez votre pingouin en veille
à chaque fois que vous le quittez.
Passez en hibernation la nuit et
par une prise, coupez tous les périphériques,
y compris la box Internet (si possible).
En voyage, utilisez l'hibernation pour prolonger
la durée de vie de votre batterie.
Installez le service TLP pour désactiver
les périphériques inutilisés et positionner
des réglages économes en énergie.
La fréquence du CPU s'adapte bien à
l'activité de vos programmes.
Attention à la consommation de vos écrans.
Récupérez la chaleur produite
Laissez travailler votre imagination !
Mon levain adore ma Livebox
(conso : 12 W)
Ou bien...
Mettre votre système en hibernation
Veille ou hibernation ?
L'état de votre système est sauvegardé sur disque,
et puis votre machine est éteinte.
Meilleur pour des extinctions plus longues, car aucune conso
électrique et pas d'usure de la batterie pour les portables.
Hélas pas toujours disponible en standard sur les distributions
récentes.
Pas très compliqué à mettre en place cependant.
Sur vieux portable Dell Latitude
- Autonomie estimée de la batterie à 100% : 1h12
- En veille: -6,9% (94 mAh) par heure
- En hibernation: reste à 100% au bout d'une nuit
Sur portable récent Dell XPS
- Autonomie estimée de la batterie à 100% : 8h30
- En veille: -0,8% (58 mAh) par heure
- En hibernation: reste à 100% au bout d'une nuit
Économisez votre batterie en utilisant l'hibernation !
Principes de l'hibernation (1)
L'hibernation se repose sur la mise en veille
Pour l'endormissement:
1. On simule une mise en veille
Sauvegarde en mémoire de l'état des périphériques
2. On copie toute la RAM sur le disque
Besoin d'une partition swap ou d'un fichier aussi gros que la RAM
3. On éteint la machine.
Principes de l'hibernation (2)
Pour le réveil:
1. On allume la machine, on démarre Linux
2. On recopie en mémoire le contenu
sauvegardé sur disque.
3. On réveille la machine depuis la RAM
comme si on sortait de veille.
Comment mettre en place l'hibernation ? (1)
Besoin de place sur disque pour stocker
l'image de la mémoire
Le plus simple : une partition swap au moins
aussi grande que la taille de la mémoire
Sinon, on peut stocker la mémoire dans un
fichier, un peu plus compliqué :
https://ubuntuhandbook.org/index.php/2021/08/enable-hibernate-ubuntu-21-10/
Comment mettre en place l'hibernation ? (2)
1. Trouver l'UUID de votre partition swap:
cat /etc/fstab | grep UUID=
2. Rajouter
resume=UUID=xxxx
à
GRUB_CMDLINE_LINUX_DEFAULT
dans
/etc/default/grub
3. Mettre à jour le fichier de configuration de Grub:
sudo update-grub
Testé sur Ubuntu 22.04
Comment déclencher l'hibernation ?
Simplement avec Systemd
(le plus complet : verrouillage de la session) :
systemctl hibernate
La solution bas niveau (pas de verrouillage) :
sudo sh -c "echo disk > /sys/power/state"
Comment sortir d'hibernation ?
Rallumer la machine, c'est tout !
Sur un serveur à distance, possibilité
d'utiliser le "Wake on LAN"
1. Activer la fonctionnalité dans le BIOS
2. Trouver l'adresse MAC de l'interface réseau de votre serveur
ip a
3. Passer cette adresse MAC à la commande
wakeonlan
:
wakeonlan f8:ca:b8:17:44:02
Sending magic packet to 255.255.255.255:9 with f8:ca:b8:17:44:02
Facile pour une machine sur même réseau, mais pas à travers Internet.
Rajouter une option "hiberner" (1)
Testé sur Ubuntu 22.04
Lancer le gestionnaire d'extensions de GNOME :
extension-manager
Rechercher "Hibernate Status Button", installer et activer
cette extension.
Rajouter une option "hiberner" (2)
Testé sur Ubuntu 22.04
Il faut aussi créer un fichier
/etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla :
[Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes
[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;
org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;
org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes
Source :
https://ubuntuhandbook.org/index.php/2021/08/enable-hibernate-ubuntu-21-10/
Attention à la consommation de vos écrans (1) !
Attention à la consommation de vos écrans (2) !
Utilisation de ddcutil
Portable qui ne fait rien luminosité maximale:
14,88W
Portable qui ne fait rien luminosité minimale:
10,04W
Portable qui ne fait rien écran éteint:
7,44W
Conclusion : un écran au max de luminosité
peut représenter la moitié de votre consommation
électrique quand le PC ne fait rien !
Sur mon vieux moniteur LCD IIyama (2012)
A luminosité maximale :
45 W !
A 50% de luminosité, suffisant, mais qui fait un petit bruit de vibration :-/
30 W
A luminosité minimale, suffisant la nuit, toujours ce petit bruit :
15 W
ddcutil is a Linux program for managing monitor settings,
such as brightness, color levels, and input source. Generally
speaking, any setting that can be changed by pressing buttons
on the monitor can be modified by ddcutil.
https://www.ddcutil.com/
$ sudo ddcutil capabilities
...
Feature: D6 (Power mode)
Values:
01: DPM: On, DPMS: Off
04: DPM: Off, DPMS: Off
...
Pour éteindre l'écran :
$ sudo ddcutil setvcp D6 04
Pour le rallumer :
$ sudo ddcutil setvcp D6 01
Comment éteindre vos écrans ?
Difficile de trouver des commandes universelles !
Avec X, pour éteindre un écran en particulier :
$ xrandr -q
(identifier les écrans)
$ xrandr --output DP-2-3 --off
(éteindre)
$ xrandr --output DP-2-3 --auto
(rallumer)
Ne marchait pas chez moi pour un seul écran
Avec
ddcutil
, vous pouvez contrôler vos écrans externes,
comme vous le feriez avec leurs boutons de contrôle.
Sur mon portable, la touche F8 permet d'alterner entre les écrans allumés
(tous ou un seul), sans avoir à passer par les menus de configuration. Je
trouve cependant plus simple de mettre la luminosité au minimum.
Le plus simple pour éteindre ses écrans sans passer en veille
est sans doute de verrouiller son PC (Super - L)
Mais mieux de passer en veille si votre PC ne fait rien !
Adaptez la performance de votre processeur
Ubuntu offre en standard des options
pour contrôler la fréquence
de votre processeur.
Cela se base sur l'infrastructure
"cpufreq" du noyau Linux. On peut
même mettre des réglages différents
pour chaque coeur !
Extension GNOME CPU Power Manager (1)
GNOME offre des options
plus fines pour contrôler la consommation
et la performance de votre processeur.
Extension GNOME CPU Power Manager (2)
Compilation du noyau Linux (configuration "defconfig" sur x86)
- "Haute performance" : 14:37 min (mode actif: 35W, mode inactif : 10 W)
- "Economie d'énergie" : 40:45 min (mode actif: 15,5 W (moyenne), mode inactif : 15 W)
- "Multimedia" : 13:47 min (mode actif : 38W, mode inactif : 13W)
- "Silencieux" : 36:20 min (mode actif : 17,8 W, mode inactif : 12W)
=> Des résultats un peu surprenants, à refaire en les refaisant chacun
carte mère froide. Il semble que la gestion de l'énergie tienne compte de la température.
Enseignements:
- Le mode "Économie d'énergie" garantit une conso minimale. Bien sur batterie.
- Le mode "Haute performance" ne fait pas toujours tourner votre processeur
à fond. Il l'autorise juste.
Tests (un peu bruts) de performance
On peut utiliser l'outil manuellement et appliquer ses
recommandations :
$ sudo powertop --auto-tune
Mais c'est plus simple de les appliquer de façon permanente :
$ sudo systemctl enable powertop
$ sudo systemctl start powertop
(ou redémarrer)
Résultats sur vieux Dell Latitude branché,
écran LCD au max de luminosité :
consommation réduite de 15,12W à 12,55W
PowerTop - Disponible sur Intel, AMD, ARM
Se repose sur l'infrastructure "cpuidle" du noyau Linux
Mesure ce qui consome le plus sur votre système
Vous donne aussi des conseils pour améliorer les réglages.
Besoin d'être root et de fonctionner sur batterie (plus d'infos):
$ sudo powertop
Une variante qui fait d'abord des tests sur votre machine
pour des estimations plus fines de la consommation :
$ sudo powertop --calibrate
Qui consommera 30 fois moins ?
Si c'est pour jouer un rôle de serveur ou de
contrôleur d'affichage.
Une exception à la règle de conservation du matériel
PowerTop - Vue d'ensemble
PowerTop - Réglages
PowerTop - Intégration
https://linrunner.de/tlp/
Similaire à
powertop --auto-tune
, applique des réglages pour
réduire la consommation
- Activation automatique à l'installation (pas besoin de PowerTop) :
$ sudo apt-install tlp
(Ubuntu)
- Deux profils: sur batterie et sur alimentation, activés automatiquement
- Un profil sur batterie plus économique que sur alimentation
- Possibilité de personnaliser les réglages si on le souhaite (contrairement
à PowerTop), même si les réglages par défaut suffisent généralement.
- Commande
tlp-stat
: plein d'infos très utiles sur la batterie, les disques...
Résultats sur vieux Dell Latitude branché, écran LCD au max de luminosité :
consommation réduite de 15,12W à 12,65W.
Serait intéressant de faire un comparatif de durée de vie de la batterie.
Encore mieux : TLP
Remplacez votre vieux et gros PC par une carte embarquée
Détecter les activités qui consomment de l'énergie
Nouvelles options dans le menu "alimentation"
Qu'est-ce que la veille hybride ?
C'est à la fois une mise en veille et une mise en hibernation.
- Si vous reprenez rapidement votre ordinateur, celui-ci se réveille instantanément
- Si vous laissez plus longtemps votre ordinateur, la batterie finit par se vider,
mais au rallumage, vous retrouvez son état d'origine grâce à l'hibernation.
Une "super-veille" plus sécurisante, mais pas une alternative à l'hibernation,
qui elle seule économise votre batterie.
Pour des mesures plus précises
Utilisation de la carte ACME de Baylibre
Coût : environ 100 EUR (merci pour le don !)
Matériel et logiciel libre pour une mesure
fine des consommations électriques
Parfait pour mesurer la consommation
de cartes embarquées ou de petits circuits.
J'ai ainsi pu mesurer la conso de ma
BeagleBone Black (ARM). Hélas,
cette carte n'estpas facile à passer en veille.
Il faudrait un micrologiciel spécial.
https://baylibre.com/acme/
https://bootlin.com/blog/power-measurement-with-acme/
D'après la doc du noyau, le mode "Freeze" est toujours disponible et ne demande pas
de prise en charge particulière du matériel, au moins au niveau du processeur.
- Le processeur arrête d'exécuter les processus
- Les périphériques sont mis en veille voire éteints
(requiert des drivers qui savent les mettre en veille)
- Le processeur n'a plus rien à faire et donc passe en mode inactif ("idle"), ce qui lui permet
de couper l'alimentation de certains de ses circuits et économiser beaucoup d'énergie.
- Suspend to Idle remplace le mode "veille" quand celui-ci n'est pas pris en charge sur votre
matériel. Sinon, à part un temps de réveil un peu plus court (< 1s au lieu de 3-4s), ce mode
n'a pas l'air d'avoir d'autre intérêt sur un PC. Cela pourrait être intéressant pour un système
embarqué qui essaierait de se mettre en économie d'énergie à chaque fois que possible.
Pour forcer l'activation de ce mode:
sudo sh -c "echo freeze > /sys/power/state"
Pour réveiller votre système, même technique que pour la veille (prochaines diapos).
1
Titre
Michael Opdenacker
Pourquoi ?
Motivations techniques
Objet de cette présentation