linux control groups(cgroups)

cgroup配置目录

1
2
3
4
5
6
7
struct task_struct
{
#ifdef CONFIG_CGROUPS
struct css_set __rcu *cgroups;
struct list_head cg_list;
#endif
}
1
2
3
4
5
6
7
8
struct css_set {
/*
* Set of subsystem states, one for each subsystem. This array is
* immutable after creation apart from the init_css_set during
* subsystem registration (at boot time).
*/
struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
};

cgroups 实现了对资源的配额和度量

目录 用处
blkio 这个子系统设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及 USB 等等。
CPU 这个子系统使用调度程序为 cgroup 任务提供 CPU 的访问。
cpuacct 产生 cgroup 任务的 CPU 资源报告
cpuset 如果是多核心的 CPU,这个子系统会为 cgroup 任务分配单独的 CPU 和内存。
devices 允许或拒绝 cgroup 任务对设备的访问。
这个子系统设定 cgroup 中任务使用的内存限制,并自动生成内存资源使用报告。 【设置太小,小心程序oom】

参考文章

参考csdn文章

cpu子系统

名字 描述
cpu.shares 可以让出获得cpu使用时间的相对值
cpu.cfs_period_us cfs_period_us用来配置 时间周期长度,单位为us(微秒)
cpu.stat Cgrou 内的进程使用的CPU时间统计
nr_periods 经过cpu.cfs_period_us的时间周期数量
nr_throttled 在经过周期内,有多少次因为进程在指定的时间周期内用光了配额时间而受到限制
throttled_time cgroup中的进程被限制使用CPU的总用时,单位是ns

使用cpu子系统示例

测试代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package main

func main() {
 //两个协程空轮询
 go func() {
  for {
  }
 }()
 for {

 }

}

结果演示

image-20220318204307958

image-20220318204345384

image-20220318204644353

cpuacct 子系统

用于统计Cgroup及其子 Cgroup下进程的CPU使用情况

  • cpuacct.usage
    • 包含该Cgroup及其子Cgroup下进程使用CPU的时间,单位 是 ns(纳秒)
  • cpuacct.stat
    • 包含该Cgroup及其子Cgroup下进程使用的CPU时间,以及用户态和内核态的时间

memory 子系统

目录 用处
memory.usage_in_bytes cgroup下进程使用的内存,包含cgroup及其子cgroup下的进程使用的内存
memory.max_usage_in_bytes cgroup下进程使用内存的最大值,包含子cgroup的内存使用量
memory.limit_in_bytes 设置进程最多能使用的内存,-1 表示不作限制
memory.soft_limit_in_bytes 不会阻止进程使用超过限额的内存,只是在系统内存足够时候会优先回收超过限额的内存,使之向限定值靠拢
memory.oom_control 设置是否在Cgroup中使用 OOM (out of memory ) killer ,默认使用。当属于该cgroup的进程使用的内存超过最大的限定时候,会立刻被killer处理

soft_limit_in_bytes 的使用情况:

内存不够也可能将部分内存交换到硬盘上去,page cache本身也占用内存,这种情况,

memory子系统使用示例

• Memory 子系统练习 • 在 cgroup memory 子系统目录中创建目录结构 cd /sys/fs/cgroup/memory mkdir memorydemo cd memorydemo • 运行 malloc(在linux机器make build) • 查看内存使用情况 watch 'ps -aux|grep $程序名字|grep -v grep • 通过 cgroup 限制 memory • 把进程添加到cgroup进程配置组

echo ps -ef|grep $程序名字 |grep -v grep|awk '{print $2}' > cgroup.procs • 设置memory.limit_in_bytes echo 104960000 > memory.limit_in_bytes • 等待进程被 oom kill