Cgroups 是 Linux 内核提供的资源限制机制,Docker 通过为其容器自动创建独立 cgroup 并配置 cpu、memory 等子系统参数(如 cpu.cfs_quota_us、memory.limit_in_bytes),实现 CPU 和内存的硬性约束,所有限制均在内核路径中强制执行,不可绕过。

Cgroups 是 Docker 资源限制的底层机制,它不是 Docker 自己实现的功能,而是直接调用 Linux 内核提供的控制能力。Docker 在创建容器时,会为每个容器自动创建一个独立的 cgroup,并把容器内所有进程加入其中,再通过配置对应子系统的参数,实现对 CPU 和内存的硬性约束。
CPU 限制靠调度器与配额协同生效
cgroups 的 cpu 子系统配合 Linux 完全公平调度器(CFS)工作。关键参数有三个:
-
--cpus=1.5:等价于设置
cpu.cfs_quota_us=150000和cpu.cfs_period_us=100000,表示每 100ms 周期内最多运行 150ms,即 1.5 个核的计算时间——这是最直观的硬限制。 -
--cpu-shares=512:设置
cpu.shares值,仅在多个容器争抢 CPU 时起作用。默认是 1024,值越小,获得的 CPU 时间比例越低;空闲时不生效,容器可自由使用剩余算力。 -
--cpuset-cpus="0,2":绑定到特定物理核心,写入
cpuset.cpus,避免跨核缓存失效,也防止容器使用未授权的 CPU 资源。
内存限制靠页分配拦截与 OOM 控制
memory 子系统在进程申请内存(如 malloc 或 mmap)时介入,一旦超出限额立即拒绝或触发回收:
-
-m 512m:设
memory.limit_in_bytes=536870912,容器使用物理内存超过该值时,内核会尝试回收缓存;若仍无法满足,触发 OOM Killer 终止容器内某个进程。 -
--memory-swap=512m:设
memory.memsw.limit_in_bytes,等于 memory 限额时,完全禁用 Swap,避免内存压力下性能骤降。 -
--memory-reservation=256m:设
memory.soft_limit_in_bytes,作为软限制。宿主机内存紧张时,内核会优先从超限的容器中回收内存,但不强制杀进程。
限制行为发生在内核路径上,不可绕过
所有限制都嵌入在内核资源分配关键路径中:CPU 时间由调度器按 quota 分配,内存页由 mm 子系统在分配前检查 limit。这意味着即使容器内进程试图暴力申请资源,也会被内核直接拦截或节流,不需要用户态干预。这也是为什么 Docker 的资源限制具备强制性、实时性和高精度的原因。


















