CGroup 介绍
Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。这个项目最早是由Google的工程师在2006年发起(主要是Paul Menage和Rohit Seth),最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词太过广泛,为避免混乱,被重命名为cgroup,并且被合并到2.6.24版的内核中去
概念及原理
cgroups子系统
cgroups为每种可以控制的资源定义了一个子系统。典型的子系统介绍如下:
- cpu 子系统,主要限制进程的 cpu 使用率
- cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告
- cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点
- memory 子系统,可以限制进程的 memory 使用量
- blkio 子系统,可以限制进程的块设备 io
- devices 子系统,可以控制进程能够访问某些设备
- net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制
- freezer 子系统,可以挂起或者恢复 cgroups 中的进程
- ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace
使用方法
查看系统已有cgroup列表两种方法
1 | [root@localhost cgroup]# mount -t cgroup |
查看系统开启了哪些cgroup
1 | [root@localhost cgroup]# cat /proc/cgroups |
手动mount memory cgroup
1 | [root@localhost cgroup]# mkdir cgroup-demo |
手动 mount cpu cgroup 报错,cpu already mounted or mount point busy. 解决办法
1 | [root@localhost cgroup]# mkdir ./cgroup-demo/cpu |
关于以上这个报错,google半天没找到眉头思路,最终在 米开朗基杨 大佬的指导下得知Centos8系统cpu,cpuacct要合并一起使用,应该是新的系统systemd把两个合并了
1 | [root@localhost cgroup]# cat /etc/systemd/system.conf |grep cpu |
把当前bash进程ID加入到cgroup memory限制当中,限制100m内存
1 | [root@localhost memory]# mkdir ./cgroup-demo/memory/demo-test/ |
把进程ID加入到cgroup cpu限制 20% 的使用率
1 | [root@localhost cgroup]# mkdir ./cgroup-demo/cpu/demo-cpu |
查看进程ID都有哪些cgroup
1 | [root@localhost ~]# cat /proc/2504/cgroup |
go语言简单实现,github代码下载
1 | package main |