/proc/zoneinfo 是查看内存水位线的正确途径,其中 low 值单位为页(默认4KB),由 vm.min_free_kbytes 和 vm.watermark_scale_factor 共同推导;low 过高或过低均影响 kswapd 回收效率与系统响应。

Free-L 并不是 Linux 系统中用于查看内存水位线的标准工具或命令,它并不存在于内核、sysctl 或 procfs 体系中。你可能混淆了名称——实际用于查看内存水位线的是 /proc/zoneinfo,配合关键词过滤即可定位 low、min、high 水位值。
用 /proc/zoneinfo 查看真实低水位线(WMARK_LOW)
每个内存 zone(如 DMA、Normal、DMA32)都独立维护 min/low/high 三条水位线,单位是页(page),默认页大小为 4KB。执行以下命令可快速提取关键字段:
- cat /proc/zoneinfo | grep -A 5 -E "Node [0-9]+, zone|low.*:" —— 显示每个 node-zone 的 low 值及其上下文
- awk '/Node.*zone/{node=$0}/low.*:/&&node{print node,$0}' /proc/zoneinfo —— 精准匹配 zone 名称与对应 low 行
输出中类似 low 1856 的数字即为该 zone 的低水位线(单位:页)。若需换算成 MB,可用 1856 × 4 / 1024 ≈ 7.25 MB。
低水位线不是独立配置项,而是由 min_free_kbytes 推导而来
Linux 不允许直接写入 low 水位值(/proc/sys/vm/low_watermark 是只读统计项)。真正可调的底层参数是:
- vm.min_free_kbytes:系统全局保留的最小空闲内存(KB),决定所有 zone 的 min 水位基线
- vm.watermark_scale_factor:控制 low 与 min、high 与 low 的相对间距,默认 10(即差值 ≈ 总内存的 0.1%)
例如:sysctl vm.min_free_kbytes=65536(64MB)后,各 zone 的 low 值会自动按比例升高;再设 vm.watermark_scale_factor=500,low 与 min 的间隔将显著拉宽,使 kswapd 更早启动、回收更平缓。
结合业务特征判断 low 水位是否合理
低水位线的核心作用是触发 kswapd 异步回收。若观察到以下现象,说明当前 low 值偏高或偏低:
- free 内存常在 low 附近震荡,且 vmstat 中频繁出现 pgpgin/pgpgout → low 设置过低,kswapd 启动太晚,已逼近 min 区域
- top 显示内存充足(free > 30%),但偶发卡顿、延迟抖动 → low 过高,预留内存过多,有效可用内存被“锁死”,实际分配压力提前显现
-
NUMA 多节点系统中某 node free 持续偏低,其他 node 充裕 → 需检查
/proc/sys/vm/numa_zonelist_order或按 node 单独评估 zoneinfo
优化建议:从监控到调整的闭环
不要凭经验硬设数值。推荐四步走:
- 先运行 watch -n 1 'cat /proc/zoneinfo | grep -E "(Node|free|min|low|high)"',观察水位波动与业务高峰是否同步
- 压测时关注 /proc/vmstat 中
pgmajfault(大页缺页)、pgpgin/pgpgout(换入换出)是否突增 - 临时调参用 sysctl -w vm.min_free_kbytes=XXX,每次增减不超过原值 ±10%,避免激进改动
- 容器化环境优先使用 cgroups v2 的
memory.low和memory.min,比全局调参更精准、无副作用


















