cgroup是Linux内核允许将流程组织为分层的功能,然后可以限制其使用各种类型资源的组并进行监控。内核的cgroup接口通过伪文件系统,称为cgroupfs。分组在核心cgroup内核代码,而资源跟踪和限制是在一组每个资源类型的子系统(内存,CPU,等等)。
控制器的cgroup按层次结构排列。通过创建,删除和重命名cgroup 文件系统来定义层次结构在每个级别的层次中,可以定义属性(例如限制),cgroup提供的限制,控制和计费通常在定义属性的cgroup之下的整个子层次结构中有效。 因此,例如,子级cgroup不能超过层次结构中较高级别的cgroup上的限制
cgroups实现的最初版本是在Linux中2.6.24。随着时间的推移,各种cgroup控制器已添加到允许管理各种类型的资源。然而这些控制器的开发在很大程度上是不协调的,结果是控制器和控制器之间出现了许多不一致之处,cgroup层次结构的管理变得相当复杂。
由于最初的cgroups实现存在问题(cgroups版本1)从Linux 3.10开始,开始了新的工作,正交实施以解决这些问题。最初标记实验性的,并且隐藏在 -o __DEVEL__sane_behavior
挂载选项,最终制作了新版本(cgroups版本2)正式发布于Linux 4.5。
尽管cgroups v2旨在替代cgroups v1,但是较旧的系统继续存在(出于兼容性原因,不太可能被删除)。目前,cgroups v2仅实现 cgroups v1中可用的控制器子集。两个系统已实现,因此v1控制器和v2控制器都可以安装在同一系统上。因此,例如,可以使用在版本2下受支持的控制器,同时使用版本2尚不支持的版本1控制器这些控制器。唯一的限制是控制器不能同时在cgroups v1层次结构和在cgroups v2层次结构中。
cgroup分为以下子系统:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.orgrpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpmyum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-develgrub2-set-default 0
/etc/default/grubGRUB_CMDLINE_LINUX添加cgroup_no_v1=allgrub2-mkconfig -o /boot/grub2/grub.cfg
mkdir /cgroup2# 挂载cgroupmount -t cgroup2 nodev /cgroup2# 为子树添加io子系统echo "+io" > /cgroup2/cgroup.subtree_control# 验证是否开启cat /cgroup2/cg2/cgroup.controllers# 查看 文件系统设备号lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsr0 11:0 1 41M 0 romvda 253:0 0 50G 0 disk└─vda1 253:1 0 50G 0 part /
# 限制设备IOecho "253:0 wbps=1048576" > /cgroup2/cg2/io.max# 测试 这里要设置一个比较大的文件,不然看不出效果dd if=/dev/zero of=/tmp/file1 bs=512M count=1
注意:上面步骤我们可以看到我们对设备进行了限制,cgroup本身无法对分区进行限制,但是我们可以通过lvm使用分区创建LV,从而对LV进行限制
cgroup-v1文档
cgroup V2设计草案
Cgroup V2 and writeback support