一、简介
Cgroups,也称为Control Groups,是linux内核实现的即使调度及资源限制的工具。它通过将进程组织在层次结构中,并对每个组件分配和限制资源使用,来实现资源限制与监管。
在默认配置下,每个进程可以优先占用系统的资源,这样就可能出现某个进程独占的情况,并占用所有CPU和内存资源导致系统卡死。此时,cgroups可以帮助管理员限制进程占用资源的数量,这使得管理员可以更好地管理和控制系统,并且可以避免某个进程抢占系统的所有资源。
二、Cgroups的层次结构
Cgroups的层次结构类似于树形结构,最顶部的所属的组称为根组。下面是根组下的两个组example和test,以此类推。
/ |--example | |--- 1.processA | |--- 2.processB | |--- 3.processC | |--test | |--- 4.processD | |--- 5.processE | |--- 6.processF |
Cgroups目录树的每个节点包含一个子系统,用于控制或限制一个特定的子集资源。这些资源包括CPU、内存、IO等。
三、Cgroups的组设置
Cgroups的设置是一种基于文件系统的API。/sys/fs/cgroup目录下保存了有关所有cgroups和子系统的信息、文件和目录。
可以通过mkdir命令在任意目录下创建一个cgroup以及所有子cgroups,并且可以使用config文件中的配置参数来初始化。
$ mkdir /sys/fs/cgroup/cpu/example $ mkdir /sys/fs/cgroup/cpu/test $ mkdir /sys/fs/cgroup/memory/example $ mkdir /sys/fs/cgroup/memory/test
Cgroups的继承规则:
可以将子组继承其父组的参数。可以使用 “/”字符将多个组合成一个路径。这意味着具有相同父组(或祖先组)的子组可以分别继承行为。 如果没找到相应的资源参数,则将默认使用同一父组的参数。
/cgroup1 /cgroup2 /cgroup1/group1 /cgroup2/group2
group1和group2在匹配资源参数时,将分别使用 /cgroup1 和 /cgroup2中的任何参数,以及任何匹配的默认参数。
四、Cgroups的子系统
CPU子系统
CPU控制子系统被用于限制CPU处理时间。下面是一些示例:
$ mkdir /sys/fs/cgroup/cpu/example $ echo 20000 > /sys/fs/cgroup/cpu/example/cpu.cfs_quota_us $ echo 50000 > /sys/fs/cgroup/cpu/example/cpu.cfs_period_us
在处理器周期(周期单位为微秒)中,限制CPU计算使用时间。例如,如果想限制使用“进程X”在一秒钟内的CPU时间只有20%,就需要设置cpu.cfs_quota_us参数为20000,cpu.cfs_period_us则为100000,则周期为100毫秒。cpu.cfs_quota_us设置为20000意味着在一个周期内,“进程X”只能使用20%的CPU时间,即20000微秒。
内存子系统
内存控制子系统用于限制进程使用的内存。例如:
$ mkdir /sys/fs/cgroup/memory/example $ echo 10000000 > /sys/fs/cgroup/memory/example/memory.limit_in_bytes
此处,设置容器组的内存限制为10MB,使用 memory.limit_in_bytes 参数。 如果进程试图超过限制,进程将无法通过内存操作系统(mmap),sbrk调用等向内存请求进行扩展。 此外,进程也无法fork(2)到内存资源超过指定限制的新进程。
IO子系统
使用IO子系统限制容器内进程的磁盘I/O是一个很好的想法,这样可以确保传入的请求不会对磁盘造成压力过大。
$ mkdir /sys/fs/cgroup/blkio/test $ echo "8:0 1048576" > /sys/fs/cgroup/blkio/test/blkio.throttle.read_bps_device
此示例使用容器BPS方式限制磁盘读取的最大值为1M字节/秒,这可以通过块设备映射到容器中。它通过在 "/sys/fs/cgroup/blkio/test/blkio.throttle.read_bps_device"文件中添加 “[MAJOR]:[MINOR] BPS”读写设备限制来实现。由于Linux内核是模块化的,因此固定的块设备可以通过命令“lsblk”工具查看。
五、Cgroups的优缺点
优点
Cgroups正确地实现以资源为中心的管理策略,使得使用多个用户或应用程序在同一服务器上的多个任务时的资源分配更加公平。此外,cgroups还能够为每个任务分配独立的虚拟资源。
缺点
由于最初设计时是为Linux内核2.6版本编写的,随着内核的版本更迭,cgroups的接口、使用方法和实现方式也发生了变化。同时使用多个cgroups也会增加管理员的额外负担,同时由于其使用独立的虚拟资源,如果不合理地使用可能造成浪费。
六、总结
Cgroups是linux内核中一个强大、高效和实用的工具,可以帮助管理员对系统资源进行有效的分配和限制。从Cgroups的一个简单的例子中可以看出,它可以用于限制资源(例如CPU时间和内存)和I/O操作。它可以保证进程在运行时不会损害其他进程并导致系统崩溃。尽管Cgroups存在一些适用问题,但是它一个非常强大、稳定且高效的工具。