3.4. 使用内核命令行选项禁用 C-states
processor.max_cstate 和 intel_idle.max_cstate 内核命令行参数配置 CPU 核可以使用的最大消耗状态(C-state) 。例如,将参数设置为 1 确保 CPU 永远不会请求 C1 以下的 C-state。
使用此方法测试主机上应用程序的延迟是否受到 C-states 的影响。要不硬编码一个特定状态,请考虑使用更动态的解决方案。请参阅 使用一个自定义 TuneD 配置文件禁用 C-states。
先决条件
-
tuned服务没有运行或配置为不更新 C-state 设置。
流程
显示系统使用的空闲驱动程序:
cat /sys/devices/system/cpu/cpuidle/current_driver intel_idle
# cat /sys/devices/system/cpu/cpuidle/current_driver intel_idleCopy to Clipboard Copied! Toggle word wrap Toggle overflow 有关驱动程序的详情,请查看
kernel-doc软件包提供的/usr/share/doc/kernel-doc-<version>/Documentation/admin-guide/pm/cpuidle.rst文件。如果主机使用
intel_idle驱动程序,请设置intel_idle.max_cstate内核参数,以定义 CPU 核应该能够使用的最高 C-state:grubby --update-kernel=ALL --args="intel_idle.max_cstate=0"
# grubby --update-kernel=ALL --args="intel_idle.max_cstate=0"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 设置
intel_idle.max_cstate=0禁用intel_idle驱动程序。因此,内核使用acpi_idle驱动程序,该驱动程序使用 EFI 固件中设置的 C-state 值。因此,还要设置processor.max_cstate来覆盖这些 C-state 设置。在独立于 CPU 厂商的每个主机上,设置 CPU 内核应该可以使用的最高 C-state:
grubby --update-kernel=ALL --args="processor.max_cstate=0"
# grubby --update-kernel=ALL --args="processor.max_cstate=0"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要如果您除了设置
intel_idle.max_cstate=0之外还设置了processor.max_cstate=0,acpi_idle驱动程序会覆盖processor.max_cstate的值,并将其设置为1。因此,使用processor.max_cstate=0 intel_idle.max_cstate=0,内核将使用的最高 C-state 为 C1,而不是 C0。重启主机以使更改生效:
reboot
# rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示最大 C-state :
cat /sys/module/processor/parameters/max_cstate 1
# cat /sys/module/processor/parameters/max_cstate 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果主机使用
intel_idle驱动程序,则显示最大 C-state :cat /sys/module/intel_idle/parameters/max_cstate 0
# cat /sys/module/intel_idle/parameters/max_cstate 0Copy to Clipboard Copied! Toggle word wrap Toggle overflow