Docker Cgroups

本文深入探讨了Docker中cgroups(Control Groups)的机制与应用,包括资源限制、优先级控制、资源使用记录、进程隔离及控制等功能。通过实例演示如何限制进程的CPU使用率,展现了cgroups在资源管理上的强大能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker中利用namespace来做权限控制,用cgroups来做资源控制,这两个都是非常重要的,下面是整理了一些关于cgroups相关的。

cgroups全称control groups ,是Linux内核提供的一种机制,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)。

cgroups最初的目标是为资源管理提供的一个统一的框架,即整合现有的cpuset等子系统,也为未来开发新的子系统提供接口。现在的cgroups适用于多种应用场景,从单个进程的资源控制,到实现操作系统层次的虚拟化,cgroups提供了以下功能:

  1. 限制进程组可以使用的资源数量(Resource limiting)。
  2. 进程组的优先级控制(Prioritization)。
  3. 记录进程组使用的资源数量(Accounting)。
  4. 进程组隔离(lsolation)。
  5. 进程控制组(control)。

cgroup的API以一个伪文件系统的方式实现,即用户可以通过文件操作实现cgroup的组织管理。

cgroup 的组织管理操作单元可以细粒度到线程级别,用户态代码也可以针对系统分配的资源创建和销毁cgroup,从而实现资源再分配和管理。

所有资源管理的功能都以subsystem(子系统)的方式实现。

子进程创建之初与其父进程处于同一个cgroups的控制组。

术语:

task(任务)

系统中的进程。

cgroup(控制组)

cgroups中的资源控制都以cgroup为单位实现。cgroup表示按某种资源控制标准划分而成的任务组,包含一个或多个子系统。一个任务可以加入某个cgroup,也可以从某个cgroup迁移到另外一个cgroup。

 

subsystem(子系统)

cgroups中的subsystem就是一个资源调度控制器(Resource Controller)。比如CPU子系统可以控制CPU时间分配,内存子系统可以限制cgroup内存使用量。

 

hierarchy(层级树)

hierarchy由一系列cgroup以一个树状结构排列而成,每个hierarchy通过绑定对应的subsystem进行资源调度。hierarchy中的cgroup节点可以包含0或者多个子节点,子节点继承父节点属性。整个系统可以有多个hierarchy。

 

cgroup是分层管理的,类似进程,且子cgroup会继承上级cgroup的一些属性。

 

下面简单做一个对指定进程cpu使用率限制的例子感受下。

先用mount命令查看挂载目录

mount -t cgroup

 

cd 过去创建一个测试的节点(文件夹)

cd /sys/fs/cgroup/cpu

sudo mkdir cpu_limit_demo

 

创建好cpu_limit_demo目录后cd过去会发现系统会自动创建很多文件。

 

跟上一层路径下面的文件很像,可以理解成是树的更深一个层的节点。

 

cfs_period 和 cfs_quota两个文件,这两个参数需要组合使用,可以用来限制进程在长度为cfs_period 的一段时间内,只能被分配到总量为cfs_quota 的 CPU 时间

看下默认值:

 

-1表示不启用,假如现在想控制某个进程cpu上限是50%,就在quota里面直接插入一个50000(period的一半)。

 

先跑一个whlie1 把 cpu 打满

while : ; do : ; done &

 

然后执行 echo 50000 > cpu.cfs_quota_us 限制50% 使用率,然后再把需要限制的pid卸载tasks里面 echo 30880 > tasks

 

还有很多其他限制例子,可以看下这个

https://www.cnblogs.com/wdliu/p/10509045.html

 

 

 

 

 

### 修改 Docker 使用 Systemd 作为 Cgroup Driver 为了确保 Kubernetes 和 Docker 的 cgroup 驱动程序保持一致,通常建议将 Docker 的 cgroup 驱动设置为 `systemd`。这可以通过编辑 `/etc/docker/daemon.json` 文件来实现。 #### 编辑 Daemon JSON 文件 在文件中加入如下配置: ```json { "exec-opts": ["native.cgroupdriver=systemd"] } ``` 保存并退出编辑器后,重启 Docker 服务以应用更改[^1]。 #### 检查当前的 Cgroup Driver 设置 执行命令查看 Docker 当前使用的 cgroup 驱动是否已更改为 `systemd`: ```bash docker info | grep 'Cgroup' ``` 如果一切正常,则应看到输出显示 `Cgroup Driver: systemd`[^2]。 #### 处理潜在冲突 需要注意的是,在某些情况下可能会遇到由于重复定义而导致的问题——即在同一位置既指定了 `native.cgroupdriver=systemd` 又有其他相同参数的存在。为了避免这种情况发生,请确认 `/lib/systemd/system/docker.service` 或者任何自定义的服务单元文件里没有相同的选项被指定。如果有,请移除这些冗余项后再尝试启动 Docker[^3]。 #### 关于资源约束配置 对于希望进一步控制容器内应用程序行为的需求方来说,还可以利用 Docker 提供的各种资源限制机制来进行精细化管理。例如,通过调整 `--cpus` 参数可限定某个特定容器所能占用的最大 CPU 数量;而当涉及到网络连接时,则可能需要用到像 `iptables` 这样的工具配合操作系统的路由表进行流量导向等高级设定[^4]。 #### 实践案例:压力测试环境搭建 假设现在有一个场景是要模拟高负载情况下的系统表现,那么可以在多个容器内部署同样的工作负载生成器(比如使用 `stress` 工具),并通过宿主机上的相应设置允许它们访问外部互联网从而形成完整的实验闭环。具体做法包括但不限于向系统配置追加必要的 IP 转发指令以及安装所需的软件包等等[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值