Power saving - ArchWiki

# Power saving

Related articles

- Power management
- CPU frequency scaling
- Hybrid graphics
- Kernel modules
- sysctl
- udev

This article covers the configuration needed to turn on power saving features. Almost all of the features listed here are worth using whether or not the computer is on AC or battery power. Most have negligible performance impact and are just not enabled by default because of commonly broken hardware/drivers. Reducing power usage means reducing heat, which can even lead to higher performance on a modern Intel or AMD CPU, thanks to dynamic overclocking.

## Configuration

If you would like to create your own scripts and power saving settings such as by udev rules you can take the following settings as a reference.

Note: Most rules described below are also managed by tools like TLP and it is unwise to use multigoverning.

### Audio

By default, audio power saving is turned off by most drivers. It can be enabled by setting the `power_save` parameter; a time (in seconds) to go into idle mode. To idle the audio card after one second, create the following file for Intel soundcards.

    /etc/modprobe.d/audio_powersave.conf

    options snd_hda_intel power_save=1

Alternatively, use the following for ac97:

    options snd_ac97_codec power_save=1

Note:

- To retrieve the manufacturer and the corresponding kernel driver which is used for your sound card, run `lspci -k`.
- Toggling the audio card's power state can cause a popping sound or noticeable latency on some broken hardware.

### Backlight

See Backlight.

### Bluetooth

This article or section needs expansion.

Reason: The device should likely be disabled with hciconfig first. (Discuss)

To disable bluetooth completely, blacklist the `btusb` and `bluetooth` modules.

To turn off bluetooth only temporarily, use rfkill:

    # rfkill block bluetooth

Or with udev rule:

    /etc/udev/rules.d/50-bluetooth.rules

    # disable bluetooth
    SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"

Or just enable the instantiated `rfkill-block@bluetooth.service` provided by the rfkill package.

### Web camera

If you will not use integrated web camera then blacklist the `uvcvideo` module.

### Kernel parameters

This section uses configs in `/etc/sysctl.d/`, which is "a drop-in directory for kernel sysctl parameters." See The New Configuration Files and more specifically systemd's sysctl.d man page for more information.

#### Disabling NMI watchdog

The NMI watchdog is a debugging feature to catch hardware hangs that cause a kernel panic. On some systems it can generate a lot of interrupts, causing a noticeable increase in power usage:

    /etc/sysctl.d/disable_watchdog.conf

    kernel.nmi_watchdog = 0

or add `nmi_watchdog=0` to the kernel line to disable it completely from early boot.

#### Writeback Time

Increasing the virtual memory dirty writeback time helps to aggregate disk I/O together, thus reducing spanned disk writes, and increasing power saving. To set the value to 60 seconds (default is 5 seconds):

    /etc/sysctl.d/dirty.conf

    vm.dirty_writeback_centisecs = 6000

To do the same for journal commits on supported filesystems (e.g. ext4, btrfs...), use `commit=60` as a option in fstab.

See also sysctl#Virtual memory for other parameters affecting I/O performance and power saving.

#### Laptop Mode

See the kernel documentation on the laptop mode 'knob.' "A sensible value for the knob is 5 seconds."

    /etc/sysctl.d/laptop.conf

    vm.laptop_mode = 5

### Network interfaces

Wake-on-LAN can be a useful feature, but if you are not making use of it then it is simply draining extra power waiting for a magic packet while in suspend. Disabling for all Ethernet interfaces:

    /etc/udev/rules.d/70-disable_wol.rules

    ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth*", RUN+="/usr/bin/ethtool -s %k wol d"

To enable powersaving on all wireless interfaces:

    /etc/udev/rules.d/70-wifi-powersave.rules

    ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan*", RUN+="/usr/bin/iw dev %k set power_save on"

In these examples, `%k` is a specifier for the kernel name of the matched device. For example, if it finds that the rule is applicable to `wlan0`, the `%k` specifier will be replaced with `wlan0`. To apply the rules to only a particular interface, just replace the pattern `eth*` and specifier `%k` with the desired interface name. For more information, see Writing udev rules.

In this case, the name of the configuration file is important. Due to the introduction of persistent device names via `80-net-name-slot.rules` in systemd v197, it is important that the network powersave rules are named lexicographically before `80-net-name-slot.rules`, so that they are applied before the devices are named e.g. `enp2s0`.

### Bus power management

#### Active State Power Management

If the computer is believed not to support ASPM it and will be disabled on boot:

    $ lspci -vv | grep ASPM.*abled\;

ASPM is handled by the BIOS, if ASPM is disabled it will be because [ref]:

1. The BIOS disabled it for some reason (for conflicts?).
2. PCIE requires ASPM but L0s are optional (so L0s might be disabled and only L1 enabled).
3. The BIOS might not have been programmed for it.
4. The BIOS is buggy.

If believing the computer has support for ASPM it can be forced on for the kernel to handle with the `pcie_aspm=force` kernel parameter.

Warning:

- Forcing on ASPM can cause a freeze/panic, so make sure you have a way to undo the option if it does not work.
- On systems that do not support it forcing on ASPM can even increase power consumption.

To adjust to `powersave` do (the following command will not work unless enabled):

    echo powersave | tee /sys/module/pcie_aspm/parameters/policy

By default it looks like this:

    $ cat /sys/module/pcie_aspm/parameters/policy

    [default] performance powersave

#### PCI Runtime Power Management

    /etc/udev/rules.d/pci_pm.rules

    ACTION=="add", SUBSYSTEM=="pci", ATTR{power/control}="auto"

#### USB autosuspend

The linux kernel can automatically suspend USB devices when they are not in use. This can sometimes save quite a bit of power, however some USB devices are not compatible with USB power saving and start to misbehave (common for USB mice/keyboards). udev rules based on whitelist or blacklist filtering can help to mitigate the problem.

The most simple and likely useless example is enabling autosuspend for all USB devices:

    /etc/udev/rules.d/50-usb_power_save.rules

    ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto"

To allow autosuspend only for devices that are known to work, use simple matching against vendor and product IDs (use lsusb to get these values):

    /etc/udev/rules.d/50-usb_power_save.rules

    # whitelist for usb autosuspend
    ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", ATTR{power/control}="auto"

Alternatively, to blacklist devices that are not working with USB autosuspend and enable it for all other devices:

    /etc/udev/rules.d/50-usb_power_save.rules

    # blacklist for usb autosuspend
    ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", GOTO="power_usb_rules_end"

    ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto"
    LABEL="power_usb_rules_end"

The default autosuspend idle delay time is controlled by the `autosuspend` parameter of the `usbcore` kernel module. To set the delay to 5 seconds instead of the default 2 seconds:

    /etc/modprobe.d/usb-autosuspend.conf

    options usbcore autosuspend=5

Similarly to `power/control`, the delay time can be fine-tuned per device by setting the `power/autosuspend` attribute.

See the Linux kernel documentation for more information on USB power management.

#### SATA Active Link Power Management

Note: This adds latency when accessing a drive that has been idle, so it is one of the few settings that may be worth toggling based on whether you are on AC power.

    /etc/udev/rules.d/hd_power_save.rules

    ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"

Warning: SATA Active Link Power Management can lead to data loss on some devices (e.g. Lenovo T440s is known to suffer this problem)

### Hard disk drive

See hdparm#Power management configuration for drive parameters that can be set.

Power saving is not effective when too many programs are frequently writing to the disk. Tracking all programs, and how and when they write to disk is the way to limit disk usage. Use iotop to see which programs use the disk frequently. See Solid State Drives#Tips for minimizing disk reads/writes for other tips, most of them are not specific to SSDs.

Also little things like setting the noatime option can help. If enough RAM is available, consider disabling or limiting swappiness as it has the possibility to limit a good number of disk writes.

### CD/DVD spin down

This article or section needs expansion.

Reason: something similar without using udisks? (Discuss)

To allow the CD/DVD rom to spin down after a while using udisks:

    # udisks --inhibit-polling /dev/sr0

## Tools and scripts

### Packages

Using these tools can replace setting a lot of settings by hand. Only run one of these tools to avoid possible conflicts as they all work more or less similar. Have a look at the power management category to get an overview on what power management options exist in Archlinux.

These are the more popular scripts and tools designed to help power saving:

- aclidswitch — Simple Power Management tool to define custom lid, brightness and low battery actions depending on the laptop's AC state.

  https://github.com/orschiro/aclidswitch || aclidswitch-git

- acpid — A daemon for delivering ACPI power management events with netlink support.

  http://sourceforge.net/projects/acpid2/ || acpid

- ftw — Script to configure udev rules to save power.

  https://github.com/supplantr/ftw || ftw-git

- indicator-powersave — CPU frequency indicator (bzr version) with system throttle switch.

  https://launchpad.net/indicator-cpufreq || indicator-powersave

- Laptop Mode Tools — Utility to configure laptop power saving settings, considered by many to be the de facto utility for power saving though may take a bit of configuration.

  https://github.com/rickysarraf/laptop-mode-tools || laptop-mode-tools

- pm-utils — Suspend and powerstate setting framework (largely undeveloped now).

  http://pm-utils.freedesktop.org/ || pm-utils

- Powerdown — Scripts that combine different settings to make the computer consume less energy.

  https://github.com/taylorchu/powerdown || powerdown-git

- powertop — A tool to diagnose issues with power consumption and power management to help set power saving settings.

  https://01.org/powertop/ || powertop

- TLP — Advanced power management for Linux.

  http://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html || tlp

### Using a script and an udev rule

Since systemd users can suspend and hibernate through `systemctl suspend` or `systemctl hibernate` and handle acpi events with `/etc/systemd/logind.conf`, it might be interesting to remove pm-utils and acpid. There is just one thing systemd cannot do (as of systemd-204): power management depending on whether the system is running on AC or battery. To fill this gap, you can create a single udev rule that runs a script when the AC adapter is plugged and unplugged:

    /etc/udev/rules.d/powersave.rules

    SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/path/to/your/script true"
    SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/path/to/your/script false"

Note: You can use the same script that pm-powersave uses. You just have to make it executable and place it somewhere else (for example `/usr/local/bin/`).

Examples of powersave scripts can be found here: powerdown, powersave.

The above udev rule should work as expected, but if your power settings are not updated after a suspend or hibernate cycle, you should add a script in `/usr/lib/systemd/system-sleep/` with the following contents:

    /usr/lib/systemd/system-sleep/00powersave

    #!/bin/sh

    case $1 in
        pre) /path/to/your/script false ;;
        post)
    	if cat /sys/class/power_supply/AC0/online | grep 0 > /dev/null 2>&1
    	then
        		/path/to/your/script true
    	else
        		/path/to/your/script false
    	fi
        ;;
    esac
    exit 0

Do not forget to make it executable!

Note: Be aware that AC0 may be different for your laptop, change it if that is the case.

Now you do not need pm-utils anymore. Depending on your configuration, it may be a dependency of some other package. If you wish to remove it anyway, run `pacman -Rdd pm-utils`.

### Print power settings

This script prints power settings and a variety of other properties for USB and PCI devices. Note that root permissions are needed to see all settings.

    #!/bin/bash

    for i in $(find /sys/devices -name "bMaxPower")
    do
    	busdir=${i%/*}
    	busnum=$(<$busdir/busnum)
    	devnum=$(<$busdir/devnum)
    	title=$(lsusb -s $busnum:$devnum)

    	printf "\n\n+++ %s\n  -%s\n" "$title" "$busdir"

    	for ff in $(find $busdir/power -type f ! -empty 2>/dev/null)
    	do
    		v=$(cat $ff 2>/dev/null|tr -d "\n")
    		[[ ${#v} -gt 0 ]] && echo -e " ${ff##*/}=$v";
    		v=;
    	done | sort -g;
    done;

    printf "\n\n\n+++ %s\n" "Kernel Modules"
    for mod in $(lspci -k | sed -n '/in use:/s,^.*: ,,p' | sort -u)
    do
    	echo "+ $mod";
    	systool -v -m $mod 2> /dev/null | sed -n "/Parameters:/,/^$/p";
    done

## See also

- ThinkWiki:How to reduce power consumption
- Manjro BBS topic
- Ubuntu Wiki's Power Saving Tweaks

Category:

- Power management