第 18 章电源管理

目录

18.1. 省电功能
18.2. 高级配置和电源接口 (ACPI)
18.3. 硬盘的休眠
18.4. 查错
18.5. 更多信息

电源管理对于便携式计算机特别重要,但对于其他系统也是有用的。ACPI(高级配置和电源接口)在所有通用计算机(便携式计算机、台式机和服务器)上都可用。电源管理技术需要合适的硬件和 BIOS 例程。大多数便携式计算机、许多目前的台式机和服务器都符合这些要求。还可以通过控制 CPU 频率调节以达到省电或降低噪音的目的。

18.1. 省电功能

省电功能不仅对便携式计算机的移动使用很重要,而且对台式机系统也很重要。ACPI 中的主要功能和它们的用法为:

待机

不支持。

暂挂(到内存)

此方式将整个系统状态写入 RAM。随后,除 RAM 外,整个系统都进入休眠状态。在此状态下,计算机消耗的电量非常少。此状态的优点是无需引导和重启动应用程序就可以在数秒内将工作恢复到原来的进度。此功能对应于 ACPI 状态 S3。对此状态的支持仍在开发中,因此目前主要依靠硬件来实现支持。

休眠(暂挂到磁盘)

在此运行方式下,将整个系统状态写入硬盘并关闭系统电源。至少要有一个像 RAM 一样大的交换分区才能写入所有活动的数据。从该状态重激活大约需要 30 至 90 秒的时间。将恢复到暂停之前的状态。某些制造商提供这种方式的有用的混合变体(例如 IBM Thinkpad 中的 RediSafe)。对应的 ACPI 状态是 S4。在 Linux 中,由独立于 ACPI 的内核例程执行暂挂到磁盘。

电池监视

ACPI 检查电池充电状态并提供相关信息。另外,当达到临界电量状态时,它将协调要执行的操作。

自动关闭电源

关闭后,将关闭计算机的电源。当在电池电量用完前立即执行自动关闭时,此功能特别重要。

处理器速度控制

在 CPU 方面,有三种方法可以节省电能:频率和电压调节(也称为 PowerNow!Speedstep)、限制和使处理器进入休眠 (C-state)。根据计算机的运行方式,还可以将这三种方法结合起来使用。

18.2. 高级配置和电源接口 (ACPI)

ACPI 旨在支持操作系统设置和控制各个硬件组件。ACPI 取代即插即用电源管理 (PnP) 和高级电源管理 (APM)。它提供有关电池、AC 适配器、温度、风扇和系统事件(例如合上机盖电池电量低)的信息。

BIOS 提供包含有关各个部件和硬件访问方法信息的表。操作系统使用这些信息执行指派中断或激活和取消激活部件等任务。因为操作系统执行 BIOS 中储存的命令,所以功能取决于 BIOS 实施。/var/log/boot.msg 中报告了 ACPI 能够检测并装载的表。 有关对 ACPI 问题进行故障诊断的详细信息,请参见第 18.2.3 节 “故障诊断”

18.2.1. 控制 CPU 性能

CPU 可以采用三种节能方法:

根据计算机的运行方式,还可以将这三种方法结合起来使用。省电还意味着系统温度不会升得过高并且激活风扇的频率会降低。

仅当处理器忙时,才需要进行频率调节和限制,这是因为当处理器处于空闲状态时总是会应用最经济的 C-state。如果 CPU 忙,则建议采用的省电方法是频率调节。处理器经常只在部分负载的状态下工作。在这种情况下,可以以较低的频率运行。通常,最佳方法是由内核按需调节器控制动态频率调节。

节流应作为最后没有办法时采用的方法,例如,虽然系统负载很高,但为延长电池工作时间而采用节流。但是,如果节流程度过高,某些系统将不会正常运行。此外,如果 CPU 处理的任务量很少,则 CPU 节流就没什么作用。

18.2.1.1. 频率和电压调节

PowerNow!Speedstep 是 AMD 和 Intel 为这一技术指定的名称。但是,其他制造商的处理器中也应用了这一技术。CPU 的时钟频率及其核心电压同时降低,因而采用这一技术所节省的电量远远超过了线性省电量。这意味着,如果频率减半(一半的性能),所节省的电量远不止一半。此技术独立于 ACPI。

有两种主要的方法可以用来执行 CPU 频率调节:通过内核本身(带有内核调节器的 CPUfreq 基础结构)或通过用户空间应用程序。内核调节器是可根据不同准则(或某种预配置的 CPU 电源模式)更改 CPU 频率的策略调节器。以下调节器对 CPUfreq 子系统可用:

性能调节器

将 CPU 频率静态设置为可能的最高频率,以实现最佳性能。因此,节能不是此调节器的重点。

节能调节器

将 CPU 频率静态设置为可能的最低频率。这会对性能造成严重影响,因为不管处理器有多忙,系统都不会超过此频率运行。

按需调节器

动态 CPU 频率策略的内核实施:此调节器会监视处理器利用率。利用率一旦超过特定阈值,调节器就将频率设置为可用的最高频率。如果利用率低于阈值,将使用下一个最低频率。如果系统还是处于利用率低的状态,则再次降低频率,直到设定可用的最低频率为止。

保守调节器

和按需实施类似,保守调节器也会根据处理器利用率动态调节频率,不同的是后者会更加温和地增加电源。如果处理器利用率超过特定阈值,此调节器不会立即切换到可用的最高频率(像按需调节器那样),而是切换到下一个可用的较高频率。

内核调节器相关的文件位于 /sys/devices/system/cpu/cpu*/cpufreq/。如果计算机有多个 CPU,/sys/devices/system/cpu/ 将会为每个处理器保存一个子目录:cpu0cpu1 等。如果系统目前使用按需调节器或保守调节器,将会在包含此类调节器参数的 cpufreq 中看到这些调节器的单独子目录。

18.2.1.2. 限制时钟频率 (T-state)

此技术将忽略一定百分比的 CPU 时钟信号脉冲。如果节流 25%,则将忽略四分之一的脉冲,如果节流 87.5%,则只有八分之一的脉冲到达处理器。但是,采用这种方法所节省的电量稍微低于线性省电量。通常,只有在频率调节不可用或要最大程度节省电量时才使用节流。该技术还必须用特殊进程控制。处理器限制状态 (T-state) 的系统接口是 /proc/acpi/processor/*/throttling

18.2.1.3. 使处理器进入休眠 (C-state)

现代处理器有称为 C-state 的若干节能模式。它们反映了空闲处理器关闭不使用的组件以实现节能的的能力。只要没有活动,操作系统就会把处理器置于休眠状态。在这种情况下,操作系统会向 CPU 发送 halt 命令。有三种空闲状态:C1C2C3。最经济的状态是 C3,在这种状态下,连处理器缓存与主内存之间的同步都将被暂停。因此,只有在没有任何其他设备通过总线主控芯片活动修改主储存器的内容时才能应用此状态。某些驱动程序禁止使用 C3。当前状态显示在 /proc/acpi/processor/*/power 中。

有关更多信息,请参见第 11.1.1 节 “C-States (Processor Operating States)” (第 11 章 Power Management, ↑系统分析和微调指南)。

18.2.2. 工具

要查看或调节 CPUfreq 子系统的当前设置,请使用 cpufrequtils 针对该用途提供的工具。安装了 cpufrequtils 包后,使用 cpufreq-info 检索 CPUfreq 内核信息。cpufreq-set 命令可用于修改 CPUfreq 设置。例如,作为 root 运行以下命令,以在运行时激活按需调节器:

cpufreq-set -g ondemand

有关更多细节和可用选项,请参见 cpufreq-infocpufreq-set 手册页,也可分别运行 cpufreq-info --helpcpufreq-set --help

一系列相对全面的 ACPI 实用程序包含这样一些工具:只显示信息(例如,电池电量水平和温度)的工具(acpi、klaptopdaemon 等)、简化对 /proc/acpi 中的结构进行访问的工具或协助监视更改的工具(akpi、acpiw 和 gtkacpiw)以及用于编辑 BIOS 中 ACPI 表的工具(包 pmtools)。

18.2.3. 故障诊断

问题有两种不同的类型。一种是内核的 ACPI 代码可能包含未及时检测出的错误。在这种情况下,可以通过下载获得解决方案。更多情况下,问题是由 BIOS 引起的。有时,会故意将一些不符合 ACPI 规范的配置集成在 BIOS 中,用于避免其他常用操作系统中 ACPI 实施的错误。在 ACPI 实施中有严重错误的硬件部件会被记录在一个黑名单中,防止 Linux 内核对这些部件使用 ACPI。

在遇到问题时,首先要做的是更新 BIOS。如果计算机根本未引导,则使用以下引导参数之一可能会解决问题:

pci=noacpi

不使用 ACPI 配置 PCI 设备。

acpi=ht

只执行简单的资源配置。不要将 ACPI 用于其他目的。

acpi=off

禁用 ACPI。

[Warning]不使用 ACPI 引导会出现问题

某些较新的计算机(特别是 SMP 系统和 AMD64 系统)需要 ACPI 以正确配置硬件。在这些计算机上,禁用 ACPI 可能会产生问题。

有时,计算机会对通过 USB 或 FireWire 挂接的硬件感到困惑。如果一台计算机拒绝引导,请拔下所有不需要的硬件,然后再次重试。

引导后,用命令 dmesg| grep -2i acpi 来监视系统的引导消息(或所有消息,因为问题可能不是由 ACPI 引起的)。如果在分析 ACPI 表时出错,则最重要的表 DSDT(区分系统描述表)可替换为改进的版本。在这种情况下,将忽略 BIOS 中有问题的 DSDT。中对这一过程进行了介绍。第 18.4 节 “查错”

在内核配置中,可以使用开关来激活 ACPI 调试消息。如果已编译并安装了具有 ACPI 调试功能的内核,则支持对详细信息执行错误专家搜索。

如果遇到 BIOS 或硬件问题,则最好与制造商联系。特别是如果制造商不常对 Linux 提供支持,他们就应该面对这些问题。只有在制造商意识到有很多客户在使用 Linux 时,他们才会重视这一问题。

18.2.3.1. 更多信息

18.3. 硬盘的休眠

在 Linux 中,如果不使用硬盘,则可以使硬盘完全进入休眠状态,或者在更经济或更安静的方式下运行。在目前的便携式计算机上,您无需手动关闭硬盘,因为硬盘会在不运行时自动进入经济的运行方式。但是,如果要最大程度地节能,请使用 hdparm 命令测试以下某些方法。

它可用于修改各种磁盘设置。选项 -y 将硬盘立即切换到待机方式。-Y 使硬盘进入休眠状态。hdparm -S x 会使硬盘在一段时间(未活动)后减慢运行速度。将 x 替换如下:0 表示禁用此机制,导致硬盘持续运行。值 1240 表示的时间为所选的值乘以 5 秒。值 241251 对应的时间分别是 30 分钟的 1 到 11 倍。

使用选项 -B 可以控制硬盘的内部省电选项。在 0255 之间选择一个值,0 表示最大省电方式,255 表示最大吞吐量方式。结果取决于所使用的硬盘,难以估算。要让硬盘安静一些,请使用选项 -M。在 128254 之间选择一个值,128 表示最安静,254 表示速度最快。

通常,让硬盘进入休眠状态并不容易。在 Linux 中,大量的进程对硬盘执行写操作,因而会经常将其唤醒。因此,一定要了解 Linux 如何处理需要写入硬盘的数据。首先,在 RAM 中对所有数据进行缓冲。此缓冲区由 pdflush 守护程序监视。当数据达到一定的有效期限制或缓冲区已被填充到一定程度时,就会清理缓冲区,将其中的内容写入硬盘。缓冲区大小是动态的,取决于内存的大小和系统负载。默认情况下,将 pdflush 设置为较短的时间间隔可以获得最好的数据完整性。它会每 5 秒钟检查一次缓冲区并将数据写入硬盘。以下变量很有用:

/proc/sys/vm/dirty_writeback_centisecs

包含截至 pdflush 线程唤醒的延迟(以百分之一秒为单位)。

/proc/sys/vm/dirty_expire_centisecs

定义最晚在什么时间范围之后应写出未写入页。默认值是 3000,表示 30 秒。

/proc/sys/vm/dirty_background_ratio

pdflush 开始写入未写入页之前未写入页的最大百分比。默认值是 5%。

/proc/sys/vm/dirty_ratio

当未写入页超出总内存的此百分比后,将强制进程在其时间范围内写入未写入缓冲区,而不是继续写入。

[Warning]对数据完整性的损害

更改 pdflush 守护程序设置将损害数据完整性。

除了这些进程之外,日记文件系统(例如 ReiserFSExt3Ext4 等)独立于 pdflush 写入它们的元数据,这也会妨碍硬盘减速。为了避免这种情况,已为移动设备开发了特殊的内核扩展。要利用扩展,请安装 laptop-mode-tools 包;有关细节,请参见 /usr/src/linux/Documentation/laptops/laptop-mode.txt

另一个重要因素是活动程序的行为方式。例如,好的编辑器会定期将当前已修改文件的隐藏备份写入硬盘,而这会唤醒磁盘。可以禁用此类功能,但这会影响数据的完整性。

在此连接中,邮件守护程序 postfix 使用变量 POSTFIX_LAPTOP。如果将此变量设为 yes,则 postfix 访问硬盘的频率将显著降低。

在 SUSE Linux Enterprise Desktop 中,这些技术受 laptop-mode-tools 控制。

18.4. 查错

文件 /var/log/messages 中记录了所有错误消息和警报。以下几个部分介绍最常见的问题。

18.4.1. 硬件支持已激活 ACPI,但功能不工作

如果遇到 ACPI 问题,请在 dmesg 输出中使用 dmesg|grep -i acpi 命令搜索 ACPI 特定的消息。

可能需要更新 BIOS 来解决问题。请转到便携式计算机制造商的主页,查找已更新的 BIOS 版本,然后安装它。要求制造商遵循最新的 ACPI 规范。如果在更新 BIOS 后错误仍然存在,则按以下步骤用已更新的 DSDT 替换 BIOS 中有问题的 DSDT 表。

过程 18.1. 在 BIOS 中更新 DSDT 表

对于以下过程,请确保安装了以下包:kernel-sourceacpicamkinitrd

  1. http://acpi.sourceforge.net/dsdt/index.php 为您的系统下载 DSDT。检查是否已解压缩并编译了此文件,如果文件扩展名是 .aml(ACPI 计算机语言),则表明已完成这些操作。如果是这种情况,请继续执行第 3 步。

  2. 如果已下载表的文件扩展名是 .asl(ACPI 源语言),请执行以下命令编译扩展名:

    iasl -sa file.asl
  3. 将(生成的)文件 DSDT.aml 复制到任意位置(建议复制到 /etc/DSDT.aml)。

  4. 编辑 /etc/sysconfig/kernel 并相应地调整指向 DSDT 文件的路径。

  5. 启动 mkinitrd。一旦安装了内核并使用 mkinitrd 创建了 initrd 文件,引导系统时就会集成并装载修改过的 DSDT。

18.4.2. CPU 频率不工作

请参见内核源以确认是否支持您的处理器。您可能需要特殊内核模块或模块选项来激活 CPU 频率控制。如果安装了 kernel-source 包,则在 /usr/src/linux/Documentation/cpu-freq/* 中可找到此信息。

18.4.3. 暂挂和待机不工作

ACPI 系统由于 DSDT 实现 (BIOS) 有问题,可能在暂挂和待机中会遇到问题。如果出现这种情况,请更新 BIOS。

当系统尝试卸载有问题的模块时,会停止系统或不触发暂挂事件。如果您未卸载模块或停止阻止成功暂停的服务,也会发生相同的情况。在这两种情况下,尝试确定阻止采用休眠方式的有问题的模块。日志文件 /var/log/pm-suspend.log 包含关于所发生的情况以及哪里可能有错误的详细信息。修改 /usr/lib/pm-utils/defaults 中的 SUSPEND_MODULES 变量以在暂挂或待机之前卸载有问题的模块。

请参见 http://old-en.opensuse.org/Pm-utilshttp://en.opensuse.org/SDB:Suspend_to_RAM 以获取有关如何修改暂挂和继续进程的更多详细信息。

18.5. 更多信息