Reducing power consumption on the HP Probook 4720s and Ubuntu 12.04

As said earlier, Ubuntu 12.04 does a good job with power management on the 4720s. With some manual settings power consumption can be further decreases, albeit not much this time. I wrote this script which takes a parameter:

on: enable power management settings
off: disable power management settings
extra: on + enable extensive power management settings. This is a point of no return, i.e. it unloads modules, disables CPU cores, switches off the wireless lan. I have not found a way to re-enable these, thus a full reboot is required.

#!/bin/sh

COMMAND=$1
DIRECTION="unload"

switch_module () {
    case $DIRECTION in
    "unload")
        rmmod -f $1 || echo cannot remove $1
    ;;
    "load")
        insmod $1 || echo cannot insert $1
    ;;
    esac
}

switch_service () {
    case $DIRECTION in
    "unload")
        /etc/init.d/$1 stop || echo cannot stop $1
    ;;
    "load")
        /etc/init.d/$1 start || echo cannot start $1
    ;;
    esac
}

# Increase filesystem write cache timeout
echo 1500 > /proc/sys/vm/dirty_writeback_centisecs

case $COMMAND in
    on|extra) 
    # Enable power management on all PCI devices
    find /sys/devices/pci* -path "*power/control" -exec bash -c "echo auto > '{}'" \;

    # Increase pulseaudio buffers
    for i in `find /proc/asound/* -path */prealloc`; do echo 4096 > $i; done;

    # Enable power aware CPU scheduler
    echo 1 > /sys/devices/system/cpu/sched_mc_power_savings

    # Enable WLAN power management
    iwconfig wlan0 power on
    iwconfig wlan0 txpower auto

    # Disable NMI watchdog
    echo 0 > /proc/sys/kernel/nmi_watchdog

    # Enable Intel audio power management
    echo 1 > /sys/module/snd_hda_intel/parameters/power_save

    # Enable SATA power management
    for i in /sys/class/scsi_host/host*/link_power_management_policy; do echo min_power > $i; done
    for i in `find /sys/devices/system/cpu/*/cpufreq/scaling_governor`; do echo ondemand > $i; done;
    for i in `find /sys/devices/*/power/control`; do echo auto > $i; done;
    for i in `find /sys/bus/usb/devices/*/power/level`; do echo auto > $i; done;
    for i in `find /sys/bus/usb/devices/*/power/autosuspend`; do echo 2 > $i; done;
    for i in `find /sys/class/scsi_host/host*/link_power_management_policy`; do echo min_power > $i; done
    for i in `find /sys/bus/pci/devices/*/power/control`; do echo auto > $i; done
    for i in `find /sys/bus/i2c/devices/*/power/control`; do echo auto > $i; done
    for i in `find /sys/bus/spi/devices/*/power/control`; do echo auto > $i; done

    # Enable laptop mode tools
    echo 5 > /proc/sys/vm/laptop_mode

    # Override PCIE power management
    echo powersave > /sys/module/pcie_aspm/parameters/policy

    # Disable wake on lan for LAN
    ethtool -s eth0 wol d || echo not setting wol on eth0

    # Stop mysql
    switch_service mysql

    # stop ntp
    switch_service ntp

    # stop cron and anacron
    switch_service cron
    switch_service anacron

    # stop cups
    switch_service cups

    #disable bluetooth
    hciconfig hci0 down || echo skip bluetooth

    # harddisk
    hdparm -B127 /dev/sda    
    ;;
esac
case $COMMAND in
extra)    
    # stop irqbalance
    switch_service irqbalance

    # stop pulseaudio
    switch_service pulseaudio

    #disable USB polling
    (udisks --inhibit-all-polling)&

    #disable syndaemon keyboard polling
    killall syndaemon

    #disable update notifier
    killall update-notifier

    # network
    switch_service winbind
    switch_service network-manager

    #disable CPUs
    echo 0 > /sys/devices/system/cpu/cpu1/online
    echo 0 > /sys/devices/system/cpu/cpu2/online
    echo 0 > /sys/devices/system/cpu/cpu3/online

    switch_module btusb
    switch_module bluetooth
    switch_module hp-wmi
    switch_module parport
    switch_module joydev
    switch_module lp
    switch_module ppdev
    switch_module parport
    #switch_module ums_realtek
    #switch_module usb_storage
    switch_module r8169
    switch_module vboxpci
    switch_module vboxnetadp
    switch_module vboxnetflt
    switch_module vboxdrv  
    switch_module snd_hda_codec_hdmi
    switch_module mei
    switch_module rt2800pci
    switch_module rt2800lib
    switch_module rt2x00pci
    switch_module rt2x00lib
    switch_module mac80211 
    switch_module cfg80211
    switch_module uas
    switch_module wmi
    switch_module msr
    switch_module video
    ;;
off)
    DIRECTION="load"
        # Enable power management on all PCI devices
    find /sys/devices/pci* -path "*power/control" -exec bash -c "echo off > '{}'" \;

    # Enable power aware CPU scheduler
    echo 0 > /sys/devices/system/cpu/sched_mc_power_savings

    # Enable WLAN power management
    iwconfig wlan0 power off
    iwconfig wlan0 txpower auto

    # Enable Intel audio power management
    echo 0 > /sys/module/snd_hda_intel/parameters/power_save

    # Enable SATA power management
    for i in /sys/class/scsi_host/host*/link_power_management_policy; do echo max_performance > $i; done

    # Enable laptop mode tools
    echo 1 > /proc/sys/vm/laptop_mode

    # Override PCIE power management
    echo performance > /sys/module/pcie_aspm/parameters/policy

    # Disable wake on lan for LAN
    ethtool -s eth0 wol u || echo not setting wol on eth0

    # start mysql
    switch_service mysql

    # start ntp
    switch_service ntp

    # start cron and anacron
    switch_service cron
    switch_service anacron

    # start cups
    switch_service cups

    # harddisk
    hdparm -B255 /dev/sda

    #enable bluetooth
    hciconfig hci0 up || echo skip bluetooth

    # network
    switch_service winbind
    switch_service network-manager

    switch_module btusb
    switch_module bluetooth
    switch_module hp-wmi
    switch_module parport
    switch_module joydev
    switch_module lp
    switch_module ppdev
    switch_module parport
    #switch_module ums_realtek
    #switch_module usb_storage
    switch_module r8169
    switch_module vboxpci
    switch_module vboxnetadp
    switch_module vboxnetflt
    switch_module vboxdrv  
    switch_module snd_hda_codec_hdmi
    switch_module mei
    switch_module rt2800pci
    switch_module rt2800lib
    switch_module rt2x00pci
    switch_module rt2x00lib
    switch_module mac80211 
    switch_module cfg80211
    switch_module uas
    switch_module wmi
    switch_module msr
    switch_module video
    ;;
esac

2 thoughts on “Reducing power consumption on the HP Probook 4720s and Ubuntu 12.04

  1. Hello Nurian,
    I upgraded yesterday to 12.10 and can't check how much the script did for 12.04. I remeber that with idle load 12.04 used to consume about 12.5 watt on the 4720s, I think with the script it went down to 12 watt with running harddisk and about 10.5 watt with harddisk on standby.

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.