核心停车是 Windows 7 中引入的一项新功能,旨在改善电池性能。
根据操作系统的资源使用情况,它可能会停用多核 CPU 的一个或多个核心,以降低计算机的功耗和热排放。一旦操作需要更多的处理能力,停放的核心就会再次激活以协助执行任务
所以我的问题是,有什么办法可以在 Ubuntu 12.04 上做到这一点“核心停车场”?
答案1
目前我还没有明确的答案,但很明显,Linux 内核正在使用一些节能机制。
然而,在做了一些快速研究后,我很快意识到最新的 Linux 内核使用了一个名为交流电源接口这是高级配置和电源接口。
ACPI 正在做什么:
高级配置和电源接口 (ACPI) 规范为操作系统的设备配置和电源管理提供了一个开放的标准。
通过维基百科。
基本上,ACPI 允许控制不同的 CPU 状态,以实现更好的电源管理。
不同的 ACPI CPU 状态:
CPU C 状态(电源管理)
基本上,您可能无需担心 CPU“C 状态”。这些状态由内核+ACPI 系统自动控制,同时考虑当前系统负载。(警告:请查看下面有关 AMD Athlon 和 Duron 处理器的说明)。较新(2.6+)内核中的 ACPI 代码会在空闲时自动将 CPU 置于睡眠状态(注意:这不会改变 CPU 频率。该状态由“P 状态”控制 - 见下文)。
唯一需要注意的是,当 CPU 暂时停止时,您的系统是完全“有意识的”——您不会注意到太大的差异。但是,可以节省大量电量。想象一下,每当 CPU 空闲时,它就会进行数千次“微休息”。
CPU-T 状态(节流)
这些非常类似于“C 状态”(使用相同的 HLT 指令),但不同之处在于节流是“由您强制的”(例如,每 4 个周期被强制为睡眠周期,而不是上面的“C 状态”,后者由系统负载自动确定)。请注意,频率没有改变...请参阅下面的“P 状态”。
CPU-P 状态(性能)
如今,许多处理器(尤其是笔记本电脑)都可以在运行过程中降低时钟频率。这可以节省大量电量。英特尔称之为“SpeedStep”,AMD 称之为“Cool'n'Quiet”或“PowerNow”。更通俗地说,这些状态被称为“P 状态”。您几乎肯定必须先进入 BIOS 并为您的 CPU 启用此功能!
** 一些消费基准:**
上述 CPU 状态的功耗是多少?以下数据摘自 AMD 网站。假设一台 AMD 64 3400+/2200MHz 处理器,配备 1 MB 的 L2 缓存。顺便说一句,既然我在这里,让我抱怨一下 AMD 的命名惯例。3400+ 这个数字没有任何意义。这只是 AMD 的说法,即这款处理器“看起来像”运行在 3400MHz 上的英特尔奔腾 4。我想这是他们不失去市场份额的方式。以下是 P 状态和 T 状态的功耗值(C 状态与 T 状态是相同的 HLT 指令):
- 性能状态 0(完全活动)(2200MHz):89 瓦
- 性能状态 1 (2000MHz):70 瓦
- 性能状态 2 (800MHz):35 瓦
- 节流(HLT 指令):2.2 瓦
一些可供进一步阅读的参考资料
- Red Hat 电源管理指南(我知道你问的是 Ubuntu,但这篇文章仍然值得一读)
- http://www.spencerstirling.com/computergeek/powersaving.html
- 本文主要讨论 APM(ACPI 的旧版本),但也提到了 ACPI。
- 可以找到非常技术性的信息这里。
- PowerTop 软件,看起来很酷。
- Gentoo 电源管理指南。仍然是一本好书。
- 一篇介绍Linux期刊的文章。
- 还有维基百科文章。
編輯
[编辑#1]:谷歌搜索后,我在一些论坛上也发现了一些其他帖子(OpenSuse 论坛似乎与你寻找的内容相关)和发现这对于 Linux 来说不是什么大问题,但对于 Windows 来说却是如此,尤其是在游戏中。我还在两封邮件中找到了部分信息(第一和第二个[后续]) 在 RedHat 邮件列表中似乎与此相关。我目前正在研究其中的信息。
[编辑#2]:我对这个问题进行了一些研究,我越来越确定 Linux 中没有核心停车机制,除非有一个我不知道的 ACPI。一些有趣的发现是一些软件允许直接操纵 CPU 及其上运行的进程,例如中央处理器,numactl最后但并非最不重要,CPU频率。将继续我的研究。
答案2
有一篇文章这里提到核心停止与设置核心以推进 c 状态以节省电力有关。c 状态通过 halt 指令设置。正如 NlightNFotis 所提到的,这是使用 linux 对 ACPI 的支持完成的。
powertop
您可能能够使用英特尔编写的( sudo apt-get install powertop
) 开源程序获得有关 Linux 将您的核心置于何种状态的更多信息。如果您的硬件支持各种 c 状态,它应该能够告诉您 Ubuntu Linux 将您的核心置于这些低功耗状态的时间百分比。见下文。c 状态的数字越高,节省的电量就越多。
它还提供更多信息。
另外,与 Windows 一样,当有工作要做时,Linux 可以根据需求量、节省电力的愿望等调整核心运行的频率。
我的笔记本电脑不支持 c-states,但它可以暂停。我们有一台配备 Atom 处理器的 Acer 小型笔记本电脑支持 c-states,如下所示。
答案3
我知道这是一个老话题,但这里有更多信息。我有一台 AMD Ryzen5 5625U CPU,有 6 个物理核心和 12 个 SMT 核心。
除 Core0 之外的所有设备都可以通过以下方式“停放”:
for x in /sys/devices/system/cpu/cpu{1..11}/online; do echo 0 >"$x"; done
要取消停放核心:
for x in /sys/devices/system/cpu/cpu{1..11}/online; do echo 1 >"$x"; done
我已经禁用了 SMT,因为在测试中,在禁用 SMT 的情况下,CPU 可以利用更大的 L1 和 L2 缓存以及更高的每核晶体管数量更快地处理数据。
如果禁用 SMT,则除 Core0 之外的所有设备都可以通过以下方式“停放”:
for x in /sys/devices/system/cpu/cpu{1..5}/online; do echo 0 >"$x"; done
取消停车:
for x in /sys/devices/system/cpu/cpu{1..5}/online; do echo 1 >"$x"; done
如果您在 /etc/default/grub 中运行低延迟内核,它会有所帮助:
GRUB_CMDLINE_LINUX_DEFAULT="preempt=full tsc=reliable numa=on nosmt=force nohz=1-5 rcu_nocbs=1-5
... 在哪里:
- preempt = 线程抢占
- tsc = AMD 时钟(它被标记为不可靠,因为将时钟标记为稳定的算法依赖于 AMD 不使用的英特尔特定属性)
- numa = 非统一内存访问
- nosmt = 无同时多线程
- nohz = 将时钟滴答卸载到 Core0,让其他核心可以自由地做更多工作,或者完全停止
- rcu_nocbs = 读取-复制-更新回调...它读取 L1 和 L2 缓存(通用内核每秒 250 次,低延迟内核每秒 1000 次),复制它,然后更新它,因为时钟滴答会使 L1 和 L2 缓存无效...这就是 MS 和 MacOS 使用无滴答内核的原因。使用上述设置,我们接近完整无滴答内核的功能,我们可以停用除 Core0 之外的所有内核。
现在剩下的就是让一些有进取心的年轻程序员编写代码来构建一个应用程序,该应用程序将检查所有参数(在上面的 Grub 设置中,以及低延迟内核的使用)是否正确,以便可以进行核心停留,然后停留未使用或轻度使用的核心,并在当前使用的核心负载变得更重时取消停留所述核心。
需要注意的是...Conky 无法更新已停用核心的信息...因此,如果您停用了负载核心,Conky 将继续显示该负载,直到该核心恢复。我已向 Conky 开发人员提出问题,要求修复代码,以便将停用核心显示为 0 Hz、0% 负载和“离线”。