zhjn0 2012-01-02
默认下Arch Linux系统是没有开启电源节能功能,CPU和显卡(指独立显卡,下同)以最大性能运行,而作为家用或者办公用计算机并不总需要最大性能,所以这会造成一定的能源浪费。本文目标有:
这是一个 Linux 下的开源工具,用于监控系统硬件的温度、电压、风扇转速等状态信息。首先安装它:
$ sudo pacman -S lm_sensors
安装完毕之后要进行一次硬件探测:
$ sudo sensors-detect
程序会询问很多问题,一般情况下一路按回车直至完成即可。
现在可以手动启动 lm_sensors 的守护程序:
$ sudo /etc/rc.d/sensors start
然后运行 sensors 显示硬件状态信息:
$ sensors
(注意,上面的 sensors 是一个程序,而 /etc/rc.d/sensors 是一个守护程序控制脚本。)
没问题的话应该可以看到诸如系统温度、显卡温度、CPU电压和温度、风扇转速等信息,大致如下:
k10temp-pci-00c3 Adapter: PCI adapter temp1: +38.9°C (high = +70.0°C) (crit = +72.0°C, hyst = +70.0°C) radeon-pci-0100 Adapter: PCI adapter temp1: +53.0°C it8718-isa-0228 Adapter: ISA adapter in0: +1.14 V (min = +0.00 V, max = +4.08 V) in1: +1.60 V (min = +0.00 V, max = +4.08 V) in2: +3.28 V (min = +0.00 V, max = +4.08 V) +5V: +3.02 V (min = +0.00 V, max = +4.08 V) in4: +3.09 V (min = +0.00 V, max = +4.08 V) in5: +3.30 V (min = +0.00 V, max = +4.08 V) in6: +4.08 V (min = +0.00 V, max = +4.08 V) in7: +2.11 V (min = +0.00 V, max = +4.08 V) Vbat: +3.14 V fan1: 1717 RPM (min = 10 RPM) fan2: 0 RPM (min = 0 RPM) fan3: 0 RPM (min = 0 RPM) fan5: 0 RPM (min = 0 RPM) temp1: +47.0°C (low = +127.0°C, high = +127.0°C) sensor = thermistor temp2: +42.0°C (low = +127.0°C, high = +70.0°C) sensor = thermal diode temp3: +46.0°C (low = +127.0°C, high = +127.0°C) sensor = thermistor cpu0_vid: +1.050 V
上面数据当中的 +53.0°C 是显卡温度,最后的三个温度应该是CPU相关温度,因为下面准备打开显卡和CPU的节能功能,为了对比效果,可以用笔记下这两项。
最后别忘了将 lm_sensors 守护程序加入 rc.conf ,让系统启动时自动运行。即编辑 /etc/rc.conf 文件,在DAEMONS后面加上“sensors”,如下:
DAEMONS=(syslog-ng dbus networkmanager sensors)
现在新产的CPU和主板一般支持CPU频率动态调节功能,我们可以通过让系统在任务轻松时降低CPU频率以达到节能目的。这个功能可能叫作“Speedstep, Cool and Quiet, PowerNow!, ACPI.” 等,要先在BIOS里打开此项功能(我的主板是技嘉AMD主板,对应的名称是“Cool and Quiet”)。
然后安装CPU频率调节工具:
$ sudo pacman -S cpufrequtils
下面我们需要载入频率调节的内核模块(驱动),通过下面命令可以查看有哪些内核可用:
$ ls /lib/modules/$(uname -r)/kernel/drivers/cpufreq/
对于 intel CPU 可以尝试:
$ sudo modprobe acpi-cpufreq
对于 AMD CPU 可以尝试:
$ sudo modprobe powernow-k8
假如有错误可以换其他的试试。
一旦载入成功,可以使用 cpufreq-info 命令查看当前CPU状态:
$ cpufreq-info
结果大致如下:
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009 Report errors and bugs to [email protected], please. analyzing CPU 0: driver: powernow-k8 CPUs which run at the same hardware frequency: 0 CPUs which need to have their frequency coordinated by software: 0 maximum transition latency: 8.0 us. hardware limits: 800 MHz - 2.80 GHz available frequency steps: 2.80 GHz, 2.10 GHz, 1.60 GHz, 800 MHz available cpufreq governors: ondemand, conservative, userspace, powersave, performance current policy: frequency should be within 800 MHz and 2.80 GHz. The governor "ondemand" may decide which speed to use within this range. current CPU frequency is 800 MHz.
上面的数据列出每个CPU(或者核心)的最小和最大频率、可选的频率、当前工作频率以及调速器(Scaling governors)等信息。
其中调速器(Scaling governors)有如下几种:
注意调速器也是内核模块,需要先载入才能使用。比如:
$ sudo modprobe cpufreq_ondemand
然后更改各个CPU(或核心)选用的调速器(默认是最大性能):
$ sudo cpufreq-set -c 0 -g ondemand $ sudo cpufreq-set -c 1 -g ondemand $ sudo cpufreq-set -c 2 -g ondemand $ sudo cpufreq-set -c 3 -g ondemand
现在你可以再次运行 cpufreq-info 查看CPU的当前频率和调速器是否正确,过1、2分钟之后再次运行 sensors 查看CPU温度是否有所下降。如果都是的话,则可以把加载的内核模块名称添加到 rc.conf 的 MODULES 一行让系统启动时自动载入,大致如下:
MODULES=(vboxdrv vboxnetflt powernow-k8 cpufreq_ondemand)
最后,因为 cpufreq-set 程序的作用在系统重启后会自动消失,所以需要将掌管它的守护程序 cpufreq 写入到 rc.conf 的 DAEMONS 里,大致如下:
DAEMONS=(syslog-ng dbus networkmanager sensors @cpufreq)
然后修改配置文件 /etc/conf.d/cpufreq,去掉 governor=”ondemand” 一行的注释,内容大致如下:
#configuration for cpufreq control # valid governors: # ondemand, performance, powersave, # conservative, userspace governor="ondemand" # limit frequency range (optional) # valid suffixes: Hz, kHz (default), MHz, GHz, THz #min_freq="2.25GHz" #max_freq="3GHz" # use freq to set up the exact cpu frequency using it with userspace governor #freq=
这个操作会根据不同的显卡有所不同,这里只以ATI Radeon HD 5750作为示例说明。我的系统安装了 ATI 开源的显卡驱动 xf86-video-ati,通过如下命令可以查看当前显卡电源管理模式:
$ cat /sys/class/drm/card0/device/power_profile
默认的是“default”,也就是最大性能模式,我们可以把它更改为 auto,low,mid,high 等模式,其中auto是根据是否使用电池供电(指笔记本电脑电池)来自动切换low和high模式,这个对于台式计算机来说是无效的,所以我们如果不是经常运行3D程序的话可以冒进一点设置为low模式。切换到 root 帐号,然后运行下面命令即可;
# echo low>/sys/class/drm/card0/device/power_profile
过1分钟左右使用 sensors 命令查看显卡温度是否有所降低,是的话则说明起效了,然后可以将上面一行命令写入 /etc/rc.local 文件,让系统启动时自动运行。
通过上面的操作一般可以将CPU和显卡温度降低10摄氏度左右,当然也节省不少电能和电费。