Cgroup详解(定义作用及原理使用)

Cgroup详解(定义作用及原理使用)-mikechen

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详解(定义作用及原理使用)-mikechen

CGroup 技术可以被用来在操作系统底层限制物理资源,起到 Container 的作用。

图中每一个 JVM 进程对应一个 Container Cgroup 层级,通过 CGroup 提供的各类子系统。

可以对每一个 JVM 进程对应的线程级别进行物理限制,这些限制包括 CPU、内存等等许多种类的资源。

Cgroups 由 3 个组件构成,分别是 :cgroup(控制组)、subsystem(子系统)以及 hierarchy(层级树),3 者相互协同作用。

Cgroup详解(定义作用及原理使用)-mikechen

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 等资源的管理。

作者简介

陈睿|mikechen,10年+大厂架构经验,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

评论交流
    说说你的看法