内存保底设置
memory.min 与 memory.low 是一组保底设置。memory.min 是硬保底:系统内存短缺时,该组在这个额度内的内存不会被回收。memory.low 是软保底:优先保留,只有在别无选择时才会回收这部分内存。两者都用来保护关键服务的最小工作集,避免整机内存压力下被其他组把页缓存与热数据抢走。systemd 中对应 MemoryMin= 与 MemoryLow=。
基本信息
| memory.min | 硬保底,额度内不被回收 |
|---|---|
| memory.low | 软保底,尽力保留,压力极大时仍可被回收 |
| systemd 对应 | MemoryMin= 与 MemoryLow= |
| 保护范围 | 只保护不被回收,不保证分配一定成功 |
| 层级关系 | 子组的保底受父组额度限制 |
典型使用场景
- 保护数据库等关键服务的最小工作集
- 多租户机器上避免业务之间互相挤占
- 排查关键服务在整机内存压力下性能骤降
- 与 v1 的 memory.limit_in_bytes 思路做对比
- 规划内存预算时区分保底额度与使用上限
查看与设置
查看与设置
cat /sys/fs/cgroup/<组>/memory.min
cat /sys/fs/cgroup/<组>/memory.low
echo 512M | sudo tee /sys/fs/cgroup/<组>/memory.min
cat /sys/fs/cgroup/<组>/memory.current
cat /sys/fs/cgroup/<组>/memory.stat | grep -E 'anon|file|inactive_file'
systemctl set-property myservice.service MemoryMin=512M
cat /sys/fs/cgroup/<组>/memory.events四类内存参数
| 文件 | 语义 | 行为 |
|---|---|---|
| memory.min | 硬保底 | 内存短缺时该额度内不被回收 |
| memory.low | 软保底 | 优先保留,别无选择时仍会被回收 |
| memory.max | 硬上限 | 触顶触发组内回收与 OOM |
| memory.events | 事件统计 | 观察 low、max、oom、oom_kill 发生次数 |
保底保护的是「不被回收」,不等于「保证分配成功」;新分配能否成功仍取决于系统剩余内存。
保底额度叠加过多会挤压其他控制组,总体加总不应超过物理内存的合理比例,否则整机都更容易进入内存紧张状态。
取值建议
- 保底值参考业务稳态工作集,而不是历史峰值用量
- 先用 memory.stat 的 anon 与活跃文件缓存估算真实工作集大小
- 所有组的保底总和控制在物理内存的合理比例内,为整机留出弹性空间
与 v1 的差异
- v1 没有直接的保底语义,通常靠限额配合过量提交策略间接规避
- v2 用 min、low、high、max 四层表达,粒度更细也更需要成组配置
- 从 v1 迁移时不能直接换算数值,应按实际工作集重新设计