本文介绍的节能知识,最好能在实验中验证,可以购买一个显示用电器功耗的仪 器("电能监控计量插座" — 淘宝上购买50元左右,而且也有很多很多其他居家 用途 ;-|)
另外,本文很多节能方法都是针对 intel CPU 或 intel 芯片组的。
参考
Less Watts 项目
"Less Watts" 是有 Intel 发起的,主要应用于 Intel 平台的 GNU/Linux 系统 上的节能项目。
PowerTOP
这个工具可以报告当前系统运行的应用程序耗能情况。
Tickless Idle
Kernel 的 "空闲循环" 机制
Applications Power Management
Processor Power Management
Power and Performance Measurement
Linux ACPI
ACPICA
BLTK
Power QoS
Display and Graphics Power Saving
Device and Bus Power Management
Virtualization
Kernel settings and patches
General settings
# From PowerTOP's FAQ: CONFIG_NO_HZ CONFIG_HIGH_RES_TIMERS CONFIG_HPET CONFIG_HPET_TIMER CONFIG_CPU_FREQ_GOV_ONDEMAND CONFIG_USB_SUSPEND CONFIG_SND_AC97_POWER_SAVE CONFIG_SND_HDA_POWER_SAVE CONFIG_SND_HDA_POWER_SAVE_DEFAULT=3 CONFIG_TIMER_STATS CONFIG_ACPI_BATTERY CONFIG_CPU_FREQ_STAT CONFIG_INOTIFY
# Not from the PowerTOP FAQ: CONFIG_BLK_DEV_IO_TRACE CONFIG_X86_ACPI_CPUFREQ CONFIG_X86_SPEEDSTEP_CENTRINO depreciated as of kernel 2.6.24, use CONFIG_X86_ACPI_CPUFREQ CONFIG_X86_SPEEDSTEP_ICH CONFIG_X86_SPEEDSTEP_SMI CONFIG_CPU_IDLE CONFIG_CPU_IDLE_GOV_LADDER CONFIG_CPU_IDLE_GOV_MENU
应该禁止的选项:
CONFIG_IRQBALANCE CONFIG_ACPI_DEBUG
Kernel boot and module loading options
如果你的主板芯片组是 "Intel chipset ICH5 or later (cf. lspci output)" ,你应该启用它的 "HPET timer (saves about 30 CPU wake ups per second)." ,运行下面命令:
grep hpet /proc/timer_list
如果看到类似 "Clock Event Device: hpet" 的信息,说明当前系统已经使用 HPET timer ,我的测试机器上信息如下:
# grep hpet /proc/timer_list Clock Event Device: hpet set_next_event: hpet_legacy_next_event set_mode: hpet_legacy_set_mode Clock Event Device: hpet2 set_next_event: hpet_msi_next_event set_mode: hpet_msi_set_mode Clock Event Device: hpet3 set_next_event: hpet_msi_next_event set_mode: hpet_msi_set_mode Clock Event Device: hpet4 set_next_event: hpet_msi_next_event set_mode: hpet_msi_set_mode Clock Event Device: hpet5 set_next_event: hpet_msi_next_event set_mode: hpet_msi_set_mode
如果没有搜到 HPET 信息,可以在内核启动的时候传递下面参数(通常grub引导 需要配置 /boot/grub/menu.lst):
hpet=force
Useful Patches
参考 http://www.thinkwiki.org/wiki/How_to_reduce_power_consumption#Useful_Patches
Useful sysctls
echo 5 > /proc/sys/vm/laptop_mode echo 0 > /proc/sys/kernel/nmi_watchdog echo Y > /sys/module/snd_ac97_codec/parameters/power_save echo 1 > /sys/devices/system/cpu/sched_mc_power_savings echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo 1500 > /proc/sys/vm/dirty_writeback_centisecs for i in /sys/bus/usb/devices/*/power/autosuspend; do echo 1 > $i; done # those sysctl's are only available if you have an AHCI compatible SATA # controler and use kernel > 2.6.24-rc2 (or use Kristen ALPM patchset) : echo min_power > /sys/class/scsi_host/host0/link_power_management_policy echo min_power > /sys/class/scsi_host/host1/link_power_management_policy
早于 2.6.22 的 kernel 可以:
cd /sys/devices/system/cpu/cpu0/cpufreq cat ondemand/sampling_rate_max > ondemand/sampling_rate
ATA drives
硬盘和光驱的转动是非常耗能的,我们需要尽量减少它们的转动操作。
Hard Drives
禁止自动更新 atime
mount -o remount,relatime / # and so on for all mounted fs
(在老的内核上使用 noatime 代替 relatime.)
延长 sync dala 和 metadata 时间
commit=nrsec Sync all data and metadata every nrsec seconds. The default value is 5 seconds.
使用 laptop_mode
使用 laptop_mode 可以通过推迟写操作而减少写磁盘的次数。
echo 5 > /proc/sys/vm/laptop_mode
增加 kernel dirty page writeback frequency
默认的 "kernel dirty page writeback frequency" 很保守,可以增加:
echo 1500 > /proc/sys/vm/dirty_writeback_centisecs
hdparm
一些 "power saving hard drives features" 可以使用 hdparm (注意, "-B 1" 可能会减少你的磁盘使用寿命!)
hdparm -B 1 -S 12 /dev/sda # and/or any other disk device
USB Subsystem
kernel 支持一个 USB2.0 节能方法, usb autosuspend 。可以查看 kernel 的 config 文件确定 usbcore 的编译方式:
# grep 'CONFIG_USB_SUSPEND' /boot/config-2.6.30.1-6.1.2.tms2-netbook CONFIG_USB_SUSPEND=y
可见,我的系统环境, CONFIG_USB_SUSPEND 编译为 built in 模式,需要在 kernel 启动的时候传递下面参数启用此功能:
usbcore.autosuspend=1
如果编译为模块(运行 "modprobe usbcore" 能查看信息),可以在 /etc/modprobe.conf (新建一个 /etc/modprobe.d/usbcore 文件也可以)里添加 :
options usbcore autosuspend=1
还可以在运行时对所有 USB 接口启用 autosuspend :
for i in /sys/bus/usb/devices/*/power/autosuspend; do echo 1 > $i; done for i in /sys/bus/usb/devices/*/power/level; do echo auto > $i; done
USB 1.1 非常失败,它很耗能,如果我们不使用 USB 1.1 ,可以去掉这个模块 (目前大多数发行版没有此模块):
rmmod uhci_hcd
如果你的系统有 /etc/modprobe.d/blacklist 文件,可以这样禁止 uhci_hcd:
echo "blacklist uhci_hcd" >> /etc/modprobe.d/blacklist
PCMCIA/CardBus
echo "blacklist pcmcia" >> /etc/modprobe.d/blacklist echo "blacklist yenta_socket" >> /etc/modprobe.d/blacklist
Sound
amixer set Line mute nocap amixer set Mic mute nocap echo Y > /sys/module/snd_ac97_codec/parameters/power_save
Intel HD Audio
echo Y > /sys/module/snd_hda_intel/parameters/power_save_controller echo 1 > /sys/module/snd_hda_intel/parameters/power_save
常见耗能模块
snd_intel8x0m fglrx radeon ipw* bcm* hdaps ibm_acpi i8042 nvidia
节能常用方法
最主要的是安装 PowerTOP 软件,以便查看系统进程的能耗情况,另外它还可以 显示一些节能 Tips 。
开启 HPET
可以在 BIOS 里面打开这个选项(BIOS 位置: South Bridge Chipset Configuration)。 (实验,能省2w左右)
Enable USB autosuspend
打开 PowerTOP 可能会看到:
Enable USB autosuspend by pressing the U key or adding usbcore.autosuspend=1 to the kernel command line in the grub config
启用 USB 接口的自动挂起,在运行 PowerTOP 软件时,你可能看到一个提示,使 用 "U" (shift + u) 键可以启动此功能。(实验,48w的功耗可以省1w多)
Increase Writeback time
PowerTOP 推荐将 "VM dirty writeback time" 延长至 15 秒:
echo 1500 > /proc/sys/vm/dirty_writeback_centisecs
启用 power aware CPU scheduler
(Scheduler Power Saving Mode) , 这个很多系统没有找到:
echo 1 > /sys/devices/system/cpu/sched_mc_power_savings
禁止内核自动更新 atime
# 启用 noatime 文件系统选项: mount -o remount,noatime / (noatime 禁止 # 更新 atime,可以节省大量 I/O,但为了避免 atime 相关应用程序出现问题, # 建议启用 relatime 代之: mount -o remount,relatime / ,relatime 自 # Kernel 2.6.29 起为默认设置。) mount -o remount,noatime /
禁止 hal 轮询 cdrom
hal-disable-polling --device /dev/cdrom
节省磁盘读写
处理 CPU 的频繁唤醒, 磁盘读写也是耗能大户。想要知道哪些程序频繁读写你 的磁盘,可以执行下面命令:
sysctl vm.block_dump=0
然后 dmesg 命令输出中就有详细的磁盘读写信息了。
pdflush
内核的脏页回写
kjournald
Ext3 日志系统的更新进程
系统日志
/etc/init.d/rsyslog stop
节能实践
USB 设备
让 USB 设备自动挂起,(对于鼠标,键盘,大约能省2w)
for i in /sys/bus/usb/devices/*/power/level;do echo auto > $i;done
很多 doc 介绍使用下面命令修改,但是我的系统上不起作用:
for i in /sys/bus/usb/devices/*/power/autosuspend; do echo 1 > $i; done
在 Moblin 上应用节能
Moblin 使用了 LessWatts 的几乎所有技术来节能,我把基于 Moblin 修改的节 能系统安装在服务器上,/etc/rc.local 加入如下内容:
for i in /sys/bus/usb/devices/*/power/level;do echo auto > $i;done mount -o remount,relatime / echo 5 > /proc/sys/vm/laptop_mode echo 0 > /proc/sys/kernel/nmi_watchdog #echo Y > /sys/module/snd_ac97_codec/parameters/power_save #echo 1 > /sys/devices/system/cpu/sched_mc_power_savings echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo 1500 > /proc/sys/vm/dirty_writeback_centisecs #echo min_power > /sys/class/scsi_host/host0/link_power_management_policy #echo min_power > /sys/class/scsi_host/host1/link_power_management_policy #amixer set Line mute nocap #amixer set Mic mute nocap #echo Y > /sys/module/snd_ac97_codec/parameters/power_save echo Y > /sys/module/snd_hda_intel/parameters/power_save_controller echo 1 > /sys/module/snd_hda_intel/parameters/power_save hal-disable-polling --device /dev/cdrom /etc/init.d/rsyslog stop rmmod joydev
节能其他
节能十招(摘)
1. Linux Kernel 2.6.21 开始支持 Tickless(此前的内核默认设置为 1000Hz timer tick),于是系统空闲时不再无故骚扰 CPU,可以节省大量能耗。Fedora 7+ 以及目前的 Ubuntu Linux 发行版都含有 Tickless 特性,而 RHEL 则要到版本 6 才会随新版本内核正式支持该特性(预计 2010年上市)。检查你的 Linux 系统是否支持 Tickless: watch --interval=1 cat /proc/interrupts ,若 timer 中断值并非以 1000 为步进单位增加,则说明该内核支持 Tickless。 2. 编译内核(make menuconfig): •启用 Tickless: Processor type and features ->[*] Tickless System (Dynamic Ticks) •启 用 CONFIG_USB_SUSPEND: Device Drivers -> USB support ->[*] USB selective suspend/resume and wakeup (自动禁用 UHCI USB,可以节省约 1 watt) 3. PowerTOP 可以找出计算机闲置时哪些进程耗电最多。(Kernel Hacking ->[*] Collect kernel timers statistics) 详见: http://www.lesswatts.org/projects/powertop/ 4. 启用 power aware CPU scheduler(Scheduler Power Saving Mode): echo 1 > /sys/devices/system/cpu/sched_mc_power_savings 5. RHEL 5.3 支持 Intel Core i7 (Nehalem) 的电源管理功能。 6. 启用 irqbalance 服务,既可以提升性能,又可以降低能耗。irqbalance 用于优化中断分配,它会自动收集系统数据以分析使用模式,并依据系统负载状况将工作状态置于 Performance mode 或 Power-save mode。处于 Performance mode 时,irqbalance 会将中断尽可能均匀地分发给各个 CPU core,以充分利用 CPU 多核,提升性能。处于 Power-save mode 时,irqbalance 会将中断集中分配给第一个 CPU,以保证其它空闲 CPU 的睡眠时间,降低能耗。(详见:http://www.irqbalance.org/documentation.php ) 7. 禁用 pcscd,该进程会阻碍 USB 子系统进入 Power-save mode。 8. 将 VM dirty writeback time 延长至 15 秒: echo 1500 > /proc/sys/vm/dirty_writeback_centisecs 9. 启用 noatime 文件系统选项: mount -o remount,noatime / (noatime 禁止更新 atime,可以节省大量 I/O,但为了避免 atime 相关应用程序出现问题,建议启用 relatime 代之: mount -o remount,relatime / ,relatime 自 Kernel 2.6.29 起为默认设置。) 10. 禁止 hal 轮询你的 cdrom: hal-disable-polling --device /dev/cdrom
