free 命令不支持 -L 选项,查内存 low 水位须用 cat /proc/zoneinfo;其值单位为页,可换算为 MB;调整需通过 vm.min_free_kbytes 或 vm.watermark_scale_factor。

Linux里没有 free -L 这个选项,free 命令根本不支持 -L 参数。想查内存水位线,得绕开这个不存在的命令,直接看内核暴露的原始数据。
为什么 free -L 会报错或静默忽略
这是最常踩的第一个坑:把其他工具(比如某些定制监控脚本或误传的文档)里的参数当成标准用法。实际执行 free -L,你会看到类似 free: invalid option -- 'L' 的错误,或者什么也不输出就退出——因为 free 根本不识别它。
-
free只支持-h、-m、-g、-w等有限参数,源码里没定义L - 有人可能混淆了
free和vmstat或cat /proc/zoneinfo的输出字段,误以为“low”水位能直接从free里读出来 - 即使加了
-L,free也不会报错退出(取决于版本),而是默默忽略,导致你以为“查到了”,其实啥也没显示
真正能查到 low watermark 的方式是 cat /proc/zoneinfo
/proc/zoneinfo 是内核为每个内存 zone(如 Normal、DMA32)生成的详细水位快照,里面明确列出了 low、min、high 三档水位值,单位是页(page),不是字节或 MB。
- 执行
grep -A 5 "low.*water" /proc/zoneinfo可快速定位所有 zone 的 low 水位行 - 注意每段输出对应一个 zone,例如
Node 0, zone Normal后面紧跟着的low行才是你要的数据 - 如果只关心数值,可用
awk '/low.*water/ {print $NF}' /proc/zoneinfo提取全部 low 值(单位:页) - 换算成 MB:乘以
4(假设标准页大小 4KB),再除以1024,即pages * 4 / 1024 = MB
调整 low watermark 实际上是调 vm.min_free_kbytes
你不能直接写 /proc/sys/vm/low_watermark——它是只读统计值。真正可调、且影响所有水位线(包括 low)的参数只有 vm.min_free_kbytes。
- 修改后,内核会按各 zone 的
managed_pages比例重新计算每个 zone 的min、low、high - 例如:一台 64GB 内存机器,设
vm.min_free_kbytes=2097152(即 2GB),通常会让low水位落在 3–4GB 区间(具体看 zone 分布) - 临时生效:
sysctl -w vm.min_free_kbytes=2097152 - 永久生效:写入
/etc/sysctl.conf并运行sysctl -p - 调太大会浪费内存;调太小会导致
min水位过低,容易触发直接回收和卡顿
更安全的调优路径:优先用 watermark_scale_factor 控制 low/min 差距
如果你只是想让 kswapd 更早启动(即抬高 low 水位,但不动 min),推荐改 vm.watermark_scale_factor,而不是猛拉 min_free_kbytes。
- 默认值是
10,代表low - min和high - low各占总内存的 0.1% - 设为
100,差值扩大到 1%;设为500,就是 5% —— 这样既抬高了low,又保留了min的底线弹性 - 该参数对 page cache 密集型服务(如 Redis、Elasticsearch)特别有效,能显著减少直接回收频率
- 验证效果:改完后再次跑
grep -A 5 "low.*water" /proc/zoneinfo,对比min和low的差值是否变大
真正关键的不是记住哪条命令“看起来像在查 low”,而是理解 low 不是独立配置项,它由 min_free_kbytes 和 watermark_scale_factor 共同决定;而 /proc/zoneinfo 是唯一反映实时水位状态的权威来源。任何跳过它、依赖封装命令或猜测参数的行为,都会让你调了半天却不知道水位到底变了没。


















