首页/系统/Linux 内核与性能调优速查/vm.min_free_kbytes 保留空闲内存
sysctl 内核参数72 条

vm.min_free_kbytes 保留空闲内存

内核启动时按内存规模计算并保留的空闲内存水位(低水位线);数值过低会引发直接回收与分配失败,过高则浪费内存。

保留空闲内存水位是什么

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 与进程级内存统计。

易错点

  • 把它当内存泄漏的线索:该值随内存规模计算,小实例上数值小属正常
  • 盲目调高:业务可用内存减少,OOM 风险上升
  • 只看该值不看各区域水位:实际行为由 zoneinfo 中的三档水位共同决定
  • 忽略直接回收计数:判断水位是否不足要看 allocstall 与相关扫描计数
  • 在虚拟化环境照搬物理机取值:可用内存与内存区域结构不同,需要重新评估

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/vm.rst
  • man 5 proc(zoneinfo)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌