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

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 服务器 — 将 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,旧版工具链(如某些监控脚本)可能需适配路径和文件名










