Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。这个项目最先是由Google的工程师在2006年发起(主要是Paul Menage和Rohit Seth),最先的名称为进程容器(process containers)。在2007年时,由于在Linux内核中,容器(container)这个名词太过普遍,为避免混乱,被重命名为cgroup,而且被合并到2.6.24版的内核中去。而后,其它开始了他的发展。 css
Linux CGroupCgroup 可让您为系统中所运行任务(进程)的用户定义组群分配资源 — 比如 CPU 时间、系统内存、网络带宽或者这些资源的组合。您可以监控您配置的 cgroup,拒绝 cgroup 访问某些资源,甚至在运行的系统中动态配置您的 cgroup。node
主要功能:centos
内核使用 cgroup 结构体来表示一个 control group 对某一个或者某几个 cgroups 子系统的资源限制。cgroup 结构体能够组织成一颗树的形式,每一棵cgroup 结构体组成的树称之为一个 cgroups 层级结构。缓存
cgroups层级结构能够 attach 一个或者几个 cgroups 子系统,当前层级结构能够对其 attach 的 cgroups 子系统进行资源的限制。每个 cgroups 子系统只能被 attach 到一个 cpu 层级结构中。网络
好好理解下这个图便可:数据结构
建立了 cgroups 层级结构中的节点(cgroup 结构体)以后,能够把进程加入到某一个节点的控制任务列表中,一个节点的控制列表中的全部进程都会受到当前节点的资源限制。同时某一个进程也能够被加入到不一样的 cgroups 层级结构的节点中,由于不一样的 cgroups 层级结构能够负责不一样的系统资源。因此说进程和 cgroup 结构体是一个多对多的关系。测试
上面这个图从总体结构上描述了进程与 cgroups 之间的关系。最下面的P表明一个进程。每个进程的描述符中有一个指针指向了一个辅助数据结构css_set(cgroups subsystem set)。 指向某一个css_set的进程会被加入到当前css_set的进程链表中。一个进程只能隶属于一个css_set,一个css_set能够包含多个进程,隶属于同一css_set的进程受到同一个css_set所关联的资源限制。ui
上图中的”M×N Linkage”说明的是css_set经过辅助数据结构能够与 cgroups 节点进行多对多的关联。可是 cgroups 的实现不容许css_set同时关联同一个cgroups层级结构下多个节点。 这是由于 cgroups 对同一种资源不容许有多个限制配置。centos7
一个css_set关联多个 cgroups 层级结构的节点时,代表须要对当前css_set下的进程进行多种资源的控制。而一个 cgroups 节点关联多个css_set时,代表多个css_set下的进程列表受到同一份资源的相同限制。spa
查看cgroup挂载点(centos7.5):
1 [root@k8s-master ~]# mount -t cgroup 2 cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd) 3 cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids) 4 cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset) 5 cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) 6 cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu) 7 cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio) 8 cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer) 9 cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb) 10 cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event) 11 cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) 12 cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
建立隔离组
[root@k8s-master ~]# cd /sys/fs/cgroup/cpu
[root@k8s-master cpu]# mkdir cpu_test
目录建立完成会自动生成如下文件
[root@k8s-master cpu]# ls cpu_test/
写个死循环测试程序增长cpu使用率
1 int main(void) 2 { 3 int i = 0; 4 for(;;) i++; 5 return 0; 6 }
启动程序后cpu使用100%
默认-1不限制,如今改为20000,能够理解使用率限制在20%
[root@k8s-master cpu]# echo 20000 > /sys/fs/cgroup/cpu/cpu_test/cpu.cfs_quota_us
找到进程号增长到cpu tasks里面,在看top cpu使用率很快就下来
[root@k8s-master ~]# echo 23732 >> /sys/fs/cgroup/cpu/cpu_test/tasks
其它资源限制和cpu基本一致就先写这么多了