How to extend battery life by automatically changing cpu governors.
FedoraForum.org - Fedora Support Forums and Community
Results 1 to 3 of 3
  1. #1
    Join Date
    Sep 2009
    Posts
    2,209
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    How to extend battery life by automatically changing cpu governors.

    Edit Note: After doing more reading, I realized that the power manager handles calling this script automatically when ac power is removed or applied, when the laptop first boots, and when the laptop resumes from suspend or hibernate. This simplifies things considerably. All that is needed is a modifed version of the original script in the /etc/pm/power.d directory. This also removes the requirement for running the acpi daemon (acpid), which isn't needed for pure gnome or KDE installations. Rather than posting the new version, this edit replaces the original post. End Note


    This how to, along with autosuspending a laptop's webcam can noticeably extend laptop battery life. The following description of the conservative governor is from the kernel documentation:
    Code:
    165	The CPUfreq governor "conservative", much like the "ondemand"
    166	governor, sets the CPU depending on the current usage.  It differs in
    167	behaviour in that it gracefully increases and decreases the CPU speed
    168	rather than jumping to max speed the moment there is any load on the
    169	CPU.  This behaviour more suitable in a battery powered environment.
    Currently, Ubuntu's gnome-power-manager supports using the conservative governor. But as of F14 rawhide, Fedora's does not. This script enables automatically changing governors when the ac adapter goes on and off line. It also allows throttling the maximum cpu frequency at the same time. Limiting the maximum frequency provides a cubic energy reduction, rather than linear, for drivers that support voltage scaling. (From the kernel/linux-2.6.34/drivers/acpi/processor_thermal.c source code).

    The method described here only works with kernels and hardware that support cpu frequency scaling governors. It takes advantage of the cpufrequtils package, which should be installed with yum or your favorite package manager. Once it's installed, run cpufreq-info to make sure your laptop/kernel is supported.

    Step 0:
    Code:
    [gene@Mobile-PC ~]$ sudo yum install cpufrequtils
    ...
    [gene@Mobile-PC ~]$ cpufreq-info
    cpufrequtils 007: cpufreq-info (C) Dominik Brodowski 2004-2009
    Report errors and bugs to cpufreq@vger.kernel.org, please.
    analyzing CPU 0:
      driver: acpi-cpufreq
      CPUs which run at the same hardware frequency: 0 1
      CPUs which need to have their frequency coordinated by software: 0
      maximum transition latency: 10.0 us.
      hardware limits: 800 MHz - 1.73 GHz
      available frequency steps: 1.73 GHz, 1.33 GHz, 1.07 GHz, 800 MHz
      available cpufreq governors: ondemand, userspace, performance
      current policy: frequency should be within 800 MHz and 1.73 GHz.
                      The governor "ondemand" may decide which speed to use
                      within this range.
      current CPU frequency is 800 MHz.
    analyzing CPU 1:
    ...
    Notice that a default installation doesn't include the conservative governor. That's taken care of by the script. The other important item is the driver. The list of drivers that support frequency scaling is in /etc/rc.d/init.d/cpuspeed. As long as the driver shown by cpufreq-info is in the following list, this script should work for you.
    Code:
    centrino powernow-k8 acpi-cpufreq e_powersaver
    The directory involved is owned by root, so you'll need to use sudo or su -c to create, edit, and chmod the file. If you haven't set up sudo yet, use:
    Code:
     su -c "command that was passed to sudo"
    whenever sudo is shown. You will need the quotes with su -c, and you will be prompted for the root password.

    Step 1: Create the powersave script in /etc/pm/power.d and make it executable. You may notice that the default online governor has been set to performance instead of the Fedora default of ondemand. Feel free to change it back to ondemand if you prefer. Also, the default script reduces the maximum frequency by 1 entry in the frequency table on battery power. Using 0 saves less energy, and 2 will save more. Try different values to test the trade off between battery life and responsiveness.
    Code:
    sudo gedit /etc/pm/power.d/governor-max-freq-powersave
    I'm told vim isn't for everyone... Paste the following script into your favorite editor window:
    Code:
    #!/bin/bash
    # This script will be called by the power manager subsystem at boot, on resume
    # from suspend or hibernate, and when the ac power goes on or off line.
    
    # Change the following two lines to use different governors.
    # See /lib/modules/2.6.*/kernel/drivers/cpufreq/* for available governors.
    online_governor=performance
    battery_governor=conservative
    # Change the following two lines to change the maximum cpu frequency reduction.
    online_throttle=0
    battery_throttle=1
    # This list is from /etc/rc.d/init.d/cpuspeed.  If your driver isn't listed,
    # but does support frequency scaling governors, add it to this list.
    supporting_drivers="centrino powernow-k8 acpi-cpufreq e_powersaver"
    
    PATH=/sbin:/bin:/usr/bin
    E_DRIVER=81
    E_AVAIL_FREQS=82
    E_ONLINE_MOD=83
    E_BATTERY_MOD=84
    E_SET_GOV=85
    E_SET_MAX=86
    
    powersave="$1" # The caller passes "true" or "false" in $1.
    cpud=/sys/devices/system/cpu
    cpu0freqd=${cpud}/cpu0/cpufreq
    cpu_freqds=${cpud}/'cpu[0-9]*/cpufreq'
    echo ${supporting_drivers} | \
    	grep -w "`cat ${cpu0freqd}/scaling_driver`" > /dev/null || \
    	exit $E_DRIVER
    available_frequencies="`cat ${cpu0freqd}/scaling_available_frequencies`" && \
    	[ -n "${available_frequencies}" ] || exit $E_AVAIL_FREQS
    available_governors=${cpu0freqd}/scaling_available_governors
    
    # Load the necessary governors if they aren't already loaded.
    grep -w "${online_governor}" "${available_governors}" > /dev/null || \
    	modprobe cpufreq_${online_governor} || exit $E_ONLINE_MOD
    grep -w "${battery_governor}" "${available_governors}" > /dev/null || \
    	modprobe cpufreq_${battery_governor} || exit $E_BATTERY_MOD
    
    get_max_freq() {
    # Save the passed throttle before using set and shift to get the max freq.
    	throttle="$1"
    	set ${available_frequencies}
    	if [ "${throttle}" -lt $# ]
    	then shift ${throttle}
    	else shift `expr $# - 1`
    	fi
    	echo "$1"
    }
    
    set_cpus() {
    	for cpu in ${cpu_freqds}; do
    		echo "$1" > ${cpu}/scaling_governor || return $E_SET_GOV
    		echo "$2" > ${cpu}/scaling_max_freq || return $E_SET_MAX
    	done
    }
    
    if [ "${powersave}" == "true" ]
    then set_cpus ${battery_governor} `get_max_freq ${battery_throttle}`
    else set_cpus ${online_governor} `get_max_freq ${online_throttle}`
    fi
    exit $? # Return the exit code from set_cpus.
    Code:
    sudo chmod +x /etc/pm/power.d/governor-max-freq-powersave
    Test the script with cpufreq-info by unplugging and plugging in the laptop.
    Code:
    On batteries:
    
    [gene@Mobile-PC Fedora]$ cpufreq-info
    ...
    analyzing CPU 0:
    ...
      current policy: frequency should be within 800 MHz and 1.33 GHz.
                      The governor "conservative" may decide which speed to use
                      within this range.
    ...
    
    On AC power:
    
    [gene@Mobile-PC ~]$ cpufreq-info
    ...
    analyzing CPU 0:
    ...
      current policy: frequency should be within 800 MHz and 1.73 GHz.
                      The governor "performance" may decide which speed to use
                      within this range.
    ...
    That's it for laptops that support cpu frequency scaling. I have written a version of the script in Step 1 that uses passive thermal cooling to lower the cpu frequency. If there is any interest from owners of older laptops that don't support cpu frequency scaling, I can post it.

    Also, if you're laptop is running hot on ac power because of high load or ambient temperature, you can use:
    Code:
    sudo pm-powersave true
    This will lower the cpu temperature by 10C or more with only a small impact on performance.
    Last edited by dd_wizard; 28th July 2010 at 08:05 PM. Reason: Fix problem with unrelated CPUs.

  2. #2
    Join Date
    Apr 2013
    Location
    Down Under
    Posts
    1
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Re: How to extend battery life by automatically changing cpu governors.

    Thank you!

  3. #3
    Join Date
    Sep 2009
    Posts
    2,209
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Re: How to extend battery life by automatically changing cpu governors.

    You're welcome!

    dd_wizard

Similar Threads

  1. Using acpi: thermal/sysfs-api To Extend Battery Life
    By dd_wizard in forum Hardware & Laptops
    Replies: 2
    Last Post: 5th February 2010, 12:56 AM
  2. Tips on how to extend battery life
    By infernosoft in forum Hardware & Laptops
    Replies: 17
    Last Post: 11th September 2009, 08:16 AM
  3. Battery life
    By mitchell2345 in forum Hardware & Laptops
    Replies: 23
    Last Post: 27th January 2007, 07:48 PM
  4. Battery Life
    By Cruzader in forum Hardware & Laptops
    Replies: 14
    Last Post: 7th July 2005, 05:28 PM

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •