电源管理对于便携式计算机特别重要,但对于其他系统也是有用的。ACPI(高级配置和电源接口)在所有通用计算机(便携式计算机、台式机和服务器)上都可用。电源管理技术需要合适的硬件和 BIOS 例程。大多数便携式计算机、许多目前的台式机和服务器都符合这些要求。还可以通过控制 CPU 频率调节以达到省电或降低噪音的目的。
省电功能不仅对便携式计算机的移动使用很重要,而且对台式机系统也很重要。ACPI 中的主要功能和它们的用法为:
不支持.
此方式将整个系统状态写入 RAM。随后,除 RAM 外,整个系统都进入休眠状态。在此状态下,计算机消耗的电量非常少。此状态的优点是无需引导和重启动应用程序就可以在数秒内将工作恢复到原来的进度。此功能对应于 ACPI 状态 S3。
在此运行方式下,将整个系统状态写入硬盘并关闭系统电源。至少要有一个像 RAM 一样大的交换分区才能写入所有活动的数据。从该状态重激活大约需要 30 至 90 秒的时间。将恢复到暂停之前的状态。某些制造商提供这种方式的有用的混合变体(例如 IBM Thinkpad 中的 RediSafe)。对应的 ACPI 状态是 S4。在 Linux 中,由独立于 ACPI 的内核例程执行暂挂到磁盘。
ACPI 检查电池充电状态并提供相关信息。另外,当达到临界电量状态时,它将协调要执行的操作。
关闭后,将关闭计算机的电源。当在电池电量用完前立即执行自动关闭时,此功能特别重要。
在 CPU 方面,有三种方法可以节省电能:频率和电压调节(也称为 PowerNow! 或 Speedstep)、限制和使处理器进入休眠 (C-state)。根据计算机的运行方式,还可以将这三种方法结合起来使用。
ACPI 旨在支持操作系统设置和控制各个硬件组件。ACPI 取代即插即用电源管理 (PnP) 和高级电源管理 (APM)。它提供有关电池、AC 适配器、温度、风扇和系统事件(例如“合上机盖”或“电池电量低”)的信息。
BIOS 提供包含有关各个部件和硬件访问方法信息的表。操作系统使用这些信息执行指派中断或激活和取消激活部件等任务。因为操作系统执行 BIOS 中储存的命令,所以功能取决于 BIOS 实施。journald 中报告了 ACPI 能够检测并装载的表。有关查看日记日志消息的更多信息,请参见第 12 章 journalctl:查询 systemd 日记。有关对 ACPI 问题进行故障诊断的详细信息,请参见第 28.2.2 节 “故障诊断”。
CPU 可以采用三种节能方法:
频率和电压调节
限制时钟频率 (T-state)
使处理器进入休眠 (C-state)
根据计算机的运行方式,还可以将这三种方法结合起来使用。省电还意味着系统温度不会升得过高并且激活风扇的频率会降低。
仅当处理器忙时,才需要进行频率调节和限制,这是因为当处理器处于空闲状态时总是会应用最经济的 C-state。如果 CPU 忙,则建议采用的省电方法是频率调节。处理器经常只在部分负载的状态下工作。在这种情况下,可以以较低的频率运行。通常,最佳方法是由内核按需调节器控制动态频率调节。
节流应作为最后没有办法时采用的方法,例如,虽然系统负载很高,但为延长电池工作时间而采用节流。但是,如果节流程度过高,某些系统将不会正常运行。此外,如果 CPU 处理的任务量很少,则 CPU 节流就没什么作用。
有关详细信息,请参见Chapter 10, Power Management, System Analysis and Tuning Guide。
问题有两种不同的类型。一种是内核的 ACPI 代码可能包含未及时检测出的错误。在这种情况下,可以通过下载获得解决方案。更多情况下,问题是由 BIOS 引起的。有时,会故意将一些不符合 ACPI 规范的配置集成在 BIOS 中,用于避免其他常用操作系统中 ACPI 实施的错误。在 ACPI 实施中有严重错误的硬件部件会被记录在一个黑名单中,防止 Linux 内核对这些部件使用 ACPI。
在遇到问题时,首先要做的是更新 BIOS。如果计算机根本未引导,则使用以下引导参数之一可能会解决问题:
不使用 ACPI 配置 PCI 设备。
只执行简单的资源配置。不要将 ACPI 用于其他目的。
禁用 ACPI。
某些较新的计算机(特别是 SMP 系统和 AMD64 系统)需要 ACPI 以正确配置硬件。在这些计算机上,禁用 ACPI 可能会产生问题。
有时,计算机会对通过 USB 或 FireWire 挂接的硬件感到困惑。如果一台计算机拒绝引导,请拔下所有不需要的硬件,然后再次重试。
引导后,使用命令 dmesg -T 来监视系统的引导消息(或所有消息,因为问题也可能是 ACPI 以外的因素所导致)。如果在分析 ACPI 表时出错,则最重要的表 DSDT(区分系统描述表)可替换为改进的版本。在这种情况下,将忽略 BIOS 中有问题的 DSDT。第 28.4 节 “查错”中对这一过程进行了介绍。
| grep -2i acpi
在内核配置中,可以使用开关来激活 ACPI 调试消息。如果编译和安装的是带有 ACPI 调试功能的内核,则会显示详细信息。
如果遇到 BIOS 或硬件问题,则最好与制造商联系。特别是如果制造商不常对 Linux 提供支持,他们就应该面对这些问题。只有在制造商意识到有很多客户在使用 Linux 时,他们才会重视这一问题。
http://tldp.org/HOWTO/ACPI-HOWTO/(详细的 ACPI HOWTO 文档,包含 DSDT 增补程序)
http://www.acpi.info(高级配置和电源接口规范)
http://acpi.sourceforge.net/dsdt/index.php(Bruno Ducrot 开发的 DSDT 增补程序)
在 Linux 中,如果不使用硬盘,则可以使硬盘完全进入休眠状态,或者在更经济或更安静的方式下运行。在目前的便携式计算机上,您无需手动关闭硬盘,因为硬盘会在不运行时自动进入经济的运行方式。但是,如果要最大程度地节能,请使用 hdparm 命令测试以下某些方法。
它可用于修改各种磁盘设置。选项 -y 将硬盘立即切换到待机方式。-Y 使硬盘进入休眠状态。hdparm 会使硬盘在一段时间(未活动)后减慢运行速度。将 x 替换如下:-S x0 表示禁用此机制,导致硬盘持续运行。值 1 到 240 表示的时间为所选的值乘以 5 秒。值 241 到 251 对应的时间分别是 30 分钟的 1 到 11 倍。
使用选项 -B 可以控制硬盘的内部省电选项。在 0 到 255 之间选择一个值,0 表示最大省电方式,255 表示最大吞吐量方式。结果取决于所使用的硬盘,难以估算。要让硬盘安静一些,请使用选项 -M。在 128 到 254 之间选择一个值,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
当未写入页超出总内存的此百分比后,将强制进程在其时间范围内写入未写入缓冲区,而不是继续写入。
更改为 pdflush 守护程序设置将损害数据完整性。
除了这些进程之外,Btrfs、Ext3、Ext4 等日记文件系统会独立于 pdflush 写入它们的元数据,这也会妨碍硬盘降速。为了避免这种情况,已为移动设备开发了特殊的内核扩展。要利用扩展,请安装 laptop-mode-tools 包;有关细节,请参见 /usr/src/linux/Documentation/laptops/laptop-mode.txt。
另一个重要因素是活动程序的行为方式。例如,好的编辑器会定期将当前已修改文件的隐藏备份写入硬盘,而这会唤醒磁盘。可以禁用此类功能,但这会影响数据的完整性。
在此连接中,邮件守护程序 postfix 使用变量 POSTFIX_LAPTOP。如果将此变量设为 yes,则 postfix 访问硬盘的频率将显著降低。
在 SUSE Linux Enterprise Desktop 中,这些技术由 laptop-mode-tools 控制。
所有错误消息和警报都记录在可以使用 journalctl 命令查询的系统日记中(有关更多信息,请参见第 12 章 journalctl:查询 systemd 日记)。以下几个部分介绍最常见的问题。
请参见内核源以确认是否支持您的处理器。您可能需要特殊内核模块或模块选项来激活 CPU 频率控制。如果安装了 kernel-source 包,则在 /usr/src/linux/Documentation/cpu-freq/* 中可找到此信息。
http://en.opensuse.org/SDB:Suspend_to_RAM — 如何使“暂挂到 RAM”正常工作
http://old-en.opensuse.org/Pm-utils — 如何修改常规暂挂框架