Cgroup定义
Cgroup,或称为Linux Control Groups,是 Linux 内核提供的一种机制,用于对一组进程进行资源控制和管理。
Cgroup作用
Cgroup作用主要包含如下4点:
1.资源隔离
允许将进程组织成容器,实现资源的隔离,确保一个容器中的任务不会过度占用系统资源,从而影响其他容器或系统整体性能。
2.资源限制
提供了对 CPU、内存、磁盘 I/O、网络带宽等资源的精确控制和限制,以防止资源的滥用和过度使用。
3.优先级管理
允许管理员为不同的容器或任务设置优先级,确保关键任务获得足够的资源,并在系统负载高时得到适当的服务。
4.进程管理
提供一种组织进程的层次结构,使得可以更轻松地管理和监控任务的行为。
Cgroup原理
Docker 容器本质依旧是一个进程,多个 Docker 容器运行时,如果其中一个 Docker 进程占用大量 CPU 和内存就会导致其他 Docker 进程响应缓慢。
为了避免这种情况,可以通过 Linux Cgroups 技术对资源进行限制。
Linux Cgroups 技术架构,如下图所示:
CGroup 技术可以被用来在操作系统底层限制物理资源,起到 Container 的作用。
图中每一个 JVM 进程对应一个 Container Cgroup 层级,通过 CGroup 提供的各类子系统。
可以对每一个 JVM 进程对应的线程级别进行物理限制,这些限制包括 CPU、内存等等许多种类的资源。
Cgroups 由 3 个组件构成,分别是 :cgroup(控制组)、subsystem(子系统)以及 hierarchy(层级树),3 者相互协同作用。
1.子系统(subsystem)
子系统是一个内核的组件,一个子系统代表一类资源调度控制器。
例如:内存子系统可以限制内存的使用量,CPU子系统可以限制 CPU 的使用时间。
2.控制组(cgroup)
控制组表示:一组进程和一组带有参数的子系统的关联关系。
例如:一个进程使用了 CPU 子系统来限制 CPU 的使用时间,则这个进程和 CPU 子系统的关联关系称为控制组。
3.层级树(hierarchy)
层级树是由一系列的控制组,按照树状结构排列组成的。
这种排列方式可以使得控制组拥有父子关系,子控制组默认拥有父控制组的属性,也就是子控制组会继承于父控制组。
比如:系统中定义了一个控制组 c1,限制了 CPU 可以使用 1 核。
然后另外一个控制组 c2 想实现既限制 CPU 使用 1 核,同时限制内存使用 2G。
那么 c2 就可以直接继承 c1,无须重复定义 CPU 限制。
Cgroup使用
以下是一个简单的使用示例,主要演示如何创建一个 cgroup,设置 CPU 配额,并将进程加入到这个 cgroup 中。
1.挂载 cgroup 文件系统
通过mount命令可以查看Linux上默认挂载的子系统,包括cpu、memory、pids 等cgroups子系统。
如下所示:
mount -t cgroup -o cpu mygroup /sys/fs/cgroup/cpu
这里将 cgroup
文件系统挂载到 /sys/fs/cgroup/cpu
目录下,并指定了 cpu
子系统。
2.创建 cgroup
这里创建了一个名为 mygroup 的 cgroup 目录:
mkdir /sys/fs/cgroup/cpu/mygroup
3.设置 CPU 配额
这里设置了 CPU 配额为 10000 微秒,如下所示:
echo 10000 > /sys/fs/cgroup/cpu/mygroup/cpu.cfs_quota_us
表示该 cgroup 在每个 10000 微秒(10 毫秒)的时间窗口内可以使用 CPU,这相当于将 CPU 使用限制在 10%。
cgroup 是一个强大而灵活的工具,可以根据需要进行更复杂的配置,包括对内存、磁盘 I/O 等资源的管理。