电源管理指南
在 RHEL 7 中管理和优化功耗
摘要
第 1 章 概述 复制链接链接已复制到粘贴板!
1.1. 电源管理的重要性 复制链接链接已复制到粘贴板!
- 降低总体功耗以节约成本
- 服务器和计算中心的发热的缩减
- 降低辅助成本,包括冷却、空间、电缆、生成器和 不间断电源 (UPS)
- 延长笔记本电脑的电池寿命
- 降低二氧化碳的输出
- 满足有关 Green IT 的政府法规或法律要求,例如 Energy Star
- 使新系统满足公司的要求
1.2. 电源管理基础 复制链接链接已复制到粘贴板!
闲置 CPU 应该在需要时唤醒
从 Red Hat Enterprise Linux 6 开始,内核会无空运行,这意味着以前的定期计时器中断已被按需中断替代。因此,空闲的 CPU 可以在新任务排队进行处理前保持闲置状态,并且已处于较低电源状态的 CPU 可以保持这个状态更长时间。但是,如果您的系统中存在会创建不必要的计时器事件的应用程序时,此功能的好处可能会减少。轮询事件,如检查卷更改或鼠标移动是此类事件的示例。
应该完全禁用未使用的硬件和设备
对于有移动部分(例如硬盘)的设备来说,这尤其如此。除此之外,一些应用程序可能会留下未使用但已启用的设备"打开";当发生这种情况时,内核会假定设备处于使用状态,这样可防止设备进入节能状态。
较少的活动应转代表低的电源消耗
然而,在很多情况下,这取决于现代硬件和正确的 BIOS 配置。较旧的系统组件通常不支持我们现在可在 Red Hat Enterprise Linux 7 中支持的一些新功能。确保您的系统使用了最新的官方固件,且在 BIOS 的电源管理或设备配置部分中启用了电源管理功能。要查找的一些功能包括:
- SpeedStep
- PowerNow!
- cool'n'Quiet
- ACPI (C 状态)
- Smart
不同的 CPU 状态形式及其影响
现代 CPU 与 高级配置和电源接口 (ACPI)一起提供不同的电源状态。三个不同的状态是:
- Sleep (C-states)
- Frequency and voltage (P-states)p-state 描述了处理器及其环境操作点的频率,它们随着 P-state 的增加而扩展。
- Heat 输出(T-states 或 "thermal state")
关闭的机器使用最少电能
很明显,因为这听起来可能听到,实际省电功能的最佳方法之一就是关闭系统。例如,您的公司可以开发一个企业文化,专注于"绿色 IT"感知,在午休休息或离开时切换机器。您还可以将多个物理服务器整合到一个较大的服务器中,并使用我们随 Red Hat Enterprise Linux 7 提供的虚拟化技术进行虚拟化。
第 2 章 电源管理审计和分析 复制链接链接已复制到粘贴板!
2.1. 审计和分析概述 复制链接链接已复制到粘贴板!
2.2. PowerTOP 复制链接链接已复制到粘贴板!
root
用户身份运行以下命令:
yum install powertop
~]# yum install powertop
root
用户身份使用,使用以下命令:
powertop
~]# powertop
root
用户身份运行以下命令:
powertop --calibrate
~]# powertop --calibrate
systemctl disable servicename.service
~]# systemctl disable servicename.service
root
身份运行,使用以下命令:
ps -awux | grep processname strace -p processid
~]# ps -awux | grep processname
~]# strace -p processid
C4
大于 C3)。
这对 CPU 用量的优化方式是一个很好的指示。在系统闲置时,最好最好在 C- 或 P-state 中达到 90% 或更高。
图 2.1. 操作中的 powertop
--html
选项运行 PowerTOP 来生成 HTML 报告。将 htmlfile.html 参数替换为输出文件所需名称:
powertop --html=htmlfile.html
~]# powertop --html=htmlfile.html
--time
选项更改它:
powertop --html=htmlfile.html --time=seconds
~]# powertop --html=htmlfile.html --time=seconds
2.3. Diskdevstat 和 netdevstat 复制链接链接已复制到粘贴板!
root
身份使用以下命令使用 SystemTap 安装这些工具:
yum install tuned-utils-systemtap kernel-debuginfo
~]# yum install tuned-utils-systemtap kernel-debuginfo
diskdevstat
~]# diskdevstat
netdevstat
~]# netdevstat
- update_interval
- 显示更新间隔的时间(以秒为单位)。默认:
5
- total_duration
- 整个运行的时间(以秒为单位)。默认:
86400
(1 天) - display_histogram
- 标记是否在运行结束时所有收集的数据的直方图。
- PID
- 应用程序的进程 ID
- UID
- 运行应用程序的用户 ID
- DEV
- I/O 发生的设备
- WRITE_CNT
- 写入操作的总数
- WRITE_MIN
- 连续两个写入需要的最低时间(以秒为单位)
- WRITE_MAX
- 连续两个写入的最大时间(以秒为单位)
- WRITE_AVG
- 两个连续写入的平均时间(以秒为单位)
- READ_CNT
- 读取操作的总数
- READ_MIN
- 连续两个读取所需的最低时间(以秒为单位)
- READ_MAX
- 连续两个读数的最大时间(以秒为单位)
- READ_AVG
- 连续两个读取的平均时间(以秒为单位)
- 命令
- 进程的名称
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
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
0
的 WRITE_CNT
,这意味着它们在测量期间执行某种形式的写入。在这些方面,plasma 是一大水准的先行者:它执行最多的写入操作,而在写入之间的平均时间最低。因此,如果您关注节能应用程序,Plasma 将是调查的最佳候选者。
strace -p 2789
~]# strace -p 2789
2.4. 电池生命工具工具包 复制链接链接已复制到粘贴板!
-a
启动时报告桌面计算机的性能。
办公室
工作负载会编写一个文本,更正其中的内容,并对电子表格执行同样的操作。通过运行 BLTK 和 PowerTOP 或任何其他审计或分析工具,您可以测试您执行的优化时是否活跃使用计算机,而不是仅闲置。因为您可以针对不同的设置多次运行相同的工作负载,所以您可以比较不同的设置的结果。
yum install bltk
~]# yum install bltk
bltk workload options
~]$ bltk workload options
闲置
工作负载:
bltk -I -T 120
~]$ bltk -I -T 120
-I
,--idle
- 系统闲置,用作与其他工作负载比较的基准
-R
,--reader
- 模拟读取文档(默认情况下,使用 Firefox)
-P
,--player
- 模拟从 CD 或者 DVD 驱动器中监视多媒体文件(默认情况下,使用 mplayer)
-O
,--office
- 使用 memberOf .org 套件模拟编辑文档
-a
,--ac-ignore
- 忽略 AC 电源是否可用(需要桌面使用)
-T number_of_seconds
,--time number_of_seconds
- 运行测试的时间(以秒为单位),在
闲置
工作负载中使用这个选项 -f filename
,--file filename
- 指定要被特定工作负载使用的文件,例如,要播放工作负载的文件,而不是访问 CD 或者 DVD 驱动器
-W application
,--prog application
- 指定供特定工作负载使用的应用程序,例如,Firefox 以外的浏览器用于
reader
工作负载
bltk
手册页。
/etc/bltk.conf
配置文件中指定的目录中 - 默认情况下,~/.bltk/workload.results.number
.例如,~/.bltk/reader.results.002/
目录包含 读卡器
工作负载(第一个测试没有编号)的结果。结果分散到多个文本文件中。要将结果压缩为易于阅读的格式,请运行:
bltk_report path_to_results_directory
~]$ bltk_report path_to_results_directory
Report
的文本文件中。要在终端模拟器中查看结果,请使用 -o
选项:
bltk_report -o path_to_results_directory
~]$ bltk_report -o path_to_results_directory
2.5. tuned 复制链接链接已复制到粘贴板!
udev
设备管理器监控连接的设备,并支持系统设置的静态和动态调优。动态调优是实验性功能,在 Red Hat Enterprise Linux 7 中被默认关闭。
balanced
配置集。
balanced
配置集适用于大多数工作负载,平衡能源消耗、性能和延迟。使用 balanced
配置集时,通过最大可用计算能力快速完成任务通常需要较少的能源在较长时间内执行相同的任务,而计算能力更少。
powersave
配置集可能会延长生命周期。对于此类操作,返回较低的能源消耗延迟通常可以接受,或者操作不需要快速完成,例如使用 IRC、查看简单的网页或播放音频和视频文件。
使用 powertop2tuned
powertop2tuned
工具,请使用:
yum install tuned-utils
~]# yum install tuned-utils
powertop2tuned new_profile_name
~]# powertop2tuned new_profile_name
powertop2tuned
在 /etc/tuned/
目录中创建配置集,并在当前选择的 Tuned 配置集中构建自定义配置集。为安全起见,所有 PowerTOP 调优最初在新配置集中禁用。要启用调整,请在 /etc/tuned/profile_name/tuned.conf
文件中取消注释。
--enable
或 -e
选项生成新的配置集,启用 PowerTOP 建议的大部分调整。某些潜在的调整(如 USB 自动暂停)在默认情况下被禁用,需要手动取消注释。
tuned-adm profile new_profile_name
~]# tuned-adm profile new_profile_name
powertop2tuned
支持的选项列表,请使用:
powertop2tuned --help
~]$ powertop2tuned --help
2.6. upower 复制链接链接已复制到粘贴板!
--enumerate
,-e
- 显示系统中每个电源设备的对象路径,例如:
/org/freedesktop/UPower/devices/line_power_AC /org/freedesktop/UPower/devices/battery_BAT0
/org/freedesktop/UPower/devices/line_power_AC /org/freedesktop/UPower/devices/battery_BAT0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow --dump
,-d
- 显示系统上所有电源设备的参数。
--wakeups
,-w
- 显示系统上的 CPU 唤醒。
--monitor
,-m
- 监控系统是否有电源设备的更改,例如,连接或断开 AC 电源源的连接或断开电池。按 Ctrl+C 停止监控系统。
--monitor-detail
- 监控系统是否有电源设备的更改,例如,连接或断开 AC 电源源的连接或断开电池。
--monitor-detail
选项显示比--monitor
选项更详细。按 Ctrl+C 停止监控系统。 --show-info object_path
,-i object_path
- 显示可用于特定对象路径的所有信息。例如,要获取系统上由对象路径
/org/freedesktop/UPower/devices/battery_BAT0
表示的信息,请运行:upower -i /org/freedesktop/UPower/devices/battery_BAT0
~]$ upower -i /org/freedesktop/UPower/devices/battery_BAT0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.7. GNOME Power Manager 复制链接链接已复制到粘贴板!
2.8. 其他用于审计的工具 复制链接链接已复制到粘贴板!
- vmstat
- vmstat 为您提供进程、内存、分页、块 I/O、陷阱和 CPU 活动的详细信息。使用它来仔细了解系统的整体操作以及它处于忙碌的位置。
- iostat
- iostat 与 vmstat 类似,但仅适用于块设备上的 I/O。它还提供了更详细的输出和统计数据。
- blktrace
- blktrace 是一个非常详细的块 I/O 跟踪程序。它将信息分解为与应用程序关联的单个块。它与 diskdevstat 相结合非常有用。
第 3 章 Core Infrastructure 和 Mechanics 复制链接链接已复制到粘贴板!
3.1. CPU 空闲状态 复制链接链接已复制到粘贴板!
- C0
- 操作或运行状态。在这个状态中,CPU 正常运行,根本不会被闲置。
- C1, halt
- 处理器没有执行任何指令的状态,但通常不处于较低电源状态。CPU 可能会在实际并没有延迟的情况下继续处理。提供 C-State 的所有处理器都需要支持这个状态。Pentium 4 处理器支持名为 C1E 的增强 C1 状态,它实际上是降低功耗的状态。
- C2, stop-Clock
- 这个处理器时钟被冻结的状态,但它会保留其寄存器和缓存的完整状态,因此在时钟再次启动它后,可以立即开始处理。这是一个可选状态。
- C3, sleep
- 处理器真正进入睡眠状态,不需要保持其缓存最新状态。由于此状态的原因,从 C2 开始的时间要长得多。同样,这是一个可选状态。
cpupower idle-info
~]$ cpupower idle-info
3.2. CPUfreq 复制链接链接已复制到粘贴板!
3.2.1. CPUfreq 驱动程序 复制链接链接已复制到粘贴板!
ACPI CPUfreq
Intel P-state
max_perf_pct
: 限制驱动程序请求的最大 P-state,以可用性能百分比表示。可以通过 no_turbo 设置减少可用的 P-state 性能(请参阅以下)。min_perf_pct
: min_perf_pct :限制驱动程序请求的最小 P-state,以最大(no-turbo)性能级别表示的百分比。no_turbo
: 将驱动程序限制为在 turbo frequency 频率范围下选择 P-state。turbo_pct
:显示 turbo 范围内的硬件支持的总性能百分比。这个号码与 turbo 是否已被禁用无关。num_pstates
:显示硬件支持的 P-states 数。这个号码与 turbo 是否已被禁用无关。
intel_pstate=disable
intel_pstate=disable
3.2.2. CPUfreq Governors 复制链接链接已复制到粘贴板!
3.2.2.1. Core CPUfreq Governors 复制链接链接已复制到粘贴板!
cpufreq_performance
Performance governor 强制 CPU 使用最高可能时钟频率。这个频率会被静态设置,且不会更改。因此,这个特定监管器 不提供节能功能。它只适用于数小时的工作负载,甚至仅在 CPU 中很少(或永不)闲置期间。
3.2.2.2. 复制链接链接已复制到粘贴板!
- 被动模式
带有硬件管理的 P-states 的活跃模式
- 性能
没有硬件管理的 P-states 活跃的模式
- 性能
被动模式
3.2.3. 复制链接链接已复制到粘贴板!
cpupower frequency-info --governors
~]# cpupower frequency-info --governors
cpupower frequency-set --governor [governor]
~]# cpupower frequency-set --governor [governor]
cpupower -c 1-3,5 frequency-set --governor cpufreq_userspace
~]# cpupower -c 1-3,5 frequency-set --governor cpufreq_userspace
3.2.4. 复制链接链接已复制到粘贴板!
echo 360000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
echo 360000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
3.3. 复制链接链接已复制到粘贴板!
3.4. 复制链接链接已复制到粘贴板!
- --perf-bias <0-15>
- --sched-mc <0|1|2>
- --sched-smt <0|1|2>
3.5. 复制链接链接已复制到粘贴板!
3.6. 复制链接链接已复制到粘贴板!
/sys/devices/system/cpu/power/
/sys/devices/system/cpu/power/
control
auto
on
autosuspend_delay_ms
3.7. 复制链接链接已复制到粘贴板!
- default
- powersave
- performance
pcie_aspm=off
disables ASPM
journalctl -b | grep ASPM
~]$ journalctl -b | grep ASPM
3.8. 复制链接链接已复制到粘贴板!
3.9. 复制链接链接已复制到粘贴板!
3.10. 复制链接链接已复制到粘贴板!
3.11. 复制链接链接已复制到粘贴板!
3.12. RFKill 复制链接链接已复制到粘贴板!
rfkill block 0
~]# rfkill block 0
rfkill block wifi
~]# rfkill block wifi
rfkill block all
~]# rfkill block all
第 4 章 使用案例 复制链接链接已复制到粘贴板!
4.1. 复制链接链接已复制到粘贴板!
Webserver
Web 服务器需要网络和磁盘 I/O。根据外部连接速度 100 Mbit/s 可能已经足够。如果机器服务于静态页面,则 CPU 性能可能并不重要。因此,电源管理选择可能包括:
- 没有适用于 tuned 的磁盘或网络插件。
- 启用 ALPM。
ondemand
governor 开启。- 网卡限制为 100 Mbit/s。
Compute 服务器
计算服务器主要需要 CPU。电源管理选择可能包括:
- 根据作业以及数据存储发生的位置、调优的磁盘或网络插件;或对于批处理模式系统,完全活跃的 tuned 。
- 根据利用率,可能是
performance
governor。
Mailserver
邮件服务器大多需要磁盘 I/O 和 CPU。电源管理选择可能包括:
ondemand
governor 打开 on,因为最后几个 CPU 性能不重要。- 没有适用于 tuned 的磁盘或网络插件。
- 网络速度不应有限,因为邮件通常是内部的,因此可以从 1 Gbit/s 或 10 Gbit/s 链接中受益。
fileserver
fileserver 要求与 mailserver 的不同,但根据所使用的协议,可能需要更多的 CPU 性能。通常,基于 Samba 的服务器需要超过 NFS 的 CPU,NFS 通常需要超过 iSCSI。即使如此,您也应该可以使用 ondemand
governor。
目录服务器
目录服务器通常对磁盘 I/O 的要求较低,特别是在有足够 RAM 时。网络延迟非常重要,尽管网络 I/O 较少。您可能会考虑延迟网络性能优化,并降低链路速度,但您应该根据您的特定网络仔细测试。
4.2. 示例 - Laptop 复制链接链接已复制到粘贴板!
- 将系统配置为禁用您不使用的所有硬件。例如,并行或串行端口、卡读卡器、Webcams、WiFi 和 Bluetooth 仅命名几个可能的候选者。
- DIM 在 darker 环境中显示,您不需要完全修改来读取屏幕。在 GNOME 桌面上使用 gnome-power-manager 或 xbacklight,或者笔记本电脑上的功能键。+ 电源管理, + + + → on KDE 桌面;或者在命令行中
- 使用
ondemand
governor (在 Red Hat Enterprise Linux 7 中默认启用) - 启用 AC97 音频节能(在 Red Hat Enterprise Linux 7 中默认启用):
echo Y > /sys/module/snd_ac97_codec/parameters/power_save
~]# echo Y > /sys/module/snd_ac97_codec/parameters/power_save
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 启用 USB 自动挂起:
for i in /sys/bus/usb/devices/*/power/autosuspend; do echo 1 > $i; done
~]# for i in /sys/bus/usb/devices/*/power/autosuspend; do echo 1 > $i; done
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,USB 自动挂起无法适用于所有 USB 设备。 - 使用 relatime (Red Hat Enterprise Linux 7 中的默认设置)挂载文件系统:
mount -o remount,relatime mountpoint
~]# mount -o remount,relatime mountpoint
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 将屏幕亮度减少到
50
或更少,例如:xbacklight -set 50
~]$ xbacklight -set 50
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 激活 DPMS 以进行屏幕闲置:
xset +dpms; xset dpms 0 0 300
~]$ xset +dpms; xset dpms 0 0 300
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 取消激活 Wi-Fi :
echo 1 > /sys/bus/pci/devices/*/rf_kill
~]# echo 1 > /sys/bus/pci/devices/*/rf_kill
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
附录 A. 开发人员提示 复制链接链接已复制到粘贴板!
- 使用线程。
- 不必要的 CPU 唤醒,且不有效地使用唤醒。如果需要唤醒,请一次性执行所有操作(停止闲置),并尽快进行。
- 不必要地使用
[f]sync()
。 - 不必要的活动轮询或使用短、常规超时。(改为使用事件)。
- 不有效地使用唤醒。
- 磁盘访问效率低。使用大型缓冲区以避免频繁访问磁盘。一次编写一个大块。
- 计时器的使用效率低下。如果可能,跨应用程序(甚至跨系统)分组计时器。
- 过量 I/O、功耗或内存使用情况(包括内存泄漏)
- 执行不必要的计算。
A.1. 使用线程 复制链接链接已复制到粘贴板!
Python
Python 使用 Global Lock Interpreter[1]因此,线程处理只适用于更大的 I/O 操作。unladen-swallow [2] 是更快速的 Python 实施,您可能需要优化代码。
Perl
Perl 线程最初是为没有分叉(如具有 32 位 Windows 操作系统的系统)的系统上运行的应用程序创建的。在 Perl 线程中,会为每个单个线程复制数据(复制 On Write)。默认情况下,数据不共享,因为用户应该能够定义数据共享级别。对于共享 threads::shared 模块的数据,必须包含它们。但是,数据不仅会被复制(复制 On Write),但模块还会为数据创建绑定的变量,这需要更长的时间,甚至较慢。[3]
C
c 线程共享相同的内存,每个线程都有自己的堆栈,且内核不必创建新的文件描述符并分配新的内存空间。C 真正可以将更多 CPU 支持用于更多线程。因此,要最大化线程的性能,请使用 C 或 C++ 等低级别语言。如果您使用脚本语言,请考虑编写 C 绑定。使用配置文件器确定执行代码不佳的部分。[4]
A.2. Wake-ups 复制链接链接已复制到粘贴板!
/proc/sys/fs/inotify/max_user_watches
获取,尽管它可以更改,但不建议这样做。另外,如果 inotify 失败,代码必须回退到不同的检查方法,这通常意味着源代码中出现很多 #if #define
。
A.3. fsync 复制链接链接已复制到粘贴板!
Fsync
称为 I/O 昂贵的操作,但这并不完全正确。
fsync
的 SQLite 和因为文件系统设置(主要是 ext3 带有数据排序模式)的 SQLite,在没有发生任何发生时会有一个较长的延迟。如果另一个进程同时复制大型文件,则可能需要很长时间(最多 30 秒)。
fsync
没有被全部使用,交换机会出现到 ext4 文件系统的问题。Ext3 设置为数据排序模式,每几秒钟刷新内存并将其保存到磁盘中。但是,在使用 ext4 和 laptop_mode 时,保存的间隔较长,数据可能会在系统意外关闭时丢失。现在 ext4 被修补,但我们仍然必须仔细考虑应用程序的设计,并根据情况使用 fsync
。
附录 B. 修订历史记录 复制链接链接已复制到粘贴板!
修订历史 | |||
---|---|---|---|
修订 2.2-9 | Mon Aug 05 2019 | ||
| |||
修订 2.2-6 | Mon Jul 24 2017 | ||
| |||
修订 2.2-5 | Tue Mar 21 2017 | ||
| |||
修订 2.0-2 | Fri Oct 14 2016 | ||
| |||
修订 2.0-1 | Wed 11 Nov 2015 | ||
| |||
修订 1-3 | Fri 19 Jun 2015 | ||
| |||
修订 1-2 | Wed 18 Feb 2015 | ||
| |||
修订 1-1 | Thu Dec 4 2014 | ||
| |||
修订 1.0-9 | Tue Jun 9 2014 | ||
| |||
修订 0.9-1 | Fri May 9 2014 | ||
| |||
修订 0.9-0 | Wed May 7 2014 | ||
| |||
修订 0.1-1 | Thu Jan 17 2013 | ||
|