LINUX CGROUP总结
简介:??? Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。这个项目最早是由Google的工程师在2006年发起(主要是Paul Menage和Rohit Seth),最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词太过广泛,为避免混乱,被重命名为cgroup,并且被合并到2.6.24版的内核中去。然后,其它开始了他的发展。? ?? Linux CGroupCgroup 可???让???您???为???系???统???中???所???运???行???任???务???(进???程???)的???用???户???定???义???组???群???分???配???资???源??? — 比???如??? CPU 时???间???、???系???统???内???存???、???网???络???带???宽???或???者???这???些???资???源???的???组???合???。???您???可???以???监???控???您???配???置???的??? cgroup,拒???绝??? cgroup 访???问???某???些???资???源???,甚???至???在???运???行???的???系???统???中???动???态???配???置???您???的??? cgroup。 主要功能:
cgroups子系统
cgroups 层级结构(Hierarchy)?????? 内核使用 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所关联的资源限制。 ???? 上图中的”M×N Linkage”说明的是css_set通过辅助数据结构可以与 cgroups 节点进行多对多的关联。但是 cgroups 的实现不允许css_set同时关联同一个cgroups层级结构下多个节点。 这是因为 cgroups 对同一种资源不允许有多个限制配置。 ???? 一个css_set关联多个 cgroups 层级结构的节点时,表明需要对当前css_set下的进程进行多种资源的控制。而一个 cgroups 节点关联多个css_set时,表明多个css_set下的进程列表受到同一份资源的相同限制。 实践操作查看cgroup挂载点(centos7.5): 1 [[email?protected] ~]# 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,pids) 4 cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,cpuset) 5 cgroup on /sys/fs/cgroup/memory type cgroup (rw,memory) 6 cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,cpuacct,cpu) 7 cgroup on /sys/fs/cgroup/blkio type cgroup (rw,blkio) 8 cgroup on /sys/fs/cgroup/freezer type cgroup (rw,freezer) 9 cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,hugetlb) 10 cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,perf_event) 11 cgroup on /sys/fs/cgroup/devices type cgroup (rw,devices) 12 cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,net_prio,net_cls) 创建隔离组 [[email?protected] ~]# cd /sys/fs/cgroup/cpu [[email?protected] cpu]# mkdir cpu_test 目录创建完成会自动生成以下文件 写个死循环测试程序增加cpu使用率 1 int main(void) 2 { 3 int i = 0; 4 for(;;) i++; 5 return 0; 6 } 启动程序后cpu使用100% 默认-1不限制,现在改成20000,可以理解使用率限制在20% [[email?protected] cpu]# echo 20000 > /sys/fs/cgroup/cpu/cpu_test/cpu.cfs_quota_us 找到进程号增加到cpu tasks里面,在看top? cpu使用率很快就下来 [[email?protected] ~]# echo 23732 >> /sys/fs/cgroup/cpu/cpu_test/tasks 其它资源限制和cpu基本一致就先写这么多了 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |