Docker容器的cgroup搭建

本文介绍了Linux cgroups的基本概念,包括资源限制、优先级控制、资源记录、进程组隔离和控制。详细阐述了cgroup在Docker中的应用,特别是如何部署和测试对CPU及内存使用的限制,通过修改cpu.cfs_period_us和cpu.cfs_quota_us等参数来调整容器的CPU利用率,并通过top命令观察效果。最后提到了内存限制的设置方法。

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

一,基本知识

1.什么是cgroup
Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。最初由 google 的工程师提出,后来被整合进 Linux 内核。Cgroups 也是 LXC 为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC。

2.cgroup可以干什么

(1)限制进程组可以使用的资源数量(Resource limiting )。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发OOM(out of memory)。

(2)进程组的优先级控制(Prioritization )。比如:可以使用cpu子系统为某个进程组分配特定cpu share。

(3)记录进程组使用的资源数量(Accounting )。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间

(4)进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。

(5)进程组控制(Control)。比如:使用freezer子系统可以将进程组挂起和恢复。

3.cgroup中需要了解的四个概念

(1)Subsystems: 称之为子系统,一个子系统就是一个资源控制器,比如 cpu子系统就是控制cpu时间分配的一个控制器。

(2)Hierarchies: 可以称之为层次体系也可以称之为继承体系,指的是Control Groups是按照层次体系的关系进行组织的。

(3)Control Groups: 一组按照某种标准划分的进程。进程可以从一个Control Groups迁移到另外一个Control Groups中,同时Control Groups中的进程也会受到这个组的资源限制。
(4)Tasks: 在cgroups中,Tasks就是系统的一个进程。

二、cgroup的部署

对cpu内存的限制
1.打开docker并检测cgroup是否开启

[root@server1 ~]# systemctl start docker
[root@server1 ~]# mount -t cgroup 		 ##都显示on即可
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,rela
### 修改 Docker 使用 Systemd 作为 Cgroup Driver 为了确保 Kubernetes 和 Dockercgroup 驱动程序保持一致,通常建议将 Dockercgroup 驱动设置为 `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、付费专栏及课程。

余额充值