Alibaba Cloud Linux 2在内核版本4.19.91-22.al7中为cgroup v1接口提供了CPU Burst功能。CPU Burst功能允许容器被CPU限流时,突发使用CPU资源,进而提升容器性能、降低系统的延迟指标。本文介绍如何在cgroup v1接口开启CPU Burst功能,以及如何查询CPU Burst的统计数据。

背景信息

在容器服务中,容器允许使用的CPU资源被内核的CFS Bandwidth Controller(带宽控制器)限流。当您在cgroup v1接口开启CPU Burst功能后,CPU Burst功能允许容器突发使用限流之外的CPU资源。该功能既可以保证容器运行的服务质量,又不降低容器部署密度。
说明 突发是指允许容器超过CPU限流使用额外的CPU资源。

关于CPU Burst的详细信息,您可以通过Alibaba Cloud Linux 2内核文档进行了解。Alibaba Cloud Linux 2内核文档存储在Debuginfo包和源码包内,路径为Documentation/scheduler/sched-bwc.rst。下载Debuginfo包和源码包的具体操作,请参见使用Alibaba Cloud Linux 2

功能原理

CPU Burst功能允许突发使用的CPU资源依赖于日常的资源积累。比如,容器在日常运行中使用的CPU资源未超过CPU限流,则空余的CPU资源将会被积累。后续当容器运行需要大量CPU资源时,将通过CPU Burst功能突发使用CPU资源,这部分突发使用的资源来源于已积累的资源。以休假体系作为类比:

假如您每年休假时间为4天(CPU限流),未休的假期可以存放起来后续使用,但存放上限为4天(CPU Burst)。当您第一年、第二年各只休了1天的假期,那么没有休息的6天假期可以存放起来。当第三年的时候,理论上您可以休息共计10天的假期,但因为有存放上限(CPU Burst),则实际可以休息至多8天的假期。

开启CPU Burst功能

  1. 检查cgroup v1接口中的CPU Burst功能的全局开关是否已打开。
    cat /proc/sys/kernel/sched_cfs_bw_burst_enabled
    返回结果说明:
    • 如果返回结果为1,则表示CPU Burst功能的全局开关已打开。
      说明 默认情况下,cgroup v1接口中的CPU Burst功能的全局开关为打开状态。
    • 如果返回结果不为1,则表示CPU Burst功能的全局开关已关闭。您可以运行以下命令打开全局开关:
      echo 1 > /proc/sys/kernel/sched_cfs_bw_burst_enabled
  2. 在具体的子cgroup中开启CPU Burst功能。
    默认情况下,cgroup v1接口中的CPU Burst功能在各个子cgroup中均未开启。具体的开启方式如下:
    1. 进入子cgroup路径下,检查CFS Bandwidth Controller限流是否处于生效状态。
      cd /sys/fs/cgroup/cpu/子cgroup目录名称/
      cat cpu.cfs_period_us
      cat cpu.cfs_quota_us
      如果cpu.cfs_quota_us对应的返回结果为正整数,则表示CFS Bandwidth Controller限流处于生效状态,进而在启用CPU Burst功能后,容器才可以获得超出CPU限流的CPU资源。
    2. 检查当前默认的CPU Burst设置。
      cat cpu.cfs_burst_us
      返回结果的默认值为0,表示CPU Burst功能未开启。
    3. 设置cpu.cfs_burst_us的值以开启CPU Burst功能。
      您可以设置一个适用的正整数启用CPU Burst功能,且这个正整数表示子cgroup突发额外使用的CPU资源的上限。本文通过以下示例场景,介绍如何开启CPU Burst功能。
      1. 配置CFS Bandwidth Controller带宽控制器默认的cpu.cfs_quota_uscpu.cfs_period_us
        以下配置,将CPU资源的使用周期(cpu.cfs_period_us)设置为100ms,每个周期中的CPU限流(cpu.cfs_quota_us)设置为400ms,则子cgroup将会持续获得4个CPU资源(cpu.cfs_quota_us/cpu.cfs_period_us)。
        echo 400000 > cpu.cfs_quota_us
        echo 100000 > cpu.cfs_period_us
      2. 配置cpu.cfs_burst_us以开启CPU Burst功能。
        以下配置,将CPU Burst的值设置为600ms,表示开启了CPU Burst功能,且允许子cgroup可以突发额外使用最多6个CPU资源(cpu.cfs_burst_us/cpu.cfs_period_us)。
        echo 600000 > cpu.cfs_burst_us

查询CPU Burst的统计数据

  1. 进入待查询数据的子cgroup路径下。
    cd /sys/fs/cgroup/cpu/子cgroup目录名称/
  2. 查看统计数据。
    cat cpu.stat
    返回结果中,主要的信息说明如下:
    • nr_burst数据:当前子cgroup触发CPU Burst的次数。
    • burst_time数据:当前子cgroup突发使用CPU资源的时间。