搜索

34.3. 改善网络延迟

download PDF

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 服务已启用并运行。

流程

  1. 显示活跃的配置文件:

    # tuned-adm active
    Current active profile: network-latency
  2. 为自定义 TuneD 配置文件创建一个目录:

    # mkdir /etc/tuned/network-latency-custom/
  3. 使用以下内容创建 /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 微秒作为回退值。

  4. 激活 network-latency-custom 配置文件:

    # tuned-adm profile network-latency-custom

34.3.4. 使用内核命令行选项禁用 C-states

processor.max_cstateintel_idle.max_cstat 内核命令行参数配置 CPU 核可使用的最大消耗状态(C-state)。例如,将参数设置为 1 确保 CPU 永远不会请求 C1 以下的 C-state。

使用此方法测试主机上应用程序的延迟是否受到 C-states 的影响。要不硬编码一个特定状态,请考虑使用更动态的解决方案。请参阅 使用一个自定义 TuneD 配置文件禁用 C-states

先决条件

  • tuned 服务没有运行或配置为不更新 C-state 设置。

流程

  1. 显示系统使用的空闲驱动程序:

    # cat /sys/devices/system/cpu/cpuidle/current_driver
    intel_idle
  2. 如果主机使用 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 设置。

  3. 在独立于 CPU 厂商的每个主机上,设置 CPU 内核应该可以使用的最高 C-state:

    # grubby --update-kernel=ALL --args="processor.max_cstate=0"
    重要

    如果您除了设置 intel_idle.max_cstate=0 之外还设置了 processor.max_cstate=0acpi_idle 驱动程序会覆盖 processor.max_cstate 的值,并将其设置为 1。因此,使用 processor.max_cstate=0 intel_idle.max_cstate=0,内核将使用的最高 C-state 为 C1,而不是 C0。

  4. 重启主机以使更改生效:

    # reboot

验证

  1. 显示最大 C-state :

    # cat /sys/module/processor/parameters/max_cstate
    1
  2. 如果主机使用 intel_idle 驱动程序,则显示最大 C-state :

    # cat /sys/module/intel_idle/parameters/max_cstate
    0

其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.