软限制本质是“保底不锁死”,即容器在内存充足时可弹性突破软限使用更多内存(上限受硬限制约束),压力下才被优先回收超软限部分;必须与--memory配合使用,且硬限须大于软限。Docker 的 `--memory-reservation` 不是用来“让渡”资源的,而是告诉内核:“这个容器至少需要这么多内存才能稳住”,系统空闲时它仍可按需多用,压力来了才被压缩回预留值——这才是真正的弹性保障。
软限制的本质是“保底不锁死”。它不是把内存划死给你,也不是主动释放给别的容器,而是在宿主机内存充足时,允许容器突破软限使用更多(上限仍受 `--memory` 约束);一旦整体压力上升,内核会优先回收那些已超软限、又没到硬限的内存页,把空间腾出来给更“紧要”的容器。这种机制天然支持低负载时的资源弹性利用。
单独设 `--memory-reservation` 无效,Docker 会直接忽略。软限制只有在 `--memory` 存在的前提下,才会写入 cgroup 的 `memory.low`(cgroups v2)或 `memory.soft_limit_in_bytes`(v1)。
当宿主机空闲、内存充裕时,容器可以平滑地用到接近 `--memory` 的上限,无需人工干预——这正是“按需弹性”的体现。比如一个 API 网关容器设了 `--memory=512m --memory-reservation=384m`:
软限制管的是内存回收顺序,OOM 分数管的是进程被杀顺序。两者叠加,才能确保关键容器在压力下既不被猛回收,也不被误杀:
启动后别只看 `docker stats`,要确认内核层面的配置落地:
cat /sys/fs/cgroup/docker/*/memory.low,输出应为软限字节数(如 384MB → 402653184)docker stats --no-stream 观察 MEM USAGE,在低负载时是否能稳定高于软限、接近硬限stress-ng --vm 2 --vm-bytes 2G 占满宿主机),观察该容器内存回落是否明显晚于未设软限的同类容器