Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
电源管理指南
在红帽企业版 Linux 6 中管理电源消耗
版 1.0
Red Hat Inc.
Don Domingo
Rüdiger Landmann
r.landmann@redhat.com
摘要
第 1 章 概述
1.1. 电源管理的重要性
- 减少电源总耗以便降低成本
- 为服务器和计算中心进行降温
- 降低二次成本,其中包括冷却、空间、电缆、发电机以及不间断供电(UPS)
- 延长笔记本电脑电池寿命
- 降低二氧化碳排放
- 达到政府法律法规中对绿色 IT 的要求,例如:能耗星级
- 达到公司对新系统的要求
- 问: 我必须优化吗?
- 问: 优化的代价是什么?
- 问: 优化是否会将系统性能降低到无法接受的程度?
- 问: 优化消耗的时间和资源是否超过了得到的结果?
1.2. 电源管理基础
红帽企业版 Linux 5 内核曾为每个 CPU 使用周期计时器。这个计时器防止 CPU 真正进入闲置状态,因为它要求 CPU 无论是否有进程在运行,都要处理每个计时器事件(根据设置几微妙出现一次)。有效电源管理的主要任务是减少 CPU 唤醒的频率。
特别是在那些有移动组件的设备(比如硬盘)中尤其重要。另外,有些应用程序可 "open" 未使用但启用的设备,当出现这种情况时,内核假设设备处于使用状态,这样就会阻止设备进入节电状态。
在很多情况下要依赖先进的硬件并修正 BIOS 配置。旧的系统组件经常不支持一些红帽企业版 Linux 6 中支持的新特性。请确定您系统使用的是最新的官方固件,且在 BIOS 中的电源管理或者设备配置部分启用了电源管理功能。您需要查看的功能包括:
- 变频(SpeedStep)
- PowerNow!
- Cool'n'Quiet
- ACPI (C 状态)
- 智能
先进 CPU 与高级配置和电源接口(ACPI)共同提供不同的电源状态。三种不同的状态为:
- 休眠(C 状态)
- 运行(P 状态)
- 散热(T 状态或者 "热状态")
很明显,最佳的节电方法就是关闭系统。例如:您的公司可开发一项注重 "绿色 IT" 的企业文化,让员工有意识地在午休时间或者下班时关闭机器。您还可以将几台物理服务器合并成一个较大的服务器,并使用我们在红帽企业版 Linux 6 中附带的虚拟化技术将其虚拟化。
第 2 章 电源管理工具审核及分析
2.1. 审核及分析概述
2.2. PowerTOP
yum install powertop
powertop
增加虚拟机脏回写时间
以及接受该建议时要按的按键(W)。
C4
高于 C3
),也显示了是如何更好利用 CPU 的。您的目标应该是 90% 或者以上的时间 CPU 处于 C 状态或者 P 状态,其余时间系统处于闲置状态。
<
>
中),那么唤醒通常与导致这些唤醒的特定驱动程序关联。调整驱动程序通常需要更改内核,这已经超出本文档涉及范围。但是,发送唤醒的用户空间进程更容易管理。首先要确认这个服务或者应用程序是否应该在这个系统中运行。如果不是,只要失活它即可。要永久关闭某个服务,请运行:
chkconfig servicename off
ps -awux | grep componentname
strace -p processid
增加虚拟机脏回写时间
以及接受该建议时要按的按键(W)。这些更改要在下一次引导时生效。要使这些更改持久,PowerTOP 会显示执行这个优化具体要执行的命令。请使用您的首选文本编辑器在您的 /etc/rc.local
文件中添加命令以便其在每次启动计算机时都有效。

图 2.1. PowerTOP 操作中
2.3. Diskdevstat 和 netdevstat
yum install systemtap tuned-utils kernel-debuginfo
diskdevstat
netdevstat
diskdevstat update_interval total_duration display_histogram
netdevstat update_interval total_duration display_histogram
- update_interval
- 以秒为单位的显示更新间隔时间。默认:
5
- total_duration
- 以秒为单位显示整体运行时间。默认:
86400
(一天) - display_histogram
- 是否显示在运行结束时收集的所有数据柱形图的标签。
PID UID DEV WRITE_CNT WRITE_MIN WRITE_MAX WRITE_AVG READ_CNT READ_MIN READ_MAX READ_AVG COMMAND 2789 2903 sda1 854 0.000 120.000 39.836 0 0.000 0.000 0.000 plasma 15494 0 sda1 0 0.000 0.000 0.000 758 0.000 0.012 0.000 0logwatch 15520 0 sda1 0 0.000 0.000 0.000 140 0.000 0.009 0.000 perl 15549 0 sda1 0 0.000 0.000 0.000 140 0.000 0.009 0.000 perl 15585 0 sda1 0 0.000 0.000 0.000 108 0.001 0.002 0.000 perl 2573 0 sda1 63 0.033 3600.015 515.226 0 0.000 0.000 0.000 auditd 15429 0 sda1 0 0.000 0.000 0.000 62 0.009 0.009 0.000 crond 15379 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15473 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15415 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15433 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15425 0 sda1 0 0.000 0.000 0.000 62 0.007 0.007 0.000 crond 15375 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15477 0 sda1 0 0.000 0.000 0.000 62 0.007 0.007 0.000 crond 15469 0 sda1 0 0.000 0.000 0.000 62 0.007 0.007 0.000 crond 15419 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15481 0 sda1 0 0.000 0.000 0.000 61 0.000 0.001 0.000 crond 15355 0 sda1 0 0.000 0.000 0.000 37 0.000 0.014 0.001 laptop_mode 2153 0 sda1 26 0.003 3600.029 1290.730 0 0.000 0.000 0.000 rsyslogd 15575 0 sda1 0 0.000 0.000 0.000 16 0.000 0.000 0.000 cat 15581 0 sda1 0 0.000 0.000 0.000 12 0.001 0.002 0.000 perl 15582 0 sda1 0 0.000 0.000 0.000 12 0.001 0.002 0.000 perl 15579 0 sda1 0 0.000 0.000 0.000 12 0.000 0.001 0.000 perl 15580 0 sda1 0 0.000 0.000 0.000 12 0.001 0.001 0.000 perl 15354 0 sda1 0 0.000 0.000 0.000 12 0.000 0.170 0.014 sh 15584 0 sda1 0 0.000 0.000 0.000 12 0.001 0.002 0.000 perl 15548 0 sda1 0 0.000 0.000 0.000 12 0.001 0.014 0.001 perl 15577 0 sda1 0 0.000 0.000 0.000 12 0.001 0.003 0.000 perl 15519 0 sda1 0 0.000 0.000 0.000 12 0.001 0.005 0.000 perl 15578 0 sda1 0 0.000 0.000 0.000 12 0.001 0.001 0.000 perl 15583 0 sda1 0 0.000 0.000 0.000 12 0.001 0.001 0.000 perl 15547 0 sda1 0 0.000 0.000 0.000 11 0.000 0.002 0.000 perl 15576 0 sda1 0 0.000 0.000 0.000 11 0.001 0.001 0.000 perl 15518 0 sda1 0 0.000 0.000 0.000 11 0.000 0.001 0.000 perl 15354 0 sda1 0 0.000 0.000 0.000 10 0.053 0.053 0.005 lm_lid.sh
- PID
- 应用程序的进程 ID
- UID
- 运行中的应用程序用户 ID
- DEV
- 发生 I/O 的设备
- WRITE_CNT
- 写操作总数
- WRITE_MIN
- 两个连续写入操作所需最短时间(以秒为单位)
- WRITE_MAX
- 两个连续写入操作所需最长时间(以秒为单位)
- WRITE_AVG
- 两个连续写入操作所需平均时间(以秒为单位)
- READ_CNT
- 读操作的总数
- READ_MIN
- 两个连续读操作所需最短时间(以秒为单位)
- READ_MAX
- 两个连续读操作所需最长时间(以秒为单位)
- READ_AVG
- 两个连续读操作所需平均时间(以秒为单位)
- COMMAND
- 进程名称
PID UID DEV WRITE_CNT WRITE_MIN WRITE_MAX WRITE_AVG READ_CNT READ_MIN READ_MAX READ_AVG COMMAND 2789 2903 sda1 854 0.000 120.000 39.836 0 0.000 0.000 0.000 plasma 2573 0 sda1 63 0.033 3600.015 515.226 0 0.000 0.000 0.000 auditd 2153 0 sda1 26 0.003 3600.029 1290.730 0 0.000 0.000 0.000 rsyslogd
WRITE_CNT
都大于 0
,就是说它们在管理期间执行了一些写操作。其中 plasma 是最捣乱的程序:它执行的写操作作多,当然写操作平均间隔时间就最短。如果您关注不能有效利用能源的程序,那么 Plasma 就是最佳审查对象。
strace -p 2789
strace
的输出结果中包含一个每 45 秒重复一次的图案,该图案打开用户的 KDE 图标缓冲文件,接着写入,然后马上再次关闭该文件。这导致一个在硬盘中的必需物理写入,因为已经更改了文件原数据(特别是修改时间)。最终修复是防止那些在没有图标更新时的不必要调用。
2.4. 电池寿命工具组件(Battery Life Tool Kit)
-a
在启动时报告桌面电脑性能。
办公
负载写入一个文本,在其中进行一些修改,并在一个电子表格中进行同样的操作。运行带PowerTOP 或者任何其它审核及分析工具的 BLTK,就可让您测试您执行的优化在机器被激活后,不处于闲置状态时是否有效。因为您可以在不同设置中多次运行同样的负载,并比较不同设置得到的结果。
yum install bltk
bltk workload options
闲置
负载 120 秒:
bltk -I -T 120
-I
,--idle
- 系统闲置,将其作为与其它负载进行比较的基准。
-R
,--reader
- 模拟读取文档(默认为 Firefox)
-P
,--player
- 模拟观看 CD 或者 DVD 驱动器中的多媒体文件(默认为 mplayer)
-O
,--office
- 模拟使用 OpenOffice.org 套件编辑文件
-a
,--ac-ignore
- 忽略是否交流电可用(桌面系统使用时需要)
-T number_of_seconds
,--time number_of_seconds
- 运行测试的时间(以秒为单位),在
闲置
负载中使用这个选项。 -F filename
,--file filename
- 指定特定负载使用的文件,例如
播放器
负载要使用的文件,而不是访问 CD 或者 DVD 驱动器。 -W application
,--prog application
- 指定特定负载使用的应用程序,例如:Firefox 之外用于
读卡器
负载的浏览器。
bltk
man page。
/etc/bltk.conf
配置文件指定目录生成的结果 -- 默认为 ~/.bltk/workload.results.number/
。例如:~/.bltk/reader.results.002/
目录中保存第三次阅读器
测试负载的结果(第一次不计数)。结果保存在几个文本文件中。要将这些结果压缩成方便读取的格式,请运行:
bltk_report path_to_results_directory
Report
的文件中。要在终端模拟器中查看结果,请使用 -o
选项:
bltk_report -o path_to_results_directory
2.5. Tuned 和 ktune
yum install tuned
/etc/tuned.conf
中设定一个示例配置文件,并激活默认侧写。
service tuned start
chkconfig tuned on
-d
,--daemon
- 将 tuned 作为守护进程启动,而不是在前台启动。
-c
,--conffile
- 使用有具体名称和路径的配置文件,例如:
--conffile=/etc/tuned2.conf
。默认为/etc/tuned.conf
。 -D
,--debug
- 使用日志记录的最高级别。
2.5.1. tuned.conf
文件
tuned.conf
文件包含 tuned 配置设定。默认情况下,它位于 /etc/tuned.conf
,但您可以通过启动带 --conffile
选项的 tuned.conf
指定一个不同的名称和位置。
[main]
部分。该文件还应为每个插件包含一个部分。
[main]
部分包含以下选项:
interval
- tuned 应该监控并调节系统的时间间隔,单位为秒。默认值为
10
。 verbose
- 指定输出结果是否应该详细。默认值为
False
。 logging
- 指定要记录信息的最小优先权。按降序排列允许的值有:
critical
、error
、warning
、info
和debug
。默认值为info
。 logging_disable
- 指定要记录信息的最大优先权,任何带这个优先权或者更低的优先权将不被记录。
critical
、error
、warning
、info
和debug
。notset
禁用这个选项。
[CPUTuning]
。每个插件可有其自身的选项,但以下内容适用于所有插件:
enabled
- 指定是否启用该插件。默认值为
True
。 verbose
- 指定输出是否应详细。如果没有为这个插件设定,该值会继承
[main]
中的值。 logging
- 指定要记录信息的最小优先权。如果没有为这个插件设定,该值会继承
[main]
中的值。
[main] interval=10 pidfile=/var/run/tuned.pid logging=info logging_disable=notset # Disk monitoring section [DiskMonitor] enabled=True logging=debug # Disk tuning section [DiskTuning] enabled=True hdparm=False alpm=False logging=debug # Net monitoring section [NetMonitor] enabled=True logging=debug # Net tuning section [NetTuning] enabled=True logging=debug # CPU monitoring section [CPUMonitor] # Enabled or disable the plugin. Default is True. Any other value # disables it. enabled=True # CPU tuning section [CPUTuning] # Enabled or disable the plugin. Default is True. Any other value # disables it. enabled=True
2.5.2. Tuned-adm
tuned-adm
命令即可选择并激活它们,但您也要自己创建、修改并删除侧写。
tuned-adm list
tuned-adm active
tuned-adm profile profile_name
tuned-adm profile server-powersave
tuned-adm off
default
侧写。红帽企业版 Linux 6 还包括以下事先定义的侧写:
- default
- 默认节能侧写。它在可用侧写节能中影响最小,只启用 CPU 和 tuned 磁盘插件。
- desktop-powersave
- 在桌面系统中使用的节能侧写。为 SATA 主机适配器以及 CPU、以太网和 tuned 磁盘插件启用 ALPM 节能(请参考 第 3.6 节 “主动连接电源管理”)。
- server-powersave
- 在服务器系统中使用的节能侧写。为 SATA 主机适配器启用 ALPM 节能,禁止通过 HAL 调用光驱(请参考 hal-disable-polling man page)并激活 CPU 和 tuned 磁盘插件。
- laptop-ac-powersave
- 在使用 AC 运行的笔记本电脑中使用的中度影响节能侧写。为 SATA 主机适配器、WiFi 节能以及 CPU、以太网和 tuned 磁盘插件启用 ALPM 节能。
- laptop-battery-powersave
- 在使用电池运行的笔记本电脑中使用的高度影响节能侧写。它从之前的侧写中激活所有节能机制,并为低唤醒系统启用多核节能调度程序,确定按需调节器处于活跃状态,并弃用了 AC97 音频节能。您可以使用这个侧写在任何类型的系统中最大限度节能,不仅仅限于在使用电池的笔记本电脑中使用。使用这个侧写的代价是对性能的明显影响,特别是磁盘和网络 I/O 延迟。
- throughput-performance
- 用于典型吞吐性能调整的服务器侧写。它可禁用 tuned 和 ktune 节能机制,启用 sysctl 设置改进您的磁盘和网络 I/O 吞吐性能,并切换到 deadline scheduler。
- latency-performance
- 用于典型延迟性能调整的服务器侧写。它可禁用 tuned 和 ktune 节能机制,启用 sysctl 设置改进您的磁盘和网络 I/O 延迟性能。
/etc/tune-profiles
下的独立子目录中。因此 /etc/tune-profiles/desktop-powersave
包含所有需要的文件以及那个侧写的设置。每个目录最多包含四个文件:
tuned.conf
- 为这个侧写激活调整服务的配置。
sysctl.ktune
- ktune 使用的 sysctl 设置。其格式与
/etc/sysconfig/sysctl
文件一致(请参考 sysctl 和 sysctl.conf man page)。 ktune.sysconfig
- ktune 的自身配置文件,通常为
/etc/sysconfig/ktune
。 ktune.sh
- ktune 服务使用的 init 风格的 shell 脚本,可在系统启动过程中运行特定命令调整系统。
laptop-battery-powersave
侧写中已经包含丰富的调整设置,因此是有益的起始点。只要将这个目录复制到如下名称的新侧写中即可:
cp -a /etc/tune-profiles/laptop-battery-powersave/ /etc/tune-profiles/myprofile
# Disable HAL polling of CDROMS # for i in /dev/scd*; do hal-disable-polling --device $i; done > /dev/null 2>&1
2.6. DeviceKit-power 和 devkit-power
devkit-power
命令访问命令行工具,以下是其选项:
--enumerate
,-e
- 显示系统中每个电源设备的对象路径,例如:
/org/freedesktop/DeviceKit/power/devices/line_power_AC
/org/freedesktop/UPower/DeviceKit/power/battery_BAT0
--dump
,-d
- 显示系统中所有电源设备的参数。
--wakeups
,-w
- 显示系统中的 CPU 唤醒。
--monitor
,-m
- 监视系统电源更换,例如:连接或者断开交流电源,或者电池耗尽。按 Ctrl+C 停止监视系统。
--monitor-detail
- 监视系统电源更换,例如:连接或者断开交流电源,或者电池耗尽。
--monitor-detail
选项会显示比--monitor
选项更详细的情况。按 Ctrl+C 停止监视系统。 --show-info object_path
,-i object_path
- 显示某个具体对象路径的所有可用信息。例如:获得有关系统中对象路径
/org/freedesktop/UPower/DeviceKit/power/battery_BAT0
代表的电池的信息,请运行:devkit-power -i /org/freedesktop/UPower/DeviceKit/power/battery_BAT0
2.7. GNOME 电源管理器
- 「使用交流电」
- 「使用电池」
- 「常规」
2.8. 其他审核方法
- vmstat
- vmstat 为您给出有关进程、内存、paging、块 I/O、陷阱以及 CPU 活性的详细资料。用它可进一步查看系统都做了什么,以及什么地方忙碌。
- iostat
- iostat 与 vmstat 类似,但只在块设备中是这样。它还提供更多详细输出和统计。
- blktrace
- blktrace 是一个非常详细的块 I/O 追踪程序。它将信息截成与程序关联的单一块。与 diskdevstat 合并使用时非常有用。
第 3 章 核心基础结构及技巧
3.1. CPU 闲置状态
- C0
- 操作或者运行状态。在这个状态中,CPU 处于工作状态,完全没有空闲。
- C1, 挂起
- 处理器不执行任何步骤的状态,但通常不处于较低功率状态。CPU 可继续进行处理而没有延迟。所有提供 C 状态的处理器都需要支持这个状态。奔腾 4 处理器支持改进的 C1 状态,即 C1E,它实际上是一个低能耗状态。
- C2, 时钟停止
- 在这个状态中处理器停止时钟,但它让其暂存器和缓冲保持完整状态,因此重新启动时钟后,它可以立即重新启动处理。这是一个可选状态。
- C3, 休眠
- 处理器真正进入睡眠状态且不需要保存保持更新其缓冲。因此从这个状态唤醒的时间要大大长于从 C2 唤醒的时间。这也是一个可选状态。
3.2. 使用 CPUfreq
调节器
3.2.1. CPUfreq 调节器类型
性能调节器强制 CPU 使用可能的最高时钟频率。这个频率是静态设置的,不会改变。因此,这个特定的调节器不提供节能效益。它只适用于几个小时的高负载,且即使在那种情况下也只可用于 CPU 几乎不(或者从不)空闲的时候。
相反,节电调节器强制 CPU 使用最低可用时钟频率。这个频率将被静态设置,且不会更改。因此,这个特定调节器提供最大节能效益,但是以最低 CPU 性能为代价的。
按需调节器是一个动态调节器,它可允许 CPU 在系统负载高时达到最大时钟频率,还允许系统处于闲置时使用最小时钟频率。虽然这允许系统根据系统负载调整电源消耗,但也确实要承受频率切换间造成的延迟。因此,如果系统在闲置和高负载间切换过于频繁,那么延迟可抵消任何按需调节器带来的性能/节能优势。
用户空间调节器允许用户空间程序(或者任何以 root 用户运行的进程)设定频率。这个调节器通常与 cpuspeed
守护进程一同使用。在所有调节器中,用户空间调节器是最可自定义的,且根据其配置,它可为您的系统在性能和耗能间提供最佳平衡。
与按需调节器类似,传统调节器还根据用量调整时钟频率(类似按需调节器)。但是按需调节器的方式更极端(从最大到最小,再返回),传统调节器在更接近的频率间切换。
注意
cron
任务启用调节器。这允许您自动在每天的特定时间设定具体调节器。因此,您可以在闲置时指定低频率调节器(例如工作之余),并在高负载时返回高频率调节器。
3.2.2. CPUfreq 设置
过程 3.1. 如何添加 CPUfreq 驱动程序
- 使用以下命令查看可用于您系统的 CPUfreq 驱动程序:
ls /lib/modules/[kernel version]/kernel/arch/[architecture]/kernel/cpu/cpufreq/
- 使用
modprobe
添加正确的 CPUfreq 驱动程序。modprobe [CPUfreq driver]
您使用以上命令时,请确定删除.ko
文件名后缀。重要
当选择适当的 CPUfreq 驱动程序时,总是选择p4-clockmod
中的acpi-cpufreq
。当使用p4-clockmod
驱动程序降低 CPU 的时钟频率时,它不会降低电压。另一方面,acpi-cpufreq
会随着 CPU 时钟频率降低电压,允许每个性能单位降低有更少电力消耗和散热。 - 设定 CPUfreq 驱动程序后,您可以查看系统目前正在使用的调节器:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
cat /sys/devices/system/cpu/[cpu ID]/cpufreq/scaling_available_governors
modprobe
添加可启用您要使用的具体 CPUfreq 调节器的内核模块。您可在 /lib/modules/[kernel version]/kernel/drivers/cpufreq/
中找到这些内核模块。
过程 3.2. 启用 CPUfreq 调节器
- 如果没有为您的 CPU 列出可用的具体调节器,请使用
modprobe
启用您想要使用的调节器。例如:如果ondemand
调节器不可用于您的 CPU,请使用以下命令:modprobe cpufreq_ondemand
- 将调节器列入您 CPU 的可用列表后,您可使用以下命令启用它:
echo [governor] > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
3.2.3. 调整 CPUfreq 策略和速度
/sys/devices/system/cpu/[cpu ID]/cpufreq/
中找到的可调按钮做对每个 CPU 的速度做进一步的调节。这些可调按钮有:
cpuinfo_min_freq
— 显示 CPU 的最小可用操作频率(单位千赫)cpuinfo_max_freq
— 显示 CPU 的最大可用操作频率(单位千赫)scaling_driver
— 显示在这个 CPU 中用来设定频率的 CPUfreq 驱动程序。scaling_available_governors
— 显示这个内核中可用的 CPUfreq 调节器。如果您要使用不在此文件列表中的 CPUfreq 调节器,请参考 第 3.2.2 节 “CPUfreq 设置” 中的 过程 3.2, “启用 CPUfreq 调节器” 操作说明。scaling_governor
— 显示当前使用的 CPUfreq 调节器。要使用不同的调节器,只要使用echo [governor] > /sys/devices/system/cpu/[cpu ID]/cpufreq/scaling_governor
命令即可(详情请参考 第 3.2.2 节 “CPUfreq 设置” 中的 过程 3.2, “启用 CPUfreq 调节器”)。cpuinfo_cur_freq
— 显示 CPU 的当前速度(单位千赫)。scaling_available_frequencies
— 列出 CPU 可用频率,单位千赫。scaling_min_freq
和scaling_max_freq
— 设定 CPU 策略限制,单位千赫。affected_cpus
— 列出需要频率协调软件的 CPU。scaling_setspeed
— 用于更改 CPU 时钟速度,单位千赫。您只能在 CPU 策略限制中设定一个速度(根据scaling_min_freq
和scaling_max_freq
)。
cat [tunable]
。例如:要查看 cpu0 的当前速度(单位千赫),请使用:
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
.
echo [value] > /sys/devices/system/cpu/[cpu ID]/cpufreq/[tunable]
。例如:将 cpu0 的最小时钟速度设定为 360 千赫,请使用:
echo 360000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
3.3. 挂起和恢复
3.4. 无空循环内核
3.5. 主动式电源管理
- 默认
- 根据系统(例如:BIOS)中固件指定的默认设置设定 PCIe 连接电源状态。这是 ASPM 的默认状态。
- 节电
- 将 ASPM 设定为在任何可能的情况下节电,不考虑性能损失。
- 性能
- 禁用 ASPM 以便允许 PCI 链接以最佳性能操作。
/sys/module/pcie_aspm/parameters/policy
中设定,但也可在引导时使用 pcie_aspm
内核参数指定,其中 pcie_aspm=off
禁用 ASPM,pcie_aspm=force
启用 ASPM,即使在不支持 ASPM 的设备中也可以。
警告
pcie_aspm=force
,不支持 ASPM 的硬件可导致系统停止响应。请在设定 pcie_aspm=force
前确定系统中的所有 PCI 都支持 ASPM。
3.6. 主动连接电源管理
这个模式将连接设定为其最低功率状态(SLUMBER),此时磁盘中没有任何 I/O。这个模式在可能会延长闲置周期时有用。
这个模式将连接设定为第二低功率状态(PARTIAL),此时磁盘中没有 I/O。这个模式是设计用来允许在尽量不影响性能的条件下在电源状态间进行转换(例如:在中等 I/O 负载和闲置 I/O 时)。
medium_power
模式允许根据负载情况在 PARTIAL 和满电(即 "ACTIVE")状态间进行连接转换。请注意不可能直接从 PARTIAL 转换到 SLUMBER 然后再转回来。在这里,这两种电源状态都需要首先转换成 ACTIVE 状态,然后方可转换到另一个状态。
ALPM 被禁用。当磁盘中没有 I/O 时连接不会处于任何低功率状态。
/sys/class/scsi_host/host*/link_power_management_policy
。要更改设置,只要在这些文件中写入本章节中描述的值或者显示文件检查当前设置即可。
3.7. Relatime 驱动器访问优化
atime
,维护它需要一个重复的对存储的写入操作。这些写入操作让存储是设备及其连接保持忙碌和通电状态。因为很少应用程序会使用 atime
数据,所以这个存储设备活动是在浪费电力。特别是即使没有从存储中读取该文件也会发生写入存储的事件,但是从缓冲中写入。有时,Linux 内核还支持 mount 的 noatime
选项,并不在使用此选项挂载的文件系统中写入 atime
。但是只是关闭这个特性是有问题的,因为有些应用程序会依赖 atime
数据,并在此数据不可用时失败。
relatime
。Relatime
维护 atime
数据,但不是每次访问该文件时都更改。启用这个选项,则只在上次更新 atime
(mtime
)后修改该文件时,或者最后一次访问该文件是在相当长一段时间前(默认为一天)时才会将 atime
数据写入磁盘。
relatime
。要在整个系统中限制这个特性,请使用 boot 参数 default_relatime=0
。如果默认在某个系统中启用 relatime
,您可以通过使用选项 norelatime
挂载某个系统来限制它在某个具体文件系统中的使用。最后,要使系统更新文件的 atime
数据的默认周期有所不同,请使用 relatime_interval=
引导参数,以秒为单位指定周期。默认值为 86400
。
3.8. 功率封顶
动态功率封顶是一个在选择 ProLiant 和刀片系统服务器时的特性,它可允许系统管理员对一个服务器或者一组服务器的电源消耗封顶。这个封顶是一个绝对限制,无论其当前工作负载如何,服务器将无法超过该限制。这个封顶只在服务器达到其电源消耗限制时才起效。此时某个管理进程会调整 CPU P 状态和始终刻度来限制电力消耗。
/dev/hpilo/dXccbN
中的管理处理器。该内核还包括 hwmon
sysfs
接口扩展来支持功率封顶特性,以及用于 ACPI 4.0 使用 sysfs
接口电源米表的驱动程序。这些特性允许操作系统和用户空间工具共同读取为功率封顶配置的值以及系统的当前电源用量。
Intel 节点管理器在系统中强制使用功率封顶,使用处理器 P 状态和 T 状态限制 CPU 性能,并因此节能。通过设置电源管理策略,管理员可将系统配置为在系统负载低时,比如夜间或者周末,消耗较少的电力。
3.9. 改进的图形电源管理
低压差分信号传输(Low-voltage differential signalling,LVDS)是使用铜线承载电信号的系统。一个主要的应用是将像素信息传输到笔记本电脑的液晶显示(LCD)屏幕中。所有显示都有刷新率 - 即它们从图形控制器接受新鲜数据并在屏幕中重新成像的频率。通常屏幕每秒接受 60 次新鲜数据(即频率为 60 Hz)。当屏幕和图形控制器是以 LVDS 连接时,LVDS 系统在每次刷新时都会消耗能量。当闲置时,很多 LCD 屏幕的刷新率都会下降到 30 Hz,且不会产生明显的影响(与阴极射线管(CRT)显示器不同,后者在降低刷新率时会产生闪烁现象)。红帽企业版 Linux 6 内核使用的 Intel 图形适配器的驱动程序可自动执行这个降频,并在屏幕闲置时节约 0.5 W 左右的电力。
同步动态随机访问内存(SDRAM) - 由于用于图形适配器的视频内存,因此每秒会重复充电上千次,以便每个内存单元可保留保存在其中的数据。除了管理数据的主要功能外,因为有数据流入或者流出内存,所以内存控制器通常负责初始化这些刷新循环。但是 SDRAM 还有一个低功率自动刷新模式。在这个模式中,内存使用内部计时器生成其自身刷新循环,它可允许系统在不损害当前内存数据的情况下关闭内存控制器。红帽企业版 Linux 6 使用的内核可在 Intel 图形适配器处于闲置状态时触发内存自动刷新,并可节约 0.8 W 左右的电力。
典型图形处理单元(GPU)包含管理其内部电路不同部分的内部时钟。红帽企业版 Linux 6 使用的内核可降低部分 Intel 和 ATI GPU 的内部时钟频率。减少 GPU 组件在给定时间内执行循环的次数可减少其在那些它们不一定要执行的循环中消耗的能量。当 GPU 闲置时,内核可自动降低这些时钟的速度;同时当 GPU 活性增强时会提高其时钟速度。降低 GPU 时钟循环最多可节省 5 W 电力。
红帽企业版 Linux 6 中使用的 Intel 和 ATI 图形驱动程序可探测到什么时候适配器中没有连接显示器,并完全关闭 GPU。这个功能对不经常连接显示器的服务器尤为重要。
3.10. RFKill
/dev/rfkill
,其中包含系统中所有无线电传输的当前状态。每个设备都在 sysfs
中注册当前 RFKill 状态。另外,在启用了 RFKill 的设备中每当状态更改时,RFKill 会发出 uevents。
rfkill list
获得设备列表,每个都包含与之关联的索引号,从 0
开始。您可以使用这个索引号让 rfkill 停止使用或者使用某个设备,例如:
rfkill block 0
rfkill block wifi
rfkill block all
rfkill unblock
,而不是 rfkill block
。要获得 rfkill 可停用的完整设备类别列表,请运行 rfkill help
。
3.11. 在用户空间中优化
红帽企业版 Linux 6 使用无空循环内核(请参考 第 3.4 节 “无空循环内核”),它允许 CPU 保持深度闲置状态的时间更长一些。但是计时器刻度不是过度 CPU 唤醒的唯一原因,来自程序的功能调用还可阻止 CPU 进入或者保持闲置状态。可在 50 多个程序中减少不必要的功能调用。
输入或者输出(IO)到存储设备和网络接口会强制消耗电源。在具有处于闲置状态时减少电源消耗功能(比如 ALPM 或者 ASPM)的存储和网络设备中,这个流量可阻止该设备进入或者保持闲置状态,并可阻止硬盘在不使用时转速降低。已经在有些程序中最小化了过度或者不必要的需求。特别是那些阻止硬盘降低转速的需求。
无论是否需要都自动启动的服务会在很大程度上浪费系统资源。系统应尽量将其设定为默认 "off" 或者 "on demand"。例如:无论是否有蓝牙设备,以前在系统启动时,启用蓝牙服务的 BlueZ 会自动运行。BlueZ 启动脚本现在在启动该服务前检查系统中是否有蓝牙设备。
第 4 章 使用案例
4.1. 示例 - 服务器
网页服务器需要网络和磁盘 I/O。根据外部连接速度,100 Mbit/s 应该足够了。如果该机器大多数提供的是静态页面,CPU 性能则并不重要。因此电源管理选项应包括:
- 无 tuned 的磁盘或者网络插件。
- 打开 ALPM。
- 打开
按需
调节器。 - 网卡限制为 100 Mbit/s。
计算服务器主要是 CPU。电源管理选择可能包括:
- 根据任务以及出现数据存储的位置,激活 tuned 的磁盘或者网络插件;或者在批处理系统中完全激活 tuned。
- 根据应用,可能是
性能
调节器。
邮件服务器主要需要磁盘 I/O 和 CPU。电源管理选择应包括:
- 打开
按需
调节器,因为 CPU 最后的几个百分比并不重要。 - 无 tuned 的磁盘或者网络插件。
- 不应该限制网络速度,因为邮件通常是内部的,并可因此从 1 Gbit/s 或者 10 Gbit/s 连接中获益。
文件服务器的需要与邮件服务器类似,但根据所用协议,可能需要更多的 CPU 性能。通常,基于 Saba 的服务器需要的 CPU 比 NFS 多,而 NFS 又比 iSCSI 需要更多的 CPU。即使如此,您应可以使用按需
调节器。
目录服务器通常对磁盘 I/O 的要求较低,特别是在有足够 RAM 的情况下。网络延迟最重要,而网络 I/O 次之。您可以考虑使用较低连接速度的延迟网络调节,但您应为具体网络进行细心的测试。
4.2. 示例 - 笔记本电脑
- 将系统 BIOS 配置为禁用所有您不使用的硬件。例如:并口或者串口、读卡器、摄像头、WiFi 以及蓝牙,这里只给出一些可能的硬件。
- 在较暗的环境中,您不需要使用最大亮度就可舒服地阅读屏幕中的内容,此时可调暗显示。请在 GNOME 桌面中使用「系统」+「首选项」 → 「电源管理」,在 KDE 桌面中使用 「Kickoff Application Launcher」+「计算机」+「系统设置」+「高级」 → 「电源管理」,或者在命令行中使用 gnome-power-manager 或者 xbacklight,或者您笔记本电脑中的功能键。
- 使用 tuned-adm 的
laptop-battery-powersave
侧写启用整个节能机制。请注意会影响硬盘和网络接口的性能和延迟。
- 请使用
按需
调节器(红帽企业版 Linux 6 中默认启用) - 启用笔记本电脑模式(
laptop-battery-powersave
侧写的一部分):echo 5 > /proc/sys/vm/laptop_mode
- 增加磁盘冲洗时间(
laptop-battery-powersave
侧写的一部分):echo 1500 > /proc/sys/vm/dirty_writeback_centisecs
- 禁用 nmi 监视器(
laptop-battery-powersave
侧写的一部分):echo 0 > /proc/sys/kernel/nmi_watchdog
- 启用 AC97 音频节能(在红帽企业版 Linux 6 中默认启用):
echo Y > /sys/module/snd_ac97_codec/parameters/power_save
- 启用多核节能(
laptop-battery-powersave
侧写的一部分):echo Y > /sys/module/snd_ac97_codec/parameters/power_save
- 启用 USB 自动挂起:
for i in /sys/bus/usb/devices/*/power/autosuspend; do echo 1 > $i; done
请注意:USB 自动挂起并不适用于所有 USB 设备。 - 为 ALPM 启用最小能量设置(
laptop-battery-powersave
侧写的一部分):echo min_power > /sys/class/scsi_host/host*/link_power_management_policy
- 使用 relatime 挂载文件系统(在红帽企业版 Linux 6 中默认使用):
mount -o remount,relatime mountpoint
- 为硬盘激活最佳节能模式(
laptop-battery-powersave
侧写的一部分):hdparm -B 1 -S 200 /dev/sd*
- 禁用 CD-ROM 调用(
laptop-battery-powersave
侧写的一部分):hal-disable-polling --device /dev/scd*
- 将屏幕亮度降低至
50
或更小,例如:xbacklight -set 50
- 为屏幕闲置激活 DPMS:
xset +dpms; xset dpms 0 0 300
- 降低 Wi-Fi 能源等级(
laptop-battery-powersave
侧写的一部分):for i in /sys/bus/pci/devices/*/power_level ; do echo 5 > $i ; done
- 取消激活 Wi-Fi:
echo 1 > /sys/bus/pci/devices/*/rf_kill
- 将有线网络限制为 100 Mbit/s(
laptop-battery-powersave
侧写的一部分):ethtool -s eth0 advertise 0x0F
附录 A. 开发者小贴示
- 使用线程。
- 不必要 CPU 唤醒以及未有效使用唤醒。如果您必须执行唤醒,尽快一次做完所有的事(迅速返回闲置状态)。
- 不必要的
[f]sync()
使用。 - 不必要的活跃调用或者使用简短常规超时(使用响应事件)。
- 没有有效使用唤醒。
- 低效磁盘访问。使用大量缓冲来避免频繁的磁盘访问。一次写入大块信息。
- 低效使用计时器。可能时使用跨应用程序(甚至跨系统)的组群计时器。
- 过量的 I/O,电源消耗或者内存使用(包括内存泄露)
- 执行不必要计算。
A.1. 使用线程
Python 使用全局锁定解码器[1],因此使用线程只能在有大量 I/O 操作时受益。Unladen-swallow [2] 是一个 Python 快速部署,您可用它来优化您的代码。
Perl 线程原是用于系统中不使用 forking 技术的应用程序(比如使用 32 位 Windows 操作系统的系统)。在 Perl 线程中会为每个单一线程复制数据(写时复制)。数据不是默认共享的,因为用户应该可以定义数据共享等级。必须包括共享 threads::shared 模块的数据。但是数据不仅仅是被复制(写时复制),该模块还为这些数据生成了捆绑变量,这就需要更多的时间,且速度更慢。[3]
C 线程共享同一内存,每个线程都有自己的栈,同时内核不一定要生成新的文件描述符并分配新的内存空间。C 可以真正在更多线程中使用更多 CPU 支持。因此要最大化您的线程性能,请使用低级语言,比如 C 或者 C++。如果您使用脚本语言,请考虑写入一个 C 绑定。请使用分析器识别不能很好执行的代码。[4]
A.2. 唤醒
int fd; fd = inotify_init(); int wd; /* checking modification of a file - writing into */ wd = inotify_add_watch(fd, "./myConfig", IN_MODIFY); if (wd < 0) { inotify_cant_be_used(); switching_back_to_previous_checking(); } ... fd_set rdfs; struct timeval tv; int retval; FD_ZERO(&rdfs); FD_SET(0, &rdfs); tv.tv_sec = 5; value = select(1, &rdfs, NULL, NULL, &tv); if (value == -1) perror(select); else { do_some_stuff(); } ...
/proc/sys/fs/inotify/max_user_watches
中获得,虽然该数字是可以更改的,但并不建议如此操作。再有,inotify 失败时,该代码必须返回不同的检查方法,通常意味着在源代码中会有很多 #if #define
。
A.3. Fsync
Fsync
被视为大量消耗 I/O 的操作,但这并不完全正确。例如:参见 Theodore Ts'o's 的文章《不要害怕 fsync!》 [5] 以及附带的讨论。
fsync
,且由于文件系统设置(主要使用数据排序模式的 ext3),什么都不发生时会有一个长时间延迟。如果另一个进程同时正在复制一个大文件,这就需要很长的时间(最长可达 30 秒)。
fsync
,则在切换到 ext4 文件系统时出了问题。Ext3 是被设定为数据排序模式,它会每几秒钟排空一次内存并将其保存到磁盘中。但 ext4 使用的是笔记本电脑模式,保存内存的时间间隔较长,且可能在系统意外关闭时丢失数据。现在 ext4 有一个补丁,但我们必须仍在设计应用程序时小心谨慎,正确使用 fsync
。
/* open and read configuration file e.g. ~/.kde/myconfig */ fd = open("./kde/myconfig", O_WRONLY|O_TRUNC|O_CREAT); read(myconfig); ... write(fd, bufferOfNewData, sizeof(bufferOfNewData)); close(fd);
open("/.kde/myconfig", O_WRONLY|O_TRUNC|O_CREAT); read(myconfig); ... fd = open("/.kde/myconfig.suffix", O_WRONLY|O_TRUNC|O_CREAT); write(fd, bufferOfNewData, sizeof(bufferOfNewData)); fsync; /* paranoia - optional */ ... close(fd); rename("/.kde/myconfig", "/.kde/myconfig~"); /* paranoia - optional */ rename("/.kde/myconfig.suffix", "/.kde/myconfig");
附录 B. 修订记录
修订历史 | |||
---|---|---|---|
修订 1.0-5.400 | 2013-10-31 | Rüdiger Landmann | |
| |||
修订 1.0-5 | 2012-07-18 | Anthony Towns | |
| |||
修订 1.0-1 | Thu Oct 7 2010 | Rüdiger Landmann | |
| |||
修订 1.0-0 | Thu Oct 7 2010 | Rüdiger Landmann | |
|