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 |
最上面一排是不同的标签页,可以切换不同类别的信息详性。
你可以使用Tab
和Shift+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可以使用 -
conservative
与ondemand
不同,平滑地调整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/
目录下。
好了既然脚本能自动执行,要实现什么样的节能效果就看你的想象力了。