有两台 SLES 11 服务器:
SERVER311:~ # cat /sys/devices/system/cpu/cpuidle/current_driver
acpi_idle
SERVER311:~ #
和:
SERVER705:~ # cat /sys/devices/system/cpu/cpuidle/current_driver
intel_idle
SERVER705:~ #
两者都具有:
intel_idle.max_cstate=0 processor.max_cstate=0
在:“/boot/grub/menu.lst”中,重新启动。
问题:acpi_idle 和 intel_idle 之间有什么区别?
答案1
简答:两者都是 CPU 空闲驱动程序的不同实现。 acpi_idle 是默认驱动程序,支持所有 CPU 架构,而 intel_idle 是 Intel CPU 特定的。
更多细节:CPU 空闲驱动程序的 API 定义在 include/linux/cpuidle.h 中。它定义了“CPU 空闲电源管理的通用框架”。 acpi_idle 驱动程序(在 drivers/acpi/processor_idle.c 中定义)为所有 CPU 架构实现此行为。 intel_idle(在 drivers/idle/intel_idle.c 中定义)是专为现代 Intel CPU 设计的空闲驱动程序(来自 intel_idle.c 标头中的注释):
/* * intel_idle.c - 现代英特尔处理器的本机硬件空闲循环 * ...
/* * intel_idle 是一个 cpuidle 驱动程序,可在特定 Intel 处理器上加载 * 代替旧版 ACPI process_idle 驱动程序。其目的是 * 使 Linux 在这些处理器上更加高效,因为 intel_idle * 比 ACPI 了解更多,并且使 Linux 更能免受 ACPI BIOS 错误的影响。 */
因此,对于现代 Intel CPU,您应该使用 intel_idle 驱动程序,因为它是专门为提高 Intel CPU 的效率而设计的。
那么为什么有些设置会加载 intel_idle 而有些设置会加载 acpi_idle 呢?这是介绍 intel_idle 驱动程序的提交消息中所述的内容:
提交2671717265ae6e720a9ba5f13fbec3a718983b65
作者:Len Brown 日期:2010 年 3 月 8 日星期一 14:07:30 -0500
intel_idle:最新英特尔处理器的本机硬件 cpuidle 驱动程序
此实验驱动程序取代 Intel Atom 处理器、Intel Core i3/i5/i7 处理器和相关 Intel Xeon 处理器上的 acpi_idle。
它不支持 Intel Core2 或更早版本的处理器。
对于配置了 ACPI 的内核,CONFIG_INTEL_IDLE=y 允许 intel_idle 在 ACPI 处理器驱动程序之前进行探测。使用“intel_idle.max_cstate=0”启动会禁用 intel_idle,系统将退回到 ACPI 的“acpi_idle”。
典型的 Linux 发行版会提前加载 ACPI 处理器模块,这使得 CONFIG_INTEL_IDLE=m 在 ACPI 平台上不太有用。
intel_idle 在 module_init 时探测所有处理器。稍后热添加的处理器将被限制在空闲状态下使用 C1。
签署人: Len Brown
所以原因是:
- 系统上的非 Intel CPU 或较旧的 Intel 架构。
- .config 中未标记 CONFIG_INTEL_IDLE=y
- 在 cmdline 中使用 intel_idle.max_cstate=0 启动
既然你说你在两个设置上都设置了 #3,那么问题是为什么其中一个设置加载了 intel_idle。尝试“cat /proc/cmdline”并确保该选项确实已设置。另外,使用“lscpu”或“cat /proc/cpuinfo”检查架构之间的差异
答案2
另一个答案很好地总结了差异,intel_idle 与 acpi_idle。
提供有关如何启用每个驱动程序的附加信息。这假设内核是使用 CONFIG_INTEL_IDLE=y 构建的。
- 英特尔空闲:在平台 BIOS 上启用 C-States,并且不使用任何内核引导参数,然后检查是否
/sys/devices/system/cpu/cpuidle/current_driver
显示intel_idle
。 - acpi_空闲:在平台 BIOS 上启用 C-States,使用 intel_idle.max_cstate=0 内核启动参数,检查 current_driver 是否为
acpi_idle
。 - 完全禁用 C 状态:在平台 BIOS 上禁用 C-States,包括 intel_idle.max_cstate=0 内核启动参数,检查 current_driver 是否为
none
。