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