【Linux内核】Cgroup原理和使用

    1.Cgroup简介

    cgroups(Control Groups)是Linux内核的一个特性,用于对进程组的物理资源(如CPU、内存、磁盘I/O等)进行细粒度的控制和监控。cgroups可以帮助你限制、记录和隔离资源使用,但它本身并不直接用来“拉高CPU负载”。相反,cgroups通常用于限制进程可以使用的资源量,以防止它们消耗过多资源而影响系统上的其他进程。

    如果用户想要某个进程或进程组能够获得更多的CPU时间,以通过调整cgroups的CPU配额来实现。以下操作需要以root权限来操作,具体配置步骤如下:

    1.创建Cgroup

    首先创建一个新的cgroup,通常在/sys/fs/cgroup/cpu目录下:

    sudo mkdir /sys/fs/cgroup/cpu/my_cgroup

    2.加入进程

    2.1 将一个进程加入到这个cgroup中

    sudo echo /sys/fs/cgroup/cpu/my_group/cgroup.procs

    是想要控制的进程的进程ID

    2.2 将多个进程添加到这个cgroup的cgroup.procs文件中

    echo | sudo tee -a /sys/fs/cgroup/cpu/my_cgroup/cgroup.procs

    echo | sudo tee -a /sys/fs/cgroup/cpu/my_cgroup/cgroup.procs

    其中 , , ... 是你想要控制的进程的进程ID。使用 tee -a命令可以追加内容到文件中,而不会覆盖现有内容。

    3.调整CPU配额

    可以通过cpu.shares文件来调整cgroup的CPU份额。这个值表示cgroup中的进程相对于系统中其他进程的相对权重

    echo 1024 > /sys/fs/cgroup/cpu/my_cgroup/cpu.shares

    1024是一个权重值,可以根据需要调整它

    4.设置CPU配额和周期

    如果想要更精细的控制,可以使用cpu.cfs_quota_us和cpu.cfs_period_us来设置CPU配额和周期

    echo 50000 > /sys/fs/cgroup/cpu/my_cgroup/cpu.cfs_quota_us

    echo 100000 > /sys/fs/cgroup/cpu/my_cgroup/cpu.cfs_period_us

    这里的cpu.cfs_quota_us是配额,cpu.cfs_period_us是周期。这个设置表示在每个周期(100000微妙)内,cgroup中的进程最多可以使用50000微妙的CPU时间。

    如果需要测试系统的CPU负载能力,也可以考虑使用Stress或stress-ng这样的工具来生成负载,来帮助测试系统在高负载下的表现。

    2.Cgroup的CPU子系统

    cgroup的 cpu子系统用于控制和监控进程组的CPU资源使用情况。在 /sys/fs/cgroup/cpu/路径下,可以找到一系列的文件和子目录,它们用于配置和查看cgroup的CPU相关属性。以下是一些常见的属性及其说明:

    本地Ubuntu下cgroup的属性:

    user@/sys/fs/cgroup/cpu$ ls

    cgroup.clone_children cpuacct.usage_percpu_sys cpu.stat

    cgroup.procs cpuacct.usage_percpu_user docker

    cgroup.sane_behavior cpuacct.usage_sys notify_on_release

    cpuacct.stat cpuacct.usage_user release_agent

    cpuacct.usage cpu.cfs_period_us system.slice

    cpuacct.usage_all cpu.cfs_quota_us tasks

    cpuacct.usage_percpu cpu.shares user.slice

    1.cgroup.procs

    这个文件包含了属于该cgroup的所有进程的PID列表。你可以将进程添加到这个文件中,以将其加入到对应的cgroup。

    2.cpu.shares

    这个文件定义了cgroup中进程的相对CPU时间份额。数值越高,进程获得的CPU时间越多。默认情况下,所有cgroup的 cpu.shares值都是1024。

    3.cpu.cfs_period_us

    这个文件定义了CPU时间配额的周期,单位是微秒(us)。它与 cpu.cfs_quota_us配合使用,定义了进程的CPU使用率限制。

    4.cpu.cfs_quota_us

    这个文件定义了cgroup中所有进程的CPU时间配额,单位是微秒(us)。如果设置了这个值,那么在 cpu.cfs_period_us定义的周期内,cgroup中的进程只能使用这么多的CPU时间。

    5.cpu.stat

    这个文件提供了cgroup中进程的CPU使用统计信息,包括CPU时间、运行次数、阻塞次数等。

    6.cpuacct.usage

    这个文件显示了cgroup中所有进程使用的总CPU时间,单位是纳秒(ns)。

    7.cpuacct.usage_percpu

    这个文件显示了每个CPU上cgroup中所有进程使用的CPU时间,单位是纳秒(ns)。

    8.notify_on_release

    这个文件用于控制当cgroup中的最后一个进程退出时是否发送通知。

    9.cgroup.clone_children

    控制当一个进程fork或clone时,其子进程是否自动加入到同一个cgroup。

    10.cgroup.sane_behavior

    控制cgroup的行为是否为“sane”模式,即是否对旧的cgroup版本提供向后兼容性

    11.cpuacct.usage_all

    显示cgroup中所有进程使用的总CPU时间,包括用户态、内核态以及被阻塞的时间。

    12.cpuacct.usage_percpu_sys

    显示每个CPU上cgroup中所有进程使用的内核态CPU时间,单位是纳秒(ns)。

    13.cpuacct.usage_percpu_user

    显示每个CPU上cgroup中所有进程使用的用户态CPU时间,单位是纳秒(ns)。

    14.cpuacct.usage_user

    显示cgroup中所有进程使用的内核态CPU时间,单位是纳秒(ns)。

    15.release_agent

    指定一个脚本或程序,当cgroup中的最后一个进程退出时,该脚本或程序将被执行。

    16.task

    与 cgroup.procs类似,包含当前cgroup中所有进程的PID列表。

    这些文件和目录提供了cgroup的配置和监控功能,允许管理员对进程组的CPU资源使用进行细粒度的控制和监控。