怎么理解 Linux 控制组 Cgroups 在 Docker 容器中进行物理资源配额划分的核心机制

酷磊君_8505

酷磊君_8505

2026-07-19

462人浏览

原创

docker通过cgroups实现容器资源配额,核心是按组施控、动态约束、内核拦截:为容器创建专属cgroup子目录,将进程pid写入cgroup.procs,内核在调度或分配时依据cpu.cfs_quota_us/cfs_period_us等参数强制限制cpu、内存、io等资源。

怎么理解 linux 控制组 cgroups 在 docker 容器中进行物理资源配额划分的核心机制

Linux 控制组(Cgroups)在 Docker 容器中实现物理资源配额划分,核心在于“按组施控、动态约束、内核拦截”。Docker 启动一个容器时,会自动为其创建专属的 Cgroup 子目录(如 /sys/fs/cgroup/cpu/docker/),并将容器内所有进程 PID 写入该组的 cgroup.procs 文件。此后,这些进程的资源申请行为会被内核在调度或分配路径上实时拦截,并依据对应子系统(如 cpu、memory)下的配置参数强制执行限制。

CPU 配额:靠时间片切片与周期配比来硬限

Cgroups 通过 CFS(完全公平调度器)实现 CPU 资源的可配额化。关键参数是 cpu.cfs_period_us(调度周期,默认 100000 微秒即 0.1 秒)和 cpu.cfs_quota_us(该周期内允许使用的最大 CPU 时间)。两者的比值就是实际可用的 CPU 上限。

  • 设 cpu.cfs_period_us=100000,cpu.cfs_quota_us=50000 → 容器最多用 50% 的单核 CPU
  • 设 cpu.cfs_quota_us=-1 → 不设上限(默认行为)
  • Docker 命令 --cpus="2.5" 实际会自动换算为 period=100000、quota=250000

内存限制:靠页分配拦截与 OOM 管理来强控

内存子系统不依赖“使用率”,而是直接限制进程能分配的物理内存总量(含 page cache)。关键文件是 memory.max(v2)或 memory.limit_in_bytes(v1)。

Linux Ai Server
Linux Ai Server

Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。

下载
  • 当容器尝试分配内存超出设定值,内核会触发内存回收;若仍无法满足,直接触发 OOM Killer 终止进程
  • 支持软限制(memory.soft_limit_in_bytes)作为预警阈值,但不强制阻止分配
  • Docker 的 --memory=512m 就是写入该限制值

I/O 与设备访问:按权重或带宽做分级调控

块设备 I/O(blkio)和设备权限(devices)子系统提供更细粒度的控制能力:

  • blkio.weight 设置相对权重(100–1000),决定争抢磁盘带宽时的优先级
  • blkio.throttle.read_bps_device 可硬性限制某设备每秒读取字节数
  • devices.list 明确列出容器可访问的设备节点(如 c 1:3 rwm 表示允许对 /dev/null 读写执行)

统一层级与版本差异:v1 和 v2 的落地影响

当前主流发行版已默认启用 Cgroups v2(如 Ubuntu 22.04+、RHEL 9+),它把所有子系统纳入单一挂载点(/sys/fs/cgroup),避免 v1 中多挂载、多层级导致的配置冲突。

  • v1:每个子系统独立挂载(/sys/fs/cgroup/cpu、/sys/fs/cgroup/memory…),需分别管理
  • v2:统一 hierarchy,通过 cgroup.controllers 开关启用子系统,Docker 自动适配
  • Docker 20.10+ 全面支持 v2,旧版工具链(如某些监控脚本)可能需适配路径和文件名

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux docker

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

2023.07.24

745

4

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

5699

6

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

6717

6

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

2593

7

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

2026.02.11

279

16

Docker 容器部署
Docker 容器部署

本专题整合了Docker容器部署相关内容,阅读专题下面的文章了解更多详细操作教程。

2026.03.31

451

14

Java容器化部署与Docker实践教程合集
Java容器化部署与Docker实践教程合集

聚焦 Java 应用的容器化与云原生部署,讲解 Dockerfile 编写规范与 Java 应用镜像构建、多阶段构建(Multi-stage Build)减小镜像体积、Jib / Buildpacks 免 Dockerfile 镜像构建方案、JVM 容器感知参数(-XX:MaxRAMPercentage)配置、Docker Compose 编排多服务(应用 + MySQL + Redis)、容器健康检查与资源限制、Kubernetes

2026.05.11

420

26

Go Docker与容器化部署教程合集
Go Docker与容器化部署教程合集

聚焦 Go 应用的容器化部署优势与实践,讲解 Go 静态编译特性(CGO_ENABLED=0)与 scratch / distroless 极小基础镜像构建、多阶段 Dockerfile 编写规范、交叉编译生成目标平台二进制、镜像安全扫描(Trivy)与漏洞修复、Docker Compose 本地编排开发环境、Kubernetes Deployment / Service / ConfigMap 部署 Go 服务、健康检查(Livene

2026.05.15

305

24

Hyperf 项目部署运维与性能调优手册
Hyperf 项目部署运维与性能调优手册

聚焦 Hyperf 在生产环境的落地,包含 Docker 高效打包、Swoole 配置优化、常见的内存溢出(OOM)问题排查方法以及热更新方案。

2026.05.19

465

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习