内存软限制是什么
--memory-reservation 设置内存软限制:容器日常可弹性使用内存,只有在宿主整体内存紧张时才被压回这个水位。它适合给带缓存的服务留缓冲,既能利用空闲内存,又不会在压力下无限膨胀。
基本信息
| 语法 | --memory-reservation=512m,通常与 --memory 搭配 |
|---|---|
| 性质 | 软限制(弹性水位) |
| 生效条件 | 宿主出现内存压力时 |
| 映射 | cgroup v2 → memory.low;v1 → memory.soft_limit_in_bytes |
| 核对 | docker inspect 的 HostConfig.MemoryReservation |
典型使用场景
- 带本地缓存的服务:空闲时用满内存,压力下让出给关键业务
- 同一宿主混跑在线与离线任务,用软限界定离线任务可让出的量
- 容量规划:给每个容器划一条弹性线,降低宿主整体 OOM 概率
- 压测阶段验证内存回收行为是否符合预期
- 多租户环境里约束单个租户的内存膨胀幅度
设置与核对
设置与核对
docker run -d --memory=1g --memory-reservation=512m --name api app/api:1.4.2
docker inspect -f '{{.Name}} hard={{.HostConfig.Memory}} soft={{.HostConfig.MemoryReservation}}' api
docker info -f 'CgroupVersion={{.CgroupVersion}}' # 先确认 cgroup 版本,字段映射不同
# 压测时制造内存竞争,才能观察到软限的回收行为三个内存参数对照
| 参数 | 语义 | 超限后果 |
|---|---|---|
| --memory | 硬限,不可超过 | 超过后触发 OOM 或被终止 |
| --memory-reservation | 软限,压力时回压 | 压力下被回收,平时可超出 |
| --memory-swap | 内存加交换的总量 | 总量约束 |
| 只设硬限 | 没有弹性水位 | 空闲内存无法被其他容器借用 |
软限制只在宿主出现内存压力时生效;压测时要主动制造内存竞争,否则观察不到回收行为。
把软限制当硬上限会误判容量:容器超过软限后仍可继续分配内存,直到撞上硬限。
cgroup v1 与 v2 的实现字段不同,跨代环境排查前先用 docker info 确认版本,再对照相应字段。
软限制要小于或等于硬限制才有意义,配置时两个值一起给出,避免只写一个造成理解偏差。
运行中可以用 docker update 调整软限应急,但硬限相关变更受内核与 cgroup 版本限制,正式改动仍以重建容器为准,并回写到编排文件。