Dernière mise à jour : 08/10/2008.

Les processeurs, notamment sur les ordinateurs portables, sont en effet conçus pour pouvoir fonctionner à différentes fréquences et éventuellement différentes tensions d'alimentation. La consommation de ce composant du système très gourmand [1] est en effet proportionnelle à la fréquence mais aussi au carré de sa tension d'alimentation (voir l'article Frequency scaling sur Wikipedia). Or le CPU peut changer de fréquence en cours de fonctionnement de façon transparente, ce qui permet de réduire sa consommation à la volée. En ces temps de réchauffement de la planète, voilà qui est plus que d'actualité...

Ceci explique certainement le choix d'Asus pour son nouvel ultra-portable Eee PC : le processeur tourne à 600 MHz au lieu de 900 MHz, sa fréquence maximale officielle. Dans ce cas, si on peut n'augmenter la fréquence que lorsqu'on en a besoin, la surconsommation engendrée momentanément est négligeable. Et ce d'autant plus que sa fréquence minimale de fonctionnement est de 112 MHz...

Charger les bons modules

La mise en place du « frequency scaling » est expliquée dans le Wiki Ubuntu français. Le première étape consiste à rechercher le module qui gère la fréquence de votre CPU, ce qui nécessite évidemment de connaître votre CPU. On peut trouver cette information en ligne de commande de cette manière :

$ grep name /proc/cpuinfo
model name      : Intel(R) Celeron(R) M processor          900MHz

Maintenant il faut trouver le module correspondant au CPU trouvé. La page du Wiki Ubuntu en liste au moins 5 possibles tout en précisant qu'il en existe d'autres. En fouinant un peu dans le fichier /lib/modules/<version_de_noyau>/modules.dep listant les dépendances des modules, on peut retrouver d'autres modules faisant appel au module freq_table utilisé pour extraire les fréquences CPU disponibles :

$ grep freq_table /lib/modules/$(uname -r)/modules.dep | grep -oEe '\w+-?\w*\.ko' | sort -u
acpi-cpufreq.ko
cpufreq_ondemand.ko
cpufreq_stats.ko
e_powersaver.ko
freq_table.ko
longhaul.ko
p4-clockmod.ko
powernow-k6.ko
powernow-k7.ko
powernow-k8.ko
processor.ko
speedstep-centrino.ko
speedstep-ich.ko
speedstep-lib.ko
speedstep-smi.ko

Rappelons que la commande grep recherche des textes sur des expressions régulières, dans des fichiers ou dans la sortie texte de la console (sortie standard), la commande uname récupère le nom et/ou la version du noyau, alors que sort trie des textes par ordre alphabétique. On voit ici qu'il y a 8 modules (mis en gras) potentiellement intéressants. On peut savoir assez facilement à quels CPU s'adressent tous ces modules grâce à la commande modinfo qui, comme son nom devrait l'indiquer, affiche des informations sur un module. Dans une horrible boucle for sur une seule ligne ça donne :

$ for MODULE in $(echo 'powernow-k6 powernow-k7 powernow-k8 p4-clockmod speedstep-centrino acpi-cpufreq speedstep-ich e_powersaver'); do echo \*$MODULE\ $(sudo modinfo $MODULE | grep description:); done
*powernow-k6 description: PowerNow! driver for AMD K6-2+ / K6-3+ processors.
*powernow-k7 description: Powernow driver for AMD K7 processors.
*powernow-k8 description: AMD Athlon 64 and Opteron processor frequency driver.
*p4-clockmod description: cpufreq driver for Pentium(TM) 4/Xeon(TM)
*speedstep-centrino description: Enhanced SpeedStep driver for Intel Pentium M processors.
*acpi-cpufreq description: ACPI Processor P-States Driver
*speedstep-ich description: Speedstep driver for Intel mobile processors on chipsets with ICH-M southbridges.
*e_powersaver description: Enhanced PowerSaver driver for VIA C7 CPU's.

Normalement vous devriez y retrouver celui qui correspond à votre machine, bien que le Celeron n'apparaisse pas dans la description de p4-clockmod. Et de toute façon, si vous vous trompez, Linux protestera ! Il faut maintenant le charger avec la commande modprobe, puis charger les gestionnaires de fréquence CPU, appelés « governors » :

$ sudo modprobe -a <nom_du_module_kivabien>
$ sudo modprobe -a cpufreq_conservative cpufreq_ondemand cpufreq_powersave cpufreq_stats cpufreq_userspace

Pour que ces modules soient chargés systématiquement au démarrage de la machine, on ajoutera leur nom dans le fichier /etc/modules :

$ sudo nano /etc/modules

Il faut mettre un module par ligne, par exemple pour le module p4-clockmod on ajoutera :

p4-clockmod
cpufreq_conservative
cpufreq_ondemand
cpufreq_powersave
cpufreq_stats
cpufreq_userspace

Activer l'adaptation de fréquence CPU

Les governors ont pour rôle de définir la fréquence CPU à utiliser. Leurs stratégies d'action sont les suivantes :

  • powersave et performance fixent la fréquence à son mini et à son maxi respectivement
  • userspace laisse l'utilisateur régler manuellement la fréquence, pour autant qu'il en ait les droits (!)
  • conservative et ondemand adaptent la fréquence en temps réel en fonction de la charge de la machine, conservative essayant de ne pas trop la modifier alors que ondemand est au contraire assez réactif.

Ce sont évidemment les deux derniers qui nous intéressent le plus. Reste à obtenir des informations sur les fréquences et stratégies possibles et actuelles. Le module chargé précédemment crée pour cela des fichiers dans l'arborescence /sys/devices/system/cpu/cpu.../cpufreq/ :

$ sudo ls /sys/devices/system/cpu/cpu0/cpufreq/
affected_cpus     scaling_available_frequencies  scaling_governor
cpuinfo_cur_freq  scaling_available_governors    scaling_max_freq
cpuinfo_max_freq  scaling_cur_freq               scaling_min_freq
cpuinfo_min_freq  scaling_driver                 stats

NB: si vous avez plusieurs processeurs, le sous-répertoire cpu0 mis en gras se déclinera en cpu1, cpu2, etc.

Ceux qui bafouillent quelques mots d'anglais auront vite repéré le fichier scaling_available_frequencies qui donne la liste des fréquences CPU possibles en kHz. Sur l'Asus Eee PC :

$ sudo cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
112500 225000 337500 450000 562500 675000 787500 900000

De même on obtient facilement la liste des governors possibles :

$ sudo cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
userspace powersave ondemand conservative performance

Enfin si vous voulez savoir où le CPU en est, le plus simple est d'installer le paquet cpufrequtils qui fournit la commande cpufreq-info. Sur Debian et dérivés, ça donne :

$ sudo apt-get install cpufrequtils
$ cpufreq-info
cpufrequtils 002: cpufreq-info (C) Dominik Brodowski 2004-2006
Veuillez rapportez les erreurs et les bogues à linux@brodo.de, s'il vous plait.
analyse du CPU 0 :
  pilote : p4-clockmod
  CPUs qui doivent changer de fréquences en même temps : 0
  limitation matérielle : 113 MHz - 900 MHz
  plage de fréquence : 113 MHz, 225 MHz, 338 MHz, 450 MHz, 563 MHz, 675 MHz, 788 MHz, 900 MHz
  régulateurs disponibles : userspace, powersave, ondemand, conservative, performance
  tactique actuelle : la fréquence doit être comprise entre 225 MHz et 900 MHz.
                 Le régulateur "ondemand" est libre de choisir la vitesse
                 dans cette plage de fréquences.
  la fréquence actuelle de ce CPU est 225 MHz.

Hé oui mon Eee PC tourne à 225 MHz pour éditer ce billet dans kwrite ! (et ce n'est pas un poisson d'avril ;-) )

Pour modifier le governor, il y a la méthode console dans le plus pur esprit Unix qui consiste à modifier en tant que root le contenu du fichier scaling_governor pour y écrire la nouvelle méthode. Une méthode plus sympathique consiste à utiliser la commande cpufreq-set du paquet cpufrequtils. Cette commande permet de changer divers paramètres, par exemple pour passer le mini de 112 à 225 MHz :

$ sudo cpufreq-set --min 225MHz

On consultera sa documentation en ligne avec la classique commande man cpufreq-set. Enfin la méthode des Linux modernes, en interface graphique, consiste à utiliser l'applet Gnome nommée « moniteur de changements de fréquence CPU » par exemple. Cette dernière ne pourra par défaut qu'afficher la fréquence actuelle. Cependant en reconfigurant le paquet gnome-applets sous Debian et dérivés, on peut lui donner les droits nécessaires à la modification du governor :

$ sudo dpkg-reconfigure gnome-applets

CPU freq monitor

On peut changer le governor directement dans l'applet Gnome.

À l'unique question posée « Faut-il exécuter cpufreq-selector avec les privilèges du superutilisateur ? », il faudra répondre « Oui » ! Voilà qui permet d'expérimenter, mais il subsiste un problème : tout est perdu après redémarrage de la machine. C'est là que le paquet sysfsutils vient nous sauver : il modifie certains paramètres du système à chaque démarrage. On l'installe aussi simplement que d'habitude :

$ sudo apt-get install sysfsutils

Il ne reste alors plus qu'à éditer son fichier de configuration :

$ sudo nano /etc/sysfs.conf

pour y placer une ligne de ce genre qu'on adaptera à ses besoins bien sûr :

devices/system/cpu/cpu0/cpufreq/scaling_governor = ondemand

On pourra de la même manière y définir d'autres paramètres comme la fréquence CPU minimale par exemple (voir plus bas). Voilà qui devrait vous permettre de réduire un peu la consommation électrique et la dissipation thermique de vos machines sans pour autant pénaliser leurs performances. N'oubliez pas cependant que sur un portable, c'est généralement l'écran qui consomme le plus, alors ne mettez pas sa luminosité à fond pour compenser !

Cas du Eee PC

Tout ce qui a été expliqué précédemment fonctionne très bien avec le Eee PC sauf la sauvegarde des paramètres pour le redémarrage. L'Eee PC n'a en effet pas un comportement tout-à-fait standard avec les services Linux installés a posteriori : il ne les exécute pas par défaut ! Certainement pour des raisons d'optimisation du temps de démarrage de la machine. Ainsi pour lancer le service sysfsutils, vous aurez besoin d'ajouter son nom dans un fichier spécial nommé /etc/fastservices. En ligne de commande, ça donne :

$ sudo -s
# echo sysfsutils >> /etc/fastservices
# exit

Le seul inconvénient dans le cas du Eee PC est que le CPU tourne alors à 113 MHz. Du coup certaines opérations graphiques comme le défilement dans une fenêtre peuvent ne plus être assez fluides. On peut alors modifier avec sysfsutils la fréquence minimale pour passer à 225 voire 338 MHz ou 450MHz, notamment dans un environnement Gnome ou KDE complet avec effets 3D Compiz activés[2]. Selon la page Power consumption of the Eee PC (« Consommation d'énergie de l'EeeePC »), la réduction de fréquence n'aurait toutefois qu'un effet minime sur cette machine[3], ce qui voudrait dire qu'on n'a pas besoin de descendre bas. On pourra alors enregistrer cette configuration pour chaque démarrage en ajoutant une nouvelle ligne au fichier /etc/sysfs.conf :

devices/system/cpu/cpu0/cpufreq/scaling_min_freq = 337500

Bonne Eeexpérimentation !

Notes

[1] quelques watts à quelques dizaines sur un portable, jusqu'à près de 100W pour certaines machines de bureau

[2] hé oui, pas besoin d'un quadruple cœurs avec 3 Go de RAM pour avoir des effets 3D, si on choisit bien son système évidemment ;-)

[3] remarque : la puissance totale consommée a été mesurée en fonctionnement vers 11 à 12W, ce qui rend cette machine imbattable à l'achat et en coût d'usage