可以动态修改运行中容器的cgroups配额,需满足cgroup v2启用、docker≥20.10、内核≥5.8等前提;支持cpu(--cpus/--cpu-shares)、内存(--memory/--memory-reservation)、进程数、io权重及cpu绑定等热更新,直接写入/sys/fs/cgroup对应文件,毫秒级生效。
可以直接用 docker update 命令动态改写运行中容器的 cgroups 配额,但必须满足内核、docker 版本与 cgroup v2 启用等硬性前提。操作本身不重启容器,底层是直接向 cgroups v2 对应接口(如 /sys/fs/cgroup/.../cpu.max 或 memory.max)写入新值,内核即时生效。
CPU 配额的动态改写
支持两类 CPU 限制方式,均可热更新:
-
--cpus=1.5:设硬上限,等价于 cgroups v2 的
cpu.max(如150000 100000表示每 100ms 最多用 150ms),推荐用于确定性限频 -
--cpu-shares=2048:设调度权重(默认 1024),影响多容器争抢时的相对时间片比例,不设硬上限;现代 cgroup v2 下效果弱于
--cpus,仅在高并发竞争场景下体现
执行后可验证:docker exec cat /sys/fs/cgroup/cpu.max,输出格式为“配额 循环周期”微秒单位。
内存配额的动态改写
内存支持硬限制与软保障两种热更新模式:
-
--memory=2g:设物理内存硬上限,对应
memory.max;新值不能低于当前 RSS,否则报错拒绝 -
--memory-reservation=512m:设内存软下限,对应
memory.low;内存紧张时内核优先保留这部分,不影响峰值使用 - 若启用 swap,需同步指定
--memory-swap=2g(总内存+swap),禁用 swap 则设为与--memory相同值
验证命令:docker exec cat /sys/fs/cgroup/memory.max,单位字节,“max”表示无限制。
必须确认的前提条件
不是所有环境都支持热写 cgroups 配额,执行前请逐项检查:
- 宿主机启用 cgroup v2:
cat /proc/1/cgroup | head -1输出含unified或0::/ - 容器未挂载 legacy cgroup v1(如未手动指定
--cgroup-parent指向cpu,cpuacct:/...路径) - Docker ≥ 20.10(推荐 ≥ 27.x),且 containerd ≥ v2.0,runc ≥ v1.2.0
- 内核 ≥ 5.8(尤其对 memory.max 热更新的原子性支持)
其他可热更新的 cgroups 资源
除 CPU 和内存外,以下资源也支持通过 docker update 动态改写:
-
--pids-limit=512:限制进程数,写入
pids.max(Docker 27+ 原生支持) -
--blkio-weight=70:设块 IO 权重(10–1000),写入
io.weight(仅 cgroup v2) -
--cpuset-cpus="0-2":绑定可用 CPU 核心,写入
cpuset.cpus
这些操作均绕过容器重启,直接落盘到 cgroups v2 文件系统,毫秒级生效。











