发布于: Jul 29, 2022

 

现代的 CPU,功耗管理比性能峰值更重要。CPU 从单一内核发展到多个物理内核,获得了新的特性:超线程;可以最大限度地提高性能

 

如何提高 CPU 性能是许多工程师追求的目标,以往,大多数计算机都是为最佳性能而设计的,它们的 CPU 频率是固定的。而现代的 CPU,功耗管理比性能峰值更重要。CPU 从单一内核发展到多个物理内核,并获得了新的特性:超线程(Hyper-threading);Turbo Boost 可以最大限度地提高性能;还可以暂时完全关闭 CPU 内核(CPU 停机,频率为 0),以降低功耗。内核的频率可以根据工作负载、温度等因素定期变化。为了更有效的进行针对 CPU 进行管理,就出现了 ACPI(高级配置与电源接口)标准。这是在 1997 年由英特尔、微软、东芝共同提出、制定的操作系统电源管理、硬件配置接口。到了 2011 年推出 ACPI 5.0 规格,就包括了我们将要提到的 C-State 与 P-State。

  • C-State – 处理器电源状态
    处理器电源状态(C0,C1,C2,C3……Cn 状态)是指在 C0 状态下的处理器电能消耗和温度管理的状态。只有 C0 状态下 CPU 才会执行指令,C1 到 Cn 状态下 CPU 都处于各种不同程度的睡眠状态(Sleeping States),在这睡眠状态下,CPU 都有一个恢复到 C0 的唤醒时间(latency),它是和 CPU 的电能消耗有关的,通常,用电能量越小意味着得花更长的时间恢复到 C0 状态,也就是唤醒时间越长。
  • P-State – 设备和处理器性能状态
    设备和处理器性能状态(Px 状态)是在 C0(对于处理器)和 D0(对于设备)下定义的电源消耗和能力的状态。性能状态允许 OSPM 在性能和能源消耗之间获取平衡。P0 是最高性能状态,从 P1 到 Pn 是连续的低性能状态,最高限制 n 为 16。

改变 C-State 或 P-State 设置可以增加处理器性能的一致性,减少延迟,还可以针对特定工作负载对实例进行调校。默认 C-State 和 P-State 设置可提供最大性能,是大多数工作负载的最佳选择。但是,如果应用程序更适合以牺牲较高的单核或双核频率的方式来降低延迟,或需要在较低频率下保持稳定性能(而不适合使用突发式睿频加速频率),那么可以考虑运用对这些实例可用的 C 状态或 P 状态设置。

 

C-State 控制当核心处于非活动状态时可能进入的睡眠级别。可以通过控制 C-State 来调校系统的延迟与性能。将核心置于睡眠状态需要时间,尽管睡眠中的核心可为其他核心提供更多空间以加速至更高频率,但该睡眠中的核心也需要时间来重新唤醒并执行工作。例如,如果某个负责处理网络数据包中断的核心处于睡眠状态,那么在处理此类中断时可能会出现延迟。我们可以将系统配置为不使用深层 C-State,这可以降低处理器的反应延迟,但反过来也会减少其他核心达到睿频加速频率可用的空间。

针对 P3 实例而言,我们需要禁用深层睡眠状态来确保最快的响应。具体的做法是将 C-State 设置为 C1。所谓的 C1,拥有最短的唤醒时间,这个延时必须短到操作系统软件使用 CPU 的时候不会考虑到唤醒时间方面的因素。

具体实现可以通过以下脚本 –

#!/bin/bash

Hypervisor=$(lscpu | grep Hypervisor | cut -d ' ' -f5)
if [ $Hypervisor = "Xen" ]; then
  sudo cp /etc/default/grub /etc/default/grub.original
  sudo sed -i 's|GRUB_CMDLINE_LINUX=""|GRUB_CMDLINE_LINUX="clocksource=tsc tsc=reliable xen_nopvspin=1 intel_idle.max_cstate=1"|g' /etc/default/grub
  sudo update-grub
  echo "Reboot system and enable changes."else
  echo "Your Hypervisor is not Xen."
fi
echo "Done."

在这个脚本中,通过修改 /etc/default/grub 文件,加入 clocksource=tsc tsc=reliable xen_nopvspin=1 intel_idle.max_cstate=1 这几个 Grub 启动参数来实现

  • 修改时钟源为 tsc
  • CPU 的 C-State 设置为 C1

需要注意的是,修改完成以后需要重新启动设置才能生效。Amazon Web Services 官方的文档也有对此的介绍,可以参考“您的 EC2 实例的处理器状态控制”。

 

相关文章