LINUX CGROUP总结

简介:

    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

  1. 限制资源使用,好比内存使用上限以及文件系统的缓存限制。
  2. 优先级控制,CPU利用和磁盘IO吞吐。
  3. 一些审计或一些统计,主要目的是为了计费。
  4. 挂起进程,恢复执行进程。


cgroups子系统


  1. cpu 子系统,主要限制进程的 cpu 使用率。
  2. cpuacct 子系统,能够统计 cgroups 中的进程的 cpu 使用报告。
  3. cpuset 子系统,能够为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
  4. memory 子系统,能够限制进程的 memory 使用量。
  5. blkio 子系统,能够限制进程的块设备 io。
  6. devices 子系统,能够控制进程可以访问某些设备。
  7. net_cls 子系统,能够标记 cgroups 中进程的网络数据包,而后可使用 tc 模块(traffic control)对数据包进行控制。
  8. net_prio — 这个子系统用来设计网络流量的优先级
  9. freezer 子系统,能够挂起或者恢复 cgroups 中的进程。
  10. ns 子系统,可使不一样 cgroups 下面的进程使用不一样的 namespace
  11. hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。


cgroups 层级结构(Hierarchy)

       内核使用 cgroup 结构体来表示一个 control group 对某一个或者某几个 cgroups 子系统的资源限制。cgroup 结构体能够组织成一颗树的形式,每一棵cgroup 结构体组成的树称之为一个 cgroups 层级结构。缓存

      cgroups层级结构能够 attach 一个或者几个 cgroups 子系统,当前层级结构能够对其 attach 的 cgroups 子系统进行资源的限制。每个 cgroups 子系统只能被 attach 到一个 cpu 层级结构中。网络

好好理解下这个图便可:数据结构


cgroups层级结构示意图


      建立了 cgroups 层级结构中的节点(cgroup 结构体)以后,能够把进程加入到某一个节点的控制任务列表中,一个节点的控制列表中的全部进程都会受到当前节点的资源限制。同时某一个进程也能够被加入到不一样的 cgroups 层级结构的节点中,由于不一样的 cgroups 层级结构能够负责不一样的系统资源。因此说进程和 cgroup 结构体是一个多对多的关系。测试

cgroups层级结构示意图


      上面这个图从总体结构上描述了进程与 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/
   1559033413(1)


写个死循环测试程序增长cpu使用率

 1 int main(void)
 2 {
 3     int i = 0;
 4     for(;;) i++;
 5     return 0;
 6 }

启动程序后cpu使用100%

image

默认-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

image


其它资源限制和cpu基本一致就先写这么多了

相关文章
相关标签/搜索