调整C-state状态以降低vCPU的响应延迟

C-state用于控制CPU在不活动时可以进入的休眠级别,它从C0开始编号(CPU处于正常工作状态),一直到C6(最深的休眠级别,此时CPU进入低功耗状态)。当CPU进入较深的C-state时,其唤醒时延也会变大,在一些实时性要求较高的负载场景,会对性能产生影响。因此,当您对性能稳定性有一定的诉求时,建议您将C-state状态改成C1,以降低vCPU的响应延迟。

背景信息

当vCPU没有负载时,让vCPU处于较低的C-state状态可以减少Hypervisor对HLT、MWAIT等指令的模拟开销,同时也能降低vCPU的唤醒时延。但是当操作系统让vCPU进入更深的C-state时,将vCPU重新唤醒(比如网卡上有新的中断)并执行指令需要一定的时间,这个唤醒时间开销由CPU芯片架构决定。您可以配置操作系统禁用更深的C-state状态,以降低vCPU的响应延迟。

操作步骤

本文以ecs.g8i.large、Alibaba Cloud Linux 3系统为例介绍如何禁用vCPU深度休眠,不同实例规格、不同镜像回显有所不同,以实际为准。

  1. 远程连接ECS实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 查看当前系统使用的CPUidle driver以及支持的C-states。

    说明

    如果执行以下命令没有显示相应的CPUidle driver,您可能需要更新镜像。

    cpupower idle-info

    返回信息如下图所示,Number of idle states表示支持的C-states数量,Available idle states表示支持的具体C-states状态。

    image

  3. 修改/etc/default/grub文件中C-states相关参数。

    1. 打开/etc/default/grub文件。

      sudo vim /etc/default/grub
    2. i键进入编辑模式。

    3. 找到GRUB_CMDLINE_LINUX=行,在参数末尾添加intel_idle.max_cstate=1和processor.max_cstate=1选项,将空闲vCPU的最大C-state限制为C1。

      image

    4. Esc键,输入:wq,按Enter键关闭并保存配置文件。

    5. 重新生成GRUB配置文件。

      sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  4. 重置实例,使配置生效。

    sudo reboot
  5. 查看当前系统使用的CPUidle driver以及支持的C-states。

    cpupower idle-info

    返回信息如下图所示,说明系统仅支持2种C-states状态(POLL、C1)。

    image