Jade Dungeon

Linux电源管理

内核支持

Ubuntu默认支持acpi,如果你自定义编译了内核,记住要把电源管理相关的模块选上

   Power Management Options --->
  [*] Power Management Support
  [ ] Software Suspend

  ACPI( Advanced Configuration and Power Interface ) Support --->
    [*] ACPI Support
    [ ]   Sleep States
    [ ]     /proc/acpi/sleep (deprecated)
    [*]   AC Adapter
    [*]   Battery
    <M>   Button
    <M>   Video
    [ ]   Generic Hotkey
    <M>   Fan
    <M>   Processor
    <M>     Thermal Zone
    < >   ASUS/Medion Laptop Extras
    < >   IBM ThinkPad Laptop Extras
    < >   Toshiba Laptop Extras
    (0)   Disable ACPI for systems before Jan 1st this year
    [ ]   Debug Statements
    [*]   Power Management Timer Support
    < >   ACPI0004,PNP0A05 and PNP0A06 Container Driver (EXPERIMENTAL)

  CPU Frequency Scaling --->
    [*] CPU Frequency scaling
    [ ]   Enable CPUfreq debugging
    < >   CPU frequency translation statistics
    [ ]     CPU frequency translation statistics details
          Default CPUFreq governor (userspace)
    <*>   'performance' governor
    <*>   'powersave' governor
    <*>   'ondemand' cpufreq policy governor
    <*>   'conservative' cpufreq governor
    <*>   CPU frequency table helpers
    <M> ACPI Processor P-States driver
    <*> CPUFreq driver for your processor

统计电力消耗

sudo apt-get install powertop powertop-1.13

PowerTOP 是一个 Linux 工具,用于诊断电量消耗和电源管理的问题。

它是由 Intel 开发的,可以在内核、用户空间和硬件中启用各种节电模式。

除了作为一个一个诊断工具之外,PowweTop 还有一个交互模式,可以让你实验 Linux 发行版没有启用的各种电源管理设置。

它也能监控进程,并展示其中哪个正在使用 CPU,以及从休眠状态页将其唤醒,也可以找出电量消耗特别高的应用程序。

sudo apt install powertop

PowerTOP 需要超级用户权限,所以在 Linux 系统中以 root 身份运行 PowerTOP 工具。

默认情况下其显示 “概览” 页,在这里我们可以看到所有设备的电量消耗情况,也可以看到系统的唤醒秒数。

$ sudo powertop

PowerTOP v2.9     Overview   Idle stats   Frequency stats   Device stats   Tunables                                     

The battery reports a discharge rate of 12.6 W
The power consumed was 259 J
The estimated remaining time is 1 hours, 52 minutes

Summary: 1692.9 wakeups/second,  0.0 GPU ops/seconds, 0.0 VFS ops/sec and 54.9% CPU use

                Usage       Events/s    Category       Description
              9.3 ms/s     529.4        Timer          tick_sched_timer
            378.5 ms/s     139.8        Process        [PID 2991] /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -prefsLen 8314 -prefMapSize 173895 -schedulerPrefs 00
              7.5 ms/s     141.7        Timer          hrtimer_wakeup
              ....
              ....
              ....
              2.4 ms/s      0.00        Interrupt      [1] timer(softirq)
             13.4 us/s       0.9        Process        [PID 9] [ksoftirqd/0]

 Exit |  /  Navigate |

最上面一排是不同的标签页,可以切换不同类别的信息详性。 你可以使用TabShift+Tab在它们之间切换。

  • 概览。页默认情况下其显示,在这里我们可以看到所有设备的电量消耗情况,也可以看到系统的唤醒秒数。
  • 空闲状态页。它会显示处理器的各种信息。
  • 频率状态页。它会显示 CPU 的主频。
  • 可调整状态页。这个页面是个重要区域,可以为你的笔记本电池优化提供建议。
  • 可调整状态页。这个页面是个重要区域,可以为你的笔记本电池优化提供建议。

还可以生成HTML格式的报表:

运行如下命令生成 PowerTop 的 HTML 报告。

$ sudo powertop --html=powertop.html
modprobe cpufreq_stats failedLoaded 100 prior measurements
Cannot load from file /var/cache/powertop/saved_parameters.powertop
File will be loaded after taking minimum number of measurement(s) with battery only
RAPL device for cpu 0
RAPL Using PowerCap Sysfs : Domain Mask f
RAPL device for cpu 0
RAPL Using PowerCap Sysfs : Domain Mask f
Devfreq not enabled
glob returned GLOB_ABORTED
Cannot load from file /var/cache/powertop/saved_parameters.powertop
File will be loaded after taking minimum number of measurement(s) with battery only
Preparing to take measurements
To show power estimates do 182 measurement(s) connected to battery only
Taking 1 measurement(s) for a duration of 20 second(s) each.
PowerTOP outputing using base filename powertop.html

自动调整模式。这个功能可以将所有可调整选项从BAD设置为GOOD, 这可以提升Linux中的笔记本电池寿命。

$ sudo powertop --auto-tune
modprobe cpufreq_stats failedLoaded 210 prior measurements
Cannot load from file /var/cache/powertop/saved_parameters.powertop
File will be loaded after taking minimum number of measurement(s) with battery only
RAPL device for cpu 0
RAPL Using PowerCap Sysfs : Domain Mask f
RAPL device for cpu 0
RAPL Using PowerCap Sysfs : Domain Mask f
Devfreq not enabled
glob returned GLOB_ABORTED
Cannot load from file /var/cache/powertop/saved_parameters.powertop
File will be loaded after taking minimum number of measurement(s) with battery only
To show power estimates do 72 measurement(s) connected to battery only
Leaving PowerTOP

电源优化工具:tlp

sudo apt install tlp tlp-rdw # 安装

# 开启
systemctl start tlp
systemctl enable tlp

由于 Ubuntu 21.04 会默认安装power-profiles-daemon.service服务, 可能会与 tlp 服务冲突。需执行以下命令禁用:

sudo systemctl mask power-profiles-daemon.service

作者:赵紫龙 链接:https://www.zhihu.com/question/492204218/answer/2169042305 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

acpi

# The acpi-support package is intended as "glue" to make special functions of
# laptops work. Specifically, it translates special function keys for some
# laptop models into actions or generic function key presses.
#
# Note: to enable "laptop mode" (to spin down your hard drive for longer
# periods of time), install the laptop-mode-tools package and configure
# it in . 

笔记本电池充放电状态可以通过以下两个命令来识别。

使用acpi命令。

$ acpi -b
Battery 0: Discharging, 71%, 00:58:39 remaining

使用upower命令。

$ upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep -w 'state|percentage' | awk '{print $2}'
discharging
64%

自制电量报警脚本

电池电量提醒

当电池电量高于 95% 或低于 20% 时,用 Shell 脚本发送警报

这个脚本在启动时在后台运行,每分钟检查一次电池状态,然后在电池电量超过 95% 或放电时电量低于 20% 时发送通知。

警报会直到你的电池电量超过 20% 或低于 95% 时才会停止。

$ sudo vi /opt/scripts/battery-status.sh
#!/bin/bash
while true
do
  battery_level=`acpi -b | grep -P -o '[0-9]+(?=%)'`
   if [ $battery_level -ge 95 ]; then
      notify-send "Battery Full" "Level: ${battery_level}%"
      paplay /usr/share/sounds/freedesktop/stereo/suspend-error.oga
    elif [ $battery_level -le 20 ]; then
      notify-send --urgency=CRITICAL "Battery Low" "Level: ${battery_level}%"
      paplay /usr/share/sounds/freedesktop/stereo/suspend-error.oga
  fi
 sleep 60
done

脚本完成后,设置可执行权限:

$ sudo chmod +x /opt/scripts/battery-status.sh

最后,将该脚本添加到用户配置文件的底部。对于全局范围来说, 你需要在/etc/profile文件中添加该脚本:

$ vi /home/magi/.profile

/opt/scripts/battery-status.sh &

重启你的 Linux 系统来检查这点。

$ sudo reboot

连接电源时的电量提醒

当电池充电(高于 95%)或放电(低于 20%)时发送通知的 Shell 脚本

这个脚本与上面的脚本类似,但它是由交流适配器负责。

如果你插上了交流适配器,而且电池的电量超过 95%,它就会发出一个带有声音的通知, 但是这个通知不会停止,直到你拔掉交流适配器。

如果你拔掉交流适配器,你将永远不会再看到通知,直到你的电池电量下降到 20%。

$ sudo vi /opt/scripts/battery-status-1.sh
#!/bin/bash
   while true
    do
       export DISPLAY=:0.0
       battery_level=`acpi -b | grep -P -o '[0-9]+(?=%)'`
       if on_ac_power; then
           if [ $battery_level -ge 95 ]; then
              notify-send "Battery Full" "Level: ${battery_level}% "
              paplay /usr/share/sounds/freedesktop/stereo/suspend-error.oga
           fi
       else
           if [ $battery_level -le 20 ]; then
              notify-send --urgency=CRITICAL "Battery Low" "Level: ${battery_level}%"
              paplay /usr/share/sounds/freedesktop/stereo/suspend-error.oga
           fi
       fi
     sleep 60
done

脚本完成后,设置执行权限:

$ sudo chmod +x /opt/scripts/battery-status-1.sh

最后将脚本添加到用户配置文件的底部。对于全局范围来说,你需要在/etc/profile文件中添加该脚本。

$ vi /home/magi/.profile

/opt/scripts/battery-status-1.sh &

重启系统来检查:

$ sudo reboot

laptop-mode-tools

sudo apt-get install laptiop-mode-tools

配置文件在/etc/laptop-mode/laptop-mode.conf

常用的配置选项:

# Enable laptop mode when on battery power.
# 在电池模式下启动laptop_mode
ENABLE_LAPTOP_MODE_ON_BATTERY=1


# Disable all data loss sensitive features when the battery level (in % of the
# battery capacity) reaches this value.
# 在低电量的情况下禁止laptop-mode
MINIMUM_BATTERY_CHARGE_PERCENT=10

# Disable data loss sensitive features when the battery reports its state
# as "critical".
# 在极底电量下禁止laptop_mode
DISABLE_LAPTOP_MODE_ON_CRITICAL_BATTERY_LEVEL=8

# The drives that laptop mode controls.
# Separate them by a space, e.g. HD="/dev/hda /dev/hdb". The default is a
# wildcard, which will get you all your IDE and SCSI/SATA drives.
# HD="/dev/[hs]d[abcdefgh]"
# 设定需要控制的硬盘
HD="/dev/hda"

# Should laptop mode tools control readahead?
# 启动 readahead
CONTROL_READAHEAD=1

# Read-ahead, in kilobytes. You can spin down the disk while playing MP3/OGG
# by setting the disk readahead to a reasonable size, e.g. 3072 (3 MB).
# Effectively, the disk will read a complete MP3 at once, and will then spin
# down while the MP3/OGG is playing. Don't set this too high, because the
# readahead is applied to _all_ files that are read from disk.
# 设定laptop_mode下的readahead buffer,如果是听mp3 3-5M,如果是看电影 8-10M
LM_READAHEAD=4096
NOLM_READAHEAD=128

# Should laptop mode tools control the maximum CPU frequency?
# 启动CPU频率控制
CONTROL_CPU_FREQUENCY=1

# Legal values are "slowest" for the slowest speed that your
# CPU is able to operate at, "fastest" for the fastest speed,
# "medium" for some value in the middle, or any value listed in
# /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies.
# 设定电池模式下的CPU频率
BATT_CPU_MAXFREQ=slowest
BATT_CPU_MINFREQ=slowest
BATT_CPU_GOVERNOR=ondemand

现在可以通过下面命令查看laptop-mode的状态:

sudo /etc/init.d/laptop-mode status

CPU

这部分的操作不推荐人工配置,之前的laptop-mode可以方便地设置。

移动版本的CPU支持频率和电压的动态调整,在大多数情况下你的CPU是没必要全速运行的,尤其在电池支持下,我们可以强制使CPU运行在最低频率。

在linux 2.6以后的内核就支持cpu频率的动态调整,有下面5种模式:

  • performance将CPU频率设定在支持的最高频率,而不动态调节.
  • powersave将CPU频率设置为最低
  • ondemand快速动态调整CPU频率, Pentuim M的CPU可以使用
  • conservativeondemand不同,平滑地调整CPU频率,适合于用电池工作时.
  • userspace用户模式,也就是长期以来都在用的那个模式。可以通过手动编辑配置文件进行配置

先安装相关软件cpufrequtils

sudo apt-get install cpufrequtils

需要进入那个模式直接修改proc文件,比如要进入powersave模式:

sudo -s
echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

显卡

显卡的驱动可以设置功耗模式。

除了显卡驱动里设置,还可以设置显卡动态调整频率。修改/etc/X11/xorg.conf

Section "Device"
[...]
Option      "DynamicClocks" "on"
EndSection

显示器

如上图所示,LCD是最耗电的部件,这一节我们讨论如何降低LCD的耗电

首先,尽可能调低亮度,这个不多说手动调节就可以了; 然后设置 DPMS(Display Power Management Signaling)

修改/etc/X11/xorg.conf文件:

  Section "ServerLayout"
  Identifier  [...]
  [...]
  Option  "BlankTime"  "5"  # Blank the screen after 5 minutes (Fake)
  Option  "StandbyTime"  "10"  # Turn off screen after 10 minutes (DPMS)
  Option  "SuspendTime"  "20"  # Full suspend after 20 minutes
  Option  "OffTime"  "30"  # Turn off after half an hour
  [...]
  EndSection

  [...]

  Section "Monitor"
  Identifier  [...]
  Option  "DPMS"  "true"
  [...]
  EndSection

但似乎xorg的dpms有bug不能关闭LCD,只能把屏幕变黑。 google搜索了一下发现是和acpi冲突只要重新启动acpi就可以了。 手动设置屏幕关闭,代码:

sudo /etc/init.d/acpid restart
xset dpms force off

如果要暂时关闭屏幕:

sleep 1 && xset dpms force off

记往,按完回车后,不要碰键盘鼠标,静等一秒。然后,你的屏幕就被关掉了。 这是真的关掉,而非锁定屏幕或者弄了一个黑屏的屏幕保护──这可是不耗电模式。

那么如何重新开启屏幕?很简单,碰一下键盘或鼠标即可。

为什么要睡眠一秒呢?因为如果不睡眠,直接用xset dpms force off的话, 在你按回车关掉屏幕的那一刹那,屏幕又被点亮了──除非你松手极快!

屏保与屏幕关闭

xset q可以查看当前屏保的设置情况,黑屏方式的屏保有两种状态:

方法一:

xset 的s参数后面可接两个数字参数,前一个即是进入屏保的秒数, 如果想立刻进入屏保:

xset s 2 600        # 这样,两秒种后进入屏保。

如果想恢复默认值,即比较长的时间进入屏保:

xset s 0 600

取消屏保:

xset s off

方法二:

dpms 是屏保的另一种状态,将其断电,与关机后的显示器同样的效果:

开启:

xset dpms 1 1 2

取消:

xset -dpms

磁盘减耗

我们先做一个粗略的计算,你的笔记本如果硬盘在节能模式下运行,能延长多少时间。

cat /proc/acpi/battery/BATx/info

典型的输出结果为:

present:                 yes
design capacity:         6000 mAh
last full capacity:      3808 mAh
battery technology:      rechargeable
design voltage:          14800 mV
design capacity warning: 209 mAh
design capacity low:     133 mAh
capacity granularity 1:  10 mAh
capacity granularity 2:  25 mAh
model number:            JM-6
serial number:           xxxxxxxxxxxxxxx
battery type:            LION
OEM info:                Hewlett-Packard
  • 电池功率为\(3808 mAh x 14800 mV = 56.3584 Wh == 56wh\)
  • 电池支持时间4小时
  • 移动硬盘正常功率: 2.4w
  • 移动硬盘standby功率: 0.25w (根据自己型号google自己搜索)
  • \(56/4 = 14 w\)
  • \(14 - (2.4-0.25) = 11.85 w\)
  • \(56 / 11.85 = 4.725738397\)小时
  • 延长了0.73 小时,大约44分钟
  • 硬盘是不可能一直处于standby状态的,实际的情况肯定会短一些。

下面我们讨论如何使硬盘更长时间的处于standby模式下

我们可以laptop-mode 软件达到这个效果。

硬盘还有其他的优化空间:

使用tmpfs把临时文件放入内存中。tmpfs 就象虚拟磁盘(ramdisk), 但又不完全一样。象虚拟磁盘一样,tmpfs 可以使用您的 RAM, 但它也可以使用您的交换分区来存储。而且传统的虚拟磁盘是个块设备, 并需要一个 mkfs 之类的命令才能真正地使用它,tmpfs 是一个文件系统, 而不是块设备;您只是安装它,它就可以使用了。

总而言之,这让 tmpfs 成为我有机会遇到的最好的基于 RAM 的文件系统。

修改/etc/fstab,把tmpfs mount 到/tmp上,并设置最大上限为32M。 代码:

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
tmpfs           /tmp            tmpfs   size=32m        0       0

如果你内存很多(1G以上)你完全可关闭swap

代码:

sudo swapoff /dev/hdax

现在你的硬盘应该把读写操作降得很低了。

关闭无线网卡

sudo iwconfig wlan0 power off

其他优化

尽量不启动X,使用console 比如看片子的话可以在console下用

mplayer -vo fbdev your.movie.file

听音乐可以使用mpg123 ogg123等等。

自动优化脚本

for x in /proc/acpi/ac_adapter/*; do
    grep -q off-line $x/state

    if [ $? = 0 ] && [ x$1 != xstop ]; then   
   for SCRIPT in /etc/acpi/battery.d/*.sh; do
       . $SCRIPT
   done
   if [ x$ENABLE_LAPTOP_MODE = xtrue ]; then
       (sleep 5 && laptop_mode_enable)&
   fi
    else
   for SCRIPT in /etc/acpi/ac.d/*.sh; do
       . $SCRIPT
   done
   if [ x$ENABLE_LAPTOP_MODE = xtrue ]; then
       (sleep 5 && laptop_mode_disable)&
   fi
    fi
done

在这段脚本中我们看到如果要让脚本在bettary模式下运行就放在 /etc/acpi/battery.d/目录下,要让脚本在电源模式下于虚拟就把脚本放在 /etc/acpi/ac.d/目录下。

好了既然脚本能自动执行,要实现什么样的节能效果就看你的想象力了。