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 花费的时间:
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 设置。
34.3.3. 使用自定义 TuneD 配置文件禁用 C-states 复制链接链接已复制到粘贴板!
TuneD 服务使用内核的电源管理服务质量(PMQOS)接口来设置消耗状态(C-states)锁定。内核空闲驱动程序可以与此接口进行通信,以动态限制 C-states。这可防止管理员必须使用内核命令行参数来硬编码一个最大 C-state 值。
先决条件
-
tuned软件包已安装。 -
tuned服务已启用并运行。
流程
显示活跃的配置文件:
tuned-adm active
# tuned-adm active Current active profile: network-latencyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为自定义 TuneD 配置文件创建一个目录:
mkdir /etc/tuned/network-latency-custom/
# mkdir /etc/tuned/network-latency-custom/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下内容创建
/etc/tuned/network-latency-custom/tuned.conf文件:[main] include=network-latency [cpu] force_latency=cstate.id:1|2
[main] include=network-latency [cpu] force_latency=cstate.id:1|2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此自定义配置文件从
network-latency配置文件继承所有设置。force_latencyTuneD 参数指定以微秒(µ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
# tuned-adm profile network-latency-customCopy to Clipboard Copied! Toggle word wrap Toggle overflow
34.3.4. 使用内核命令行选项禁用 C-states 复制链接链接已复制到粘贴板!
processor.max_cstate 和 intel_idle.max_cstate 内核命令行参数配置可以使用的最大消耗状态(C-state) CPU 内核。例如,将参数设置为 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 如果主机使用
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