Difference between revisions of "Power saving"
m (→Laptop Mode: fixed template) |
m (→Kernel parameters: sysctl.conf is deprecated) |
||
(10 intermediate revisions by 4 users not shown) | |||
Line 3: | Line 3: | ||
{{Article summary text|Configuration and tools for saving power.}} | {{Article summary text|Configuration and tools for saving power.}} | ||
{{Article summary heading|Related}} | {{Article summary heading|Related}} | ||
+ | {{Article summary wiki|Power Management}} | ||
{{Article summary wiki|CPU Frequency Scaling}} | {{Article summary wiki|CPU Frequency Scaling}} | ||
+ | {{Article summary wiki|Hybrid graphics}} | ||
{{Article summary wiki|Kernel modules}} | {{Article summary wiki|Kernel modules}} | ||
− | {{Article summary wiki| | + | {{Article summary wiki|sysctl}} |
− | |||
{{Article summary wiki|udev}} | {{Article summary wiki|udev}} | ||
{{Article summary end}} | {{Article summary end}} | ||
Line 75: | Line 76: | ||
=== Kernel parameters === | === Kernel parameters === | ||
− | This section uses configs in {{ic|/etc/sysctl.d/}}, which is ''"a drop-in directory for kernel sysctl parameters | + | This section uses configs in {{ic|/etc/sysctl.d/}}, which is ''"a drop-in directory for kernel sysctl parameters."'' See [http://0pointer.de/blog/projects/the-new-configuration-files The New Configuration Files] and more specifically [http://0pointer.de/public/systemd-man/sysctl.d.html systemd's sysctl.d man page] for more information. |
==== Disabling NMI watchdog ==== | ==== Disabling NMI watchdog ==== | ||
Line 89: | Line 90: | ||
Increasing the VM dirty writeback time can help to aggregate I/O together - reducing disk writes, and decreasing power usage: | Increasing the VM dirty writeback time can help to aggregate I/O together - reducing disk writes, and decreasing power usage: | ||
− | {{hc|/etc/sysctl.conf| | + | {{hc|/etc/sysctl.d/dirty.conf|2=vm.dirty_writeback_centisecs = 1500}} |
To do the same for journal commits with ext4 and some other filesystems, use {{ic|1=commit=15}} as a parameter in [[fstab]] or with the {{ic|rootflags}} [[kernel parameter]]. | To do the same for journal commits with ext4 and some other filesystems, use {{ic|1=commit=15}} as a parameter in [[fstab]] or with the {{ic|rootflags}} [[kernel parameter]]. | ||
Line 97: | Line 98: | ||
See the [https://www.kernel.org/doc/Documentation/laptops/laptop-mode.txt kernel documentation] on the laptop mode 'knob.' ''"A sensible value for the knob is 5 seconds."'' | See the [https://www.kernel.org/doc/Documentation/laptops/laptop-mode.txt kernel documentation] on the laptop mode 'knob.' ''"A sensible value for the knob is 5 seconds."'' | ||
− | {{hc|/etc/sysctl.conf|2=vm.laptop_mode = 5}} | + | {{hc|/etc/sysctl.d/laptop.conf|2=vm.laptop_mode = 5}} |
=== Network interfaces === | === Network interfaces === | ||
Line 103: | Line 104: | ||
[[Wikipedia:Wake-on-LAN|Wake-on-LAN]] can be a useful feature, but if you're not making use of it then it's simply draining extra power waiting for a magic packet while in suspend. Disabling for all Ethernet interfaces: | [[Wikipedia:Wake-on-LAN|Wake-on-LAN]] can be a useful feature, but if you're not making use of it then it's simply draining extra power waiting for a magic packet while in suspend. Disabling for all Ethernet interfaces: | ||
− | {{hc|/etc/udev/rules.d/70-disable_wol.rules|2=ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth*" RUN+="/usr/bin/ethtool -s %k wol d"}} | + | {{hc|/etc/udev/rules.d/70-disable_wol.rules|2=ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth*", RUN+="/usr/bin/ethtool -s %k wol d"}} |
To enable powersaving on all wireless interfaces: | To enable powersaving on all wireless interfaces: | ||
− | {{hc|/etc/udev/rules.d/70-wifi-powersave.rules|2=ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan*" RUN+="/usr/bin/iw dev %k set power_save on"}} | + | {{hc|/etc/udev/rules.d/70-wifi-powersave.rules|2=ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan*", RUN+="/usr/bin/iw dev %k set power_save on"}} |
In these examples, {{ic|%k}} is a specifier for the kernel name of the matched device. For example, if it finds that the rule is applicable to {{ic|wlan0}}, the {{ic|%k}} specifier will be replaced with {{ic|wlan0}}. To apply the rules to only a particular interface, just replace the pattern {{ic|eth*}} and specifier {{ic|%k}} with the desired interface name. For more information, see [http://www.reactivated.net/writing_udev_rules.html Writing udev rules]. | In these examples, {{ic|%k}} is a specifier for the kernel name of the matched device. For example, if it finds that the rule is applicable to {{ic|wlan0}}, the {{ic|%k}} specifier will be replaced with {{ic|wlan0}}. To apply the rules to only a particular interface, just replace the pattern {{ic|eth*}} and specifier {{ic|%k}} with the desired interface name. For more information, see [http://www.reactivated.net/writing_udev_rules.html Writing udev rules]. | ||
Line 128: | Line 129: | ||
{{hc|/etc/udev/rules.d/usb_power_save.rules|<nowiki> | {{hc|/etc/udev/rules.d/usb_power_save.rules|<nowiki> | ||
− | ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control" ATTR{power/control}="auto" | + | ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto" |
− | ACTION=="add", SUBSYSTEM=="usb", TEST=="power/autosuspend" ATTR{power/autosuspend}="2" | + | ACTION=="add", SUBSYSTEM=="usb", TEST=="power/autosuspend", ATTR{power/autosuspend}="2" |
</nowiki>}} | </nowiki>}} | ||
Line 144: | Line 145: | ||
# echo auto | tee /sys/bus/i2c/devices/*/power/control > /dev/null | # echo auto | tee /sys/bus/i2c/devices/*/power/control > /dev/null | ||
# echo auto | tee /sys/bus/spi/devices/*/power/control > /dev/null | # echo auto | tee /sys/bus/spi/devices/*/power/control > /dev/null | ||
+ | |||
+ | === Mount options === | ||
+ | |||
+ | You might want to use the {{ic|noatime}} option, see [[Fstab#atime options]] for more information. | ||
+ | |||
+ | === CD/DVD spin down === | ||
+ | |||
+ | {{Expansion|something similar without using udisks?}} | ||
+ | |||
+ | To allow the CD/DVD rom to spin down after a while using [[udisks]]: | ||
+ | |||
+ | # udisks --inhibit-polling /dev/sr0 | ||
== Tools and scripts == | == Tools and scripts == | ||
Line 151: | Line 164: | ||
There are many scripts and tools which make use of the various settings described in the previous sections. These are notably: | There are many scripts and tools which make use of the various settings described in the previous sections. These are notably: | ||
+ | * [[Powertop]] is a handy utility from Intel that displays which hardware/processes are using the most power on your system, and provides instructions on how to stop or remove power-wasting services. It's report functionality can also be used to identify the relevant parameters for the system. | ||
* [[TLP]] | * [[TLP]] | ||
* [[Powerdown]] | * [[Powerdown]] | ||
Line 164: | Line 178: | ||
=== Using a script and an udev rule === | === Using a script and an udev rule === | ||
− | Since systemd users can suspend and hibernate through {{ic|systemctl suspend}} or {{ic|systemctl hibernate}} and handle acpi events with {{ic|/etc/systemd/logind.conf}}, it might be interesting to remove pm-utils and acpid. | + | Since systemd users can suspend and hibernate through {{ic|systemctl suspend}} or {{ic|systemctl hibernate}} and handle acpi events with {{ic|/etc/systemd/logind.conf}}, it might be interesting to remove [[pm-utils]] and [[acpid]]. There's just one thing systemd can't 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: |
{{hc|/etc/udev/rules.d/powersave|2=<nowiki> | {{hc|/etc/udev/rules.d/powersave|2=<nowiki> | ||
Line 171: | Line 185: | ||
</nowiki>}} | </nowiki>}} | ||
− | {{Note| | + | {{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 {{ic|/usr/local/bin/}}).}} |
− | Examples of powersave scripts can be found here | + | |
+ | Examples of powersave scripts can be found here: {{AUR|powerdown}}, {{AUR|powerconf}}, [https://github.com/Unia/powersave powersave]. | ||
The above udev rule should work as expected, but if your power settings aren't updated after a suspend or hibernate cycle, you should add a script in {{ic|/usr/lib/systemd/system-sleep/}} with the following contents: | The above udev rule should work as expected, but if your power settings aren't updated after a suspend or hibernate cycle, you should add a script in {{ic|/usr/lib/systemd/system-sleep/}} with the following contents: | ||
Line 189: | Line 204: | ||
fi | fi | ||
;; | ;; | ||
− | esac | + | esac |
exit 0 | exit 0 | ||
</nowiki>}} | </nowiki>}} |
Revision as of 23:25, 25 September 2013
Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary end 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.
Contents
- 1 Configuration
- 2 Tools and scripts
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.
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
/etc/modprobe.d/audio_powersave.conf
options snd_hda_intel power_save=1
for Intel, or use
options snd_ac97_codec power_save=1
for ac97.
Active state power management
To verify that ASPM is enabled:
$ cat /sys/module/pcie_aspm/parameters/policy
[default] performance powersave
Either [default]
or [powersave]
means you do not need to force it on. Otherwise, it's either unsupported or broken on your hardware, or has to be forced on with pcie_aspm=force
on the kernel line.
- Forcing on ASPM can cause a freeze/panic, so make sure you have a way to undo the option if it doesn't work.
- On systems that don't support it forcing on ASPM can even increase power consumption.
Backlight
When system starts, screen backlight is set to maximum by default. This can be fixed by specifying backlight level in the following udev rule:
/etc/udev/rules.d/backlight.rules
## SET BACKLIGHT SUBSYSTEM=="backlight", ACTION=="add", KERNEL=="acpi_video0", ATTR{brightness}="1"
See Backlight for more information.
Bluetooth
Blacklist thehci_usb
module if the driver is loaded automatically.
Alternatively, blacklist the btusb
and bluetooth
modules.
Another variant is to rfkill it:
# rfkill block bluetooth
Or with udev rule:
/etc/udev/rules.d/bt.rules
## DISABLE BLUETOOTH SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"
Web-Camera
If you won't 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 and 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 VM dirty writeback time can help to aggregate I/O together - reducing disk writes, and decreasing power usage:
/etc/sysctl.d/dirty.conf
vm.dirty_writeback_centisecs = 1500
To do the same for journal commits with ext4 and some other filesystems, use commit=15
as a parameter in fstab or with the rootflags
kernel parameter.
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're not making use of it then it's 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
.
PCI Runtime Power Management
/etc/udev/rules.d/pci_pm.rules
ACTION=="add", SUBSYSTEM=="pci", ATTR{power/control}="auto"
SATA Active Link Power Management
/etc/udev/rules.d/hd_power_save.rules
ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"
USB Autosuspend
To enable USB autosuspend after 2 seconds of inactivity:
/etc/udev/rules.d/usb_power_save.rules
ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto" ACTION=="add", SUBSYSTEM=="usb", TEST=="power/autosuspend", ATTR{power/autosuspend}="2"
Other option is to use modprobe:
/etc/modprobe.d/modprobe.conf
options usbcore autosuspend=2
Device Power Management
# echo auto | tee /sys/bus/i2c/devices/*/power/control > /dev/null # echo auto | tee /sys/bus/spi/devices/*/power/control > /dev/null
Mount options
You might want to use the noatime
option, see Fstab#atime options for more information.
CD/DVD spin down
To allow the CD/DVD rom to spin down after a while using udisks:
# udisks --inhibit-polling /dev/sr0
Tools and scripts
Packages
There are many scripts and tools which make use of the various settings described in the previous sections. These are notably:
- Powertop is a handy utility from Intel that displays which hardware/processes are using the most power on your system, and provides instructions on how to stop or remove power-wasting services. It's report functionality can also be used to identify the relevant parameters for the system.
- TLP
- Powerdown
- powerconfAUR
- ftw-gitAUR
- Laptop Mode Tools
- pm-utils
If you do not want to take care of the settings by yourself it is recommended to use these tools. But be aware of running only one of these tools to avoid possible conflicts as they all work more or less similar.
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's just one thing systemd can't 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
SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/path/to/your/script true" SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/path/to/your/script false"
/usr/local/bin/
).Examples of powersave scripts can be found here: powerdownAUR, powerconfAUR, powersave.
The above udev rule should work as expected, but if your power settings aren't 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
Don't forget to make it executable!
Now you don't 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