Journal Petit script pour gerer cpu_freq au demarrage de mon laptop.

Posté par  .
Étiquettes : aucune
0
18
nov.
2005
Petit script écrit ce matin pour gérer le scaling_governor de cpu_freq en fonction de l'état de la battery. Si ma battery est branchée et le pc est non relié au secteur, je passe en powersave, sinon je passe en conservative.

Je l'ai écrit de manière a ce qu'il soit réutilisable par un maximum de monde, juste en éditant les quelques variables au début du script en fonction de votre machine.

Le script modifie aussi mon fichier trip_points histoire d'éviter un "critical CPU temperature reached" lorsque mon processeur est soumis a une forte activitée.
Vous pouvez retirer cette partie si vous n'en n'avez pas l'utilitée.

Je le poste en tant que journal, histoire de le conserver quelque part.


###############################################################################
# Copyright (C) 2005 Francois COJEAN

# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
###############################################################################

# This script tests if a battery is plugged or not, set
# the cpufreq scaling_governor depending on the state of the battery, and
# the trip_points file to avoid the "critical temperature reached" error.
# Note : this script need to be run as root.

# Set up the different variables
# Edit all this variable to value which fit to your computer

BATTERY_NAME="BAT0"
BATTERY_ACPI_PATH="/proc/acpi/battery"
BATTERY_STATE_FILE="state"
POWERSAVE_SCALING_GOVERNOR="powersave"
CONSERVATIVE_SCALING_GOVERNOR="conservative"
CPU_FREQ_PATH="/sys/devices/system/cpu/cpu0/cpufreq"
SCALING_GOVERNOR_FILE="scaling_governor"
TEMPERATURE_ACPI_PATH="/proc/acpi/thermal_zone/THRS"
TEMPERATURE_TRIP_POINTS_FILE="trip_points"
# Becarefull, choose special values related to your processor.
# The value are organised like that :
# critical:hot:passive:active0:...:activeX
# where critical, hot, passive, active0..x is a value in Celsius for the
# corresponding trip point. x is between 0 and 9 and depends on your
# platform.
# See : http://acpi.sourceforge.net/documentation/thermal.html
TEMPERATURE_VALUE="95:0:75:0:0"


# Get the state of the battery
PRESENT="`cat $BATTERY_ACPI_PATH/$BATTERY_NAME/$BATTERY_STATE_FILE | grep present: | cut -f2 -d:`"
CHARGING_STATE="`cat $BATTERY_ACPI_PATH/$BATTERY_NAME/$BATTERY_STATE_FILE | grep "charging state:" | cut -f2 -d:`"

# Check the state of the battery
if [ $PRESENT = "yes" -a $CHARGING_STATE = "discharging" ]; then
# Set cpu_freq scaling_governor to powersave.
# This command need to be run as root.
echo "$POWERSAVE_SCALING_GOVERNOR" > $CPU_FREQ_PATH/$SCALING_GOVERNOR_FILE
echo "CPU_FREQ : $POWERSAVE_SCALING_GOVERNOR enable"
else
# Set cpu_freq scaling_governor to conservative.
# This command need to be run as root.
echo "$CONSERVATIVE_SCALING_GOVERNOR" > $CPU_FREQ_PATH/$SCALING_GOVERNOR_FILE
echo "CPU_FREQ : $CONSERVATIVE_SCALING_GOVERNOR enable"
fi

# Modification of the critical temperature value
# This command need to be run as root.
echo -n "$TEMPERATURE_VALUE" > $TEMPERATURE_ACPI_PATH/$TEMPERATURE_TRIP_POINTS_FILE
echo "ACPI : trip_points change to $TEMPERATURE_VALUE"

  • # upstream

    Posté par  (site web personnel) . Évalué à 2.

    tu peux aussi le remonter aux développeurs de cpufreq (upstream...) ou ceux qui en font l'intégration...

    tu auras peut-être la chance de pouvoir le conserver dans un cvs/svn en plus ;-) et d'en bénéficier de base lors d'une prochaine install...
    • [^] # Re: upstream

      Posté par  . Évalué à 3.

      Oui, enfin le script reste un peu à la sauce maison...
      il y a des tests suplémentaires à faire avant,
      genre tester si cpu_freq est en action , tester les scaling_governor disponibles etc...

      Sinon, j'ai oublier d'écrire dans le journal, que vous pouvez par exemple éxécuter le script dans le fichier rc.local (ou equivalent) de votre distribution (comme ca vous avez les droits root).
      Verifiez juste que votre fichier éxécutable, et accesible.
      et rajoutez cette ligne dans votre rc.local :

      sh /chemin_vers_le_script/nom_du_script
  • # pareil mais avec acpid et d'autres trucs

    Posté par  (site web personnel, Mastodon) . Évalué à 3.

    
    ##################
    ##/etc/acpi/scripts/ac-power.sh
    ##################
    #!/bin/bash
    
    POWER_STATE=$(cat /proc/acpi/ac_adapter/AC/state | tr -s " " | cut -d" " -f2)
    LID_STATE=$(cat /proc/acpi/button/lid/LID/state | tr -s " " | cut -d" " -f2)
    
    case "$POWER_STATE" in
        on-line)
    	if [ "$LID_STATE" = "open" ]; then
    	    echo "[ac-power=on] [lid=open] setting cpu in 'performance' mode" | logger -t "acpi"
    	    echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
    	else
    	    echo "[ac-power=on] [lid=closed] setting cpu in 'powersave' mode" | logger -t "acpi"
    	    echo "powersave" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
    	fi
    	;;
        off-line)
    	echo "[ac-power=off] setting cpu in 'powersave' mode" | logger -t "acpi"
    	echo "powersave" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
    	;;
        *)
    	echo "[ac-power=error] unknown power state" | logger -t "acpi"
    	;;
    esac
    
    ##################
    ##/etc/acpi/scripts/lid.sh
    ##################
    #!/bin/bash
    
    POWER_STATE=$(cat /proc/acpi/ac_adapter/AC/state | tr -s " " | cut -d" " -f2)
    LID_STATE=$(cat /proc/acpi/button/lid/LID/state | tr -s " " | cut -d" " -f2)
    
    case "$LID_STATE" in
        open)
    	if [ "$POWER_STATE" = "on-line" ]; then	    
    	    echo "[lid=open] [ac-power=on] setting cpu in 'performance' mode" | logger -t "acpi"
    	    echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
    	else
    	    echo "[lid=open] [ac-power=off] setting cpu in 'powersave' mode" | logger -t "acpi"
    	    echo "powersave" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
    	fi
    	;;
        closed)
    	echo "[lid=closed] setting cpu in 'powersave' mode" | logger -t "acpi"
    	echo "powersave" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
    	;;
        *)
    	echo "[lid=error] unknown lid state" | logger -t "acpi"
    	;;
    esac
    
    ##################
    ##/etc/acpi/scripts/powerbtn.sh
    ##################
    #!/bin/sh
    # /etc/acpi/powerbtn.sh
    # Initiates a shutdown when the power putton has been
    # pressed.
    
    if ps -Af | grep -q '[k]desktop' && test -f /usr/bin/dcop
    then
        dcop --all-sessions --all-users ksmserver ksmserver logout 0 2 0 && exit 0
    else
        /sbin/shutdown -h now "Power button pressed"
    fi
    
    ##################
    ##/etc/acpi/events/lid
    ##################
    
    
    event=button/lid
    action=/etc/acpi/scripts/lid.sh
    
    ##################
    ##/etc/acpi/events/powerbtn
    ##################
    # /etc/acpi/events/powerbtn
    # This is called when the user presses the power button and calls
    # /etc/acpi/powerbtn.sh for further processing.
    
    # Optionally you can specify the placeholder %e. It will pass
    # through the whole kernel event message to the program you've
    # specified.
    
    # We need to react on "button power.*" and "button/power.*" because
    # of kernel changes.
    
    event=button[ /]power
    action=/etc/acpi/scripts/powerbtn.sh
    
    ##################
    ##/etc/acpi/events/ac-power
    ##################
    
    
    event=battery[ ]BAT
    action=/etc/acpi/scripts/ac-power.sh
    
    
    donc ça gère le couvercle et ça écrit les évenements dans /var/log/messages !
    
    M.
    
    ce bout de code est sous licence Ms-RL ;)
    
  • # ouaip...

    Posté par  (site web personnel) . Évalué à 2.

    MOi j'ai juste mis :
    cpufreq-set -g ondemand

    ok, ca necessite d'installer cpufreq-set... mais c'est le seul qui me remt d'accrod avec mon portable (pas de bruit)
    • [^] # Re: ouaip...

      Posté par  . Évalué à 2.

      Pas besoin de cpufreq-set :

      echo -n "ondemand" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
      • [^] # Re: ouaip...

        Posté par  (site web personnel) . Évalué à 2.

        encore plus simple ;)
      • [^] # Re: ouaip...

        Posté par  . Évalué à 4.

        Tu peux aussi coller :

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

        dans /etc/sysfs.conf et ça fonctionne tout seul, dès le démarrage.
        • [^] # Re: ouaip...

          Posté par  . Évalué à 1.

          pour debian, il faut néanmoins rajouter le package sysfsutils pour avoir /etc/sysfs.conf
    • [^] # Re: ouaip...

      Posté par  . Évalué à 2.

      Sinon on peut aussi utiliser le daemon speedfreq ( http://www.goop.org/~jeremy/speedfreq/ ). Comme j'utilise window maker, la dockapp wmspeedfreq ( http://duncanthrax.net/wmspeedfreq/ ) permet simplement de modifier la frequence ( min , max ou dynamic ).
  • # Une question

    Posté par  . Évalué à 1.

    Personnellement sur ma Ubuntu (mode governor = userspace), cela veut dire qu'il y a un outil qui gére l'alim ?

    Qu'apporte ton script à la solution d'ubuntu, que je trouve certes efficace mais j'ai 3/4 voir 1h en moins d'autonomie que sur windows sur 4H ?

    J'ai peur de tester tes scripts ayant peur de casser la configuration d'ubuntu?

    Merci de m'éclairer

    Je sais il y'a des docs etc...Mais comme l'occasion se présente j'en profite.
    • [^] # Re: Une question

      Posté par  . Évalué à 2.

      Alors, en fait si tu note une réel différence avec la durée de ta batterie sous windows et sous linux c'est tout à fait normal si tu n'a rien modifié :).

      En gros, vu que ton governor est 'userspace', ca veut dire que tu ne l'a pas modifié. Il n'est modifié par aucun script du système non plus. Donc tu n'a aucune économie d'énergie, ton processeur tourne au maximum de sa capacité en permanence. (Ce qui correspond au scaling_governor "performance"). Cela explique que ta batterie se vide très vite.

      Avant d'écrire ce script j'utilisait un simple :

      echo "conservative" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
      Comme mentionné dans des commentaires précédents.

      Apres j'ai fait un constat, Lorsque je bosse sur mon laptop à la bibliotheque, j'oublie souvent dès le démarrage de mon laptop, de le passer sur le mode powersave, histoire d'avoir une autonomie maximum sur ma batterie. Du coup, le temps où j'oublie de changer le scaling_governor, bah je perds de l'autonomie inutilement. J'ai donc décider de regler mon scaling_governor, en fonction de ma batterie.

      Si mon pc est sur la batterie (batterie présente) et que elle est en mode décharge, c'est à dire , que mon pc n'est pas branché au secteur, dans ce cas le script se charge de mettre dès le demarrage de mon pc en mode 'powersave'.
      Sinon, il règle mon scaling_governor sur 'conservative'.


      Les différents modes sont (suivant la version du noyau utilisé) :

      performance : le processeur tourne à son maximum en permanence.
      ondemand : La fréquence du processeur est adaptée en fonction de l'utilisation du processeur.
      conservative : Même chose que 'ondemand' mais en version optimisée pour amd64. (Il me semble)
      powersave : Le processeur tourne à sa fréquence minimal en permanence.

      Pour plus de détails, je vous renvoie à la doc de cpu_freq.
      • [^] # Re: Une question

        Posté par  . Évalué à 2.

        Autrechose, pour ce qui utilise kde, il est possible d'activer dans klaptop (icone dans la boite a miniature) une option afin de modifier le profil de performance (scaling_governor) en deux clics.
      • [^] # Re: Une question

        Posté par  . Évalué à 3.

        conservative : Même chose que 'ondemand' mais en version optimisée pour amd64. (Il me semble)

        Pour être précis : ondemand saute du min au max, conservative utilise plus les niveaux intermédiaires.
        conservative est donc plus optimal pour les portables et les PDA (car plus économique pour la batterie) ou les amd64 (dont la latence du saut min<->max est plus importante : utiliser les fréq. intermédiaires serait donc moins pénalisant).
  • # petit fix

    Posté par  . Évalué à 1.

    Cette version fixe une petite erreur. En effet, Lorsque la batterie n'est pas inseré, la variable $CHARGING_STATE se retrouvait vide et donc le if renvoyait une erreur concernant les arguments.

    version corrigée :


    #!/bin/sh
    #
    ###############################################################################
    # Copyright (C) 2005 Francois COJEAN

    # This program is free software; you can redistribute it and/or
    # modify it under the terms of the GNU General Public License
    # as published by the Free Software Foundation; either version 2
    # of the License, or (at your option) any later version.

    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    # GNU General Public License for more details.

    # You should have received a copy of the GNU General Public License
    # along with this program; if not, write to the Free Software
    # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    ###############################################################################

    # This script tests if a battery is plugged or not, set
    # the cpufreq scaling_governor depending on the state of the battery, and
    # the trip_points file to avoid the "critical temperature reached" error.
    # Note : this script need to be run as root.

    # Set up the different variables
    # Edit all this variable to value which fit to your computer

    BATTERY_NAME="BAT0"
    BATTERY_ACPI_PATH="/proc/acpi/battery"
    BATTERY_STATE_FILE="state"
    POWERSAVE_SCALING_GOVERNOR="powersave"
    CONSERVATIVE_SCALING_GOVERNOR="conservative"
    CPU_FREQ_PATH="/sys/devices/system/cpu/cpu0/cpufreq"
    SCALING_GOVERNOR_FILE="scaling_governor"
    TEMPERATURE_ACPI_PATH="/proc/acpi/thermal_zone/THRS"
    TEMPERATURE_TRIP_POINTS_FILE="trip_points"
    # Becarefull, choose special values related to your processor.
    # The value are organised like that :
    # critical:hot:passive:active0:...:activeX
    # where critical, hot, passive, active0..x is a value in Celsius for the
    # corresponding trip point. x is between 0 and 9 and depends on your
    # platform.
    # See : http://acpi.sourceforge.net/documentation/thermal.html
    TEMPERATURE_VALUE="95:0:75:0:0"


    # Get the state of the battery
    PRESENT="`cat $BATTERY_ACPI_PATH/$BATTERY_NAME/$BATTERY_STATE_FILE | grep present: | cut -f2 -d:`"

    if [ $PRESENT = "yes" ]; then
    CHARGING_STATE="`cat $BATTERY_ACPI_PATH/$BATTERY_NAME/$BATTERY_STATE_FILE | grep "charging state:" | cut -f2 -d:`"
    else
    CHARGING_STATE="empty"
    fi

    # Check the state of the battery
    if [ $PRESENT = "yes" -a $CHARGING_STATE = "discharging" ]; then
    # Set cpu_freq scaling_governor to powersave.
    # This command need to be run as root.
    echo "$POWERSAVE_SCALING_GOVERNOR" > $CPU_FREQ_PATH/$SCALING_GOVERNOR_FILE
    echo "CPU_FREQ : $POWERSAVE_SCALING_GOVERNOR enable"
    else
    # Set cpu_freq scaling_governor to conservative.
    # This command need to be run as root.
    echo "$CONSERVATIVE_SCALING_GOVERNOR" > $CPU_FREQ_PATH/$SCALING_GOVERNOR_FILE
    echo "CPU_FREQ : $CONSERVATIVE_SCALING_GOVERNOR enable"
    fi

    # Modification of the critical temperature value
    # This command need to be run as root.
    echo -n "$TEMPERATURE_VALUE" > $TEMPERATURE_ACPI_PATH/$TEMPERATURE_TRIP_POINTS_FILE
    echo "ACPI : trip_points change to $TEMPERATURE_VALUE"

  • # cpufreqd ?

    Posté par  . Évalué à 1.

    Estce que ton script ne serait pas par hasard redondant avec cpufreqd ?

    http://cpufreqd.sourceforge.net

    Un demon qui permet de definir des profils en fonction de la batterie, de l'alim, de la temperature, de la charge CPU, etc... pour choisir son governor, les frequences autorisees, etc...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.