保留空闲内存水位是什么
vm.min_free_kbytes 是内核为每个内存区域保留的空闲内存底线,单位是 KB。内核在启动时按物理内存规模计算初值,并据此推导出低水位、高水位等分界。保留这片空闲内存的用途包括:满足中断上下文中的原子分配、支撑内存回收与页回写的推进。数值过低会让直接回收频繁发生,表现为分配延迟抖动;数值过高则相当于凭空减少可用内存,让业务可用量变小。
基本信息
| 参数 | vm.min_free_kbytes(单位 KB) |
|---|---|
| 默认值 | 内核启动时按内存规模计算,各机型不同 |
| 相关视图 | /proc/zoneinfo 中每个内存区域的 min、low、high 水位 |
| 过低后果 | 直接回收频繁,分配延迟抖动、出现分配失败 |
| 过高后果 | 可用内存减少,业务可用容量下降 |
| 适用建议 | 仅在明确的分配失败或回收问题时手工调整 |
典型使用场景
- 排查分配抖动:直接回收计数偏高时评估水位设置是否偏低
- 小内存实例调优:默认值按比例算出来的量很小,需要确认是否充足
- 大内存机器评估:保留量随内存规模放大,需确认对业务可用内存的影响
- 故障复盘:结合内核日志中的回收与分配相关记录判断方向
- 调整验证:观察直接回收计数与分配失败是否随水位变化而改善
查看水位
查看水位
cat /proc/sys/vm/min_free_kbytes # 读当前保留量
awk '/Node/{n=$2} /^ min/{print "node",n,"min",$2}' /proc/zoneinfo # 各区域水位
grep -E 'allocstall|pgscan_direct' /proc/vmstat # 直接回收相关计数
free -h # 结合可用内存判断水位是否合理
sysctl -w vm.min_free_kbytes=262144 # 临时调整,单位 KB水位相关观察
| 观察点 | 含义 | 异常信号 |
|---|---|---|
| min_free_kbytes | 保留的空闲内存底线 | 取值过小会出现频繁直接回收 |
| zoneinfo 的 min/low/high | 每个内存区域的三档水位 | 水位与区域大小不匹配时需要评估 |
| allocstall 计数 | 分配触发的直接回收次数 | 持续增长说明空闲内存水位不足 |
| 可用内存 | 业务可用的内存规模 | 调高水位后可用量下降,需要权衡 |
手工调整该值只建议用于明确的分配失败或直接回收问题。常规环境下保持内核计算值即可,盲目调高会让业务可用内存减少,反而更容易触发 OOM。
小内存云主机上这个值偏小是正常结果,它按内存规模推导而来。不要把它当作内存泄漏的线索,判断内存问题应当结合 free、vmstat 与进程级内存统计。