首页/系统/Linux 内核与性能调优速查/cgroup v2 memory.min/low 保底
内存与 OOM58 条

cgroup v2 memory.min/low 保底

memory.min 为硬保底:内存短缺时该组内存不会被回收;memory.low 为软保底:仅在别无选择时才回收。用于保护关键服务的最小工作集。

内存保底设置

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 迁移时不能直接换算数值,应按实际工作集重新设计

易错点

  • 把保底当使用上限:memory.min 不限制用量,只保护不被回收
  • 多组保底叠加超过总量:会挤压其他组并加剧整机内存压力
  • 只设保底不设上限:关键服务不受限,仍可能吃掉整机内存
  • 忽略层级:子组保底受父组限制,父组没有留量时子组也保不住
  • 以为设了保底就不会 OOM:回收保护与分配成功是两条独立路径

数据来源与参考

  • Linux 内核 Documentation/admin-guide/cgroup-v2.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌