34.3. 改善网络延迟
CPU 电源管理功能可能会在时间敏感的应用程序中导致不必要的延迟。您可以禁用一些或所有这些电源管理功能,以改善网络延迟。
例如,如果延迟在服务器空闲时比负载过重时高,则 CPU 电源管理设置可能会影响延迟。
禁用 CPU 电源管理功能可能会导致更高的功耗和热损失。
34.3.1. CPU 电源状态如何影响网络延迟
CPU 的消耗状态(C-states)优化并减少计算机的功耗。C-states 从 C0 开始编号。在 C0 中,处理器完全加电并执行。在 C1 中,处理器完全加电,但没有执行。C-state 的值越大,CPU 关闭的组件越多。
每当 CPU 核空闲时,内置节能逻辑步骤就会介入,并尝试通过关闭各种处理器组件将核从当前 C-state 移到更高状态。如果 CPU 核必须处理数据,则 Red Hat Enterprise Linux (RHEL)会将一个中断发送给处理器,以唤醒核并将其 C-state 设置回 C0。
从深度 C-states 移回 C0 需要一些时间,因为需要给处理器的不同组件通电。在多核系统上,也可能发生许多核同时空闲,因此处于更深的 C-states 。如果 RHEL 尝试同时唤醒它们,则内核可以会产生大量进程间中断(IPI),同时所有核都从深度 C-states 返回。由于处理中断时需要锁定它,所以系统在处理所有中断过程中可能会停滞一段时间。这可能会导致应用程序在响应事件方面有大量延迟。
例 34.2. 显示每个内核处于 C-state 的次数
PowerTOP 应用程序中的 Idle Stats
页面显示 CPU 核在每个 C-state 花费的时间:
Pkg(HW) | Core(HW) | CPU(OS) 0 CPU(OS) 4 | | C0 active 2.5% 2.2% | | POLL 0.0% 0.0 ms 0.0% 0.1 ms | | C1 0.1% 0.2 ms 0.0% 0.1 ms C2 (pc2) 63.7% | | C3 (pc3) 0.0% | C3 (cc3) 0.1% | C3 0.1% 0.1 ms 0.1% 0.1 ms C6 (pc6) 0.0% | C6 (cc6) 8.3% | C6 5.2% 0.6 ms 6.0% 0.6 ms C7 (pc7) 0.0% | C7 (cc7) 76.6% | C7s 0.0% 0.0 ms 0.0% 0.0 ms C8 (pc8) 0.0% | | C8 6.3% 0.9 ms 5.8% 0.8 ms C9 (pc9) 0.0% | | C9 0.4% 3.7 ms 2.2% 2.2 ms C10 (pc10) 0.0% | | | | C10 80.8% 3.7 ms 79.4% 4.4 ms | | C1E 0.1% 0.1 ms 0.1% 0.1 ms ...
其他资源
34.3.2. EFI 固件中的 C-state 设置
在大多数带有 EFI 固件的系统中,您可以启用和禁用单个消耗状态(C-states)。但是,在 Red Hat Enterprise Linux (RHEL)上,空闲驱动程序决定内核是否使用固件中的设置:
-
intel_idle
:这是具有 Intel CPU 的主机上的默认驱动程序,并忽略 EFI 固件中的 C-state 设置。 -
acpi_idle
:如果intel_idle
被禁用了,RHEL 在具有来自 Intel 以外的厂商的 CPU 的主机上使用此驱动程序。默认情况下,acpi_idle
驱动程序使用 EFI 固件中的 C-state 设置。
其他资源
-
kernel-doc
软件包提供的/usr/share/doc/kernel-doc-<version>/Documentation/admin-guide/pm/cpuidle.rst
34.3.3. 使用自定义 TuneD 配置文件禁用 C-states
TuneD 服务使用内核的电源管理服务质量(PMQOS
)接口来设置消耗状态(C-states)锁定。内核空闲驱动程序可以与此接口进行通信,以动态限制 C-states。这可防止管理员必须使用内核命令行参数来硬编码一个最大 C-state 值。
先决条件
-
tuned
软件包已安装。 -
tuned
服务已启用并运行。
流程
显示活跃的配置文件:
# tuned-adm active Current active profile: network-latency
为自定义 TuneD 配置文件创建一个目录:
# mkdir /etc/tuned/network-latency-custom/
使用以下内容创建
/etc/tuned/network-latency-custom/tuned.conf
文件:[main] include=network-latency [cpu] force_latency=cstate.id:1|2
此自定义配置文件从
network-latency
配置文件继承所有设置。force_latency
TuneD 参数指定以微秒(µs)为单位的延迟。如果 C-state 延迟大于指定的值,则 Red Hat Enterprise Linux 中的空闲驱动程序会阻止 CPU 移到更高的 C-state。使用force_latency=cstate.id:1|2
,TuneD 首先检查/sys/devices/system/cpu/cpu_<number>_/cpuidle/state_<cstate.id>_/
目录是否存在。在这种情况下,TuneD 从这个目录中的latency
文件中读取延迟值。如果该目录不存在,TuneD 使用 2 微秒作为回退值。激活
network-latency-custom
配置文件:# tuned-adm profile network-latency-custom
其他资源
34.3.4. 使用内核命令行选项禁用 C-states
processor.max_cstate
和 intel_idle.max_cstat
内核命令行参数配置 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
如果主机使用
intel_idle
驱动程序,请设置intel_idle.max_cstate
内核参数,以定义 CPU 核应该能够使用的最高 C-state:# grubby --update-kernel=ALL --args="intel_idle.max_cstate=0"
设置
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"
重要如果您除了设置
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
验证
显示最大 C-state :
# cat /sys/module/processor/parameters/max_cstate 1
如果主机使用
intel_idle
驱动程序,则显示最大 C-state :# cat /sys/module/intel_idle/parameters/max_cstate 0
其他资源
- 什么是 CPU "C-states" ,以及如何在需要时禁用它们?
-
kernel-doc
软件包提供的/usr/share/doc/kernel-doc-<version>/Documentation/admin-guide/pm/cpuidle.rst