【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 <PID> /sys/fs/cgroup/cpu/my_group/cgroup.procs

<PID>是想要控制的进程的进程ID

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

echo <PID1> | sudo tee -a /sys/fs/cgroup/cpu/my_cgroup/cgroup.procs
echo <PID2> | sudo tee -a /sys/fs/cgroup/cpu/my_cgroup/cgroup.procs

其中 <PID1>, <PID2>, ... 是你想要控制的进程的进程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子系统

cgroupcpu子系统用于控制和监控进程组的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资源使用进行细粒度的控制和监控。

posted @ 2024-11-01 13:54  Emma1111  阅读(165)  评论(0编辑  收藏  举报