cgroups概念详解

参考链接: https://zhuanlan.zhihu.com/p/388101355

什么是cgroups?

Cgroups是linux的一种内核机制,这种机制可以根据系统需求把系统任务和子任务按照资源等级划分或整合到不同的组内,从而为管理系统资源提供一个框架, 简单说 Cgroups就是限制,记录追踪应用程序使用物理资源的机制, 本质上说是内核附加在应用程序上面的一系列钩子,通过应用程序调用系统资源从而触发钩子,钩子追踪记录,限制程序使用系统资源

为什么要使用Cgroups?

Cgroups可以对cpu,内存等资源进行精细化控制,比如docker k8s的pod 都使用cgroups进行对容器的资源控制

cgroups的主要作用

为不同用户层面提供一个资源管理的统一化的接口,从单个任务的资源控制到操作系统层面的虚拟化 Cgroups提供了四大功能

  • 资源限制 : 对任务总额进行限制,比如内存超出 触发OOM机制
  • 优先级分配 : 通过分配的cpu时间片和磁盘io带宽,实际上就等同于控制了任务运行的优先级
  • 资源统计: Cgroup可以统计系统资源的使用量,比如cpu使用时长,内存使用量,等
  • 任务控制 : 可以对任务执行挂起,恢复等操作

Cgroups的概念以及原理

  • Task(任务) : 在linux系统中 , 内核本身的调度和管理并不对进程和线程进行区分,只是根据clone时传入的参数从概念上划分进行和线程, 这里使用task来表示系统的一个进程或者线程
  • Cgroups(控制组) : cgroups中的资源控制以cgroup为单位实现,cgroup表示按某种资源控制表中划分而成的任务组, 包含一个或多个子系统,一个任务可以加入某个cgroup,也可以从某个cgroup迁移到一个cgroup
  • subsystem(子系统) : 子系统可以到 /proc/cgrousp 文件下查看 就是一个资源调度控制器, 比如cpu子系统可以控制cpu的时间分配.内存子系统可以限制内存的使用量
    • blkio 对块设备的 IO 进行限制。
    • cpu 限制 CPU 时间片的分配,与 cpuacct 挂载在同一目录。
    • cpuacct 生成 cgroup 中的任务占用 CPU 资源的报告,与 cpu 挂载在同一目录。
    • cpuset 给 cgroup 中的任务分配独立的 CPU(多处理器系统) 和内存节点。
    • devices 允许或禁止 cgroup 中的任务访问设备。
    • freezer 暂停/恢复 cgroup 中的任务。
    • hugetlb 限制使用的内存页数量。
    • memory 对 cgroup 中的任务的可用内存进行限制,并自动生成资源占用报告。
    • net_cls 使用等级识别符(classid)标记网络数据包,这让 Linux 流量控制器(tc 指令)可以识别来自特定 cgroup 任务的数据包,并进行网络限制。
    • net_prio 允许基于 cgroup 设置网络流量(netowork traffic)的优先级。
    • perf_event 允许使用 perf 工具来监控 cgroup。
    • pids 限制任务的数量。
  • hierarchy(层级) : 层级有一系列cgroup以一个树状结构排列而成,每一个层级通过绑定对应的子系统进行资源控制,层级中的cgroup节点可以包含零个或者多个子节点 子节点继承父节点挂载的子系统,一个操作系统中可以有多个层级

测试以及测试后删除目录

利用Cgroup 限制进程cpu使用量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 mount -t cgroup  #查看cgroup挂在目录

# 创建test测试目录
cd /sys/fs/cgroup/cpu && mkdir test
cd test

echo 100000 > cpu.cfs_period_us # 设定周期时间,必须与cfs_quota_us配合使用
echo 20000 > cpu.cfs_quota_us # 限制cpu最高占用20%资源

#写一个死循环脚本
cat > test.sh << EOF
#!/bin/bash
i=1
while :
do
let i+=1
echo $i
done
EOF

bash test.sh # 运行脚本

top # 查看test.sh 的pid 并写入 test目录下的task文件, 让他监控这个进程

echo 1234 > /sys/fs/cgroup/cpu/test/tasks

#观察cpu占用率

#删除测试完的目录
yum install libcgroup
yum install libcgroup-tools

#验证是否安装成功
cgdelete -h

#删除
cgdelete cpu:/test/


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!