linux中kswapd启动由zone水位线pages_low决定,该值由min_free_kbytes自动推导;增大后者使回收更激进,减小则更保守但增加直接回收风险。

Linux 中内存不足时的主动回收(即后台回收,由 kswapd 执行)是否启动,取决于每个内存区域(zone)的水位线(watermark),其中最关键的是 pages_low —— 它是唤醒 kswapd 的阈值。这个值本身不由用户直接配置,而是由内核根据 /proc/sys/vm/min_free_kbytes 自动推导得出。
核心配置项:min_free_kbytes
该参数定义了系统**全局最低保留空闲内存(KB)**,内核据此为每个 zone 计算 pages_min、pages_low 和 pages_high。调整它,就等于间接调节 kswapd 的触发灵敏度:
- 增大 min_free_kbytes → 水位线上移 → kswapd 更早启动(更“激进”回收)
- 减小 min_free_kbytes → 水位线下移 → kswapd 启动更晚(更“保守”,但可能增加 direct reclaim 风险)
查看当前值:cat /proc/sys/vm/min_free_kbytes
临时修改(重启失效):echo 2097152 > /proc/sys/vm/min_free_kbytes # 例如设为 2GB
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
永久生效:写入 /etc/sysctl.conf:vm.min_free_kbytes = 2097152
然后运行 sysctl -p
验证水位线是否已更新
修改后,可检查各 zone 实际水位(单位:pages):cat /proc/zoneinfo | grep -E "^(zone|pages_min|pages_low|pages_high)"
你会看到类似输出:
pages_min 10240<br> pages_low 13312<br> pages_high 16384
说明
pages_low 已随 min_free_kbytes 调整而变化,kswapd 将在空闲页 ≤ 13312 时被唤醒。不建议直接调 pages_low 的原因
内核不提供 /proc 接口直接写 pages_low,因为它是动态计算值,依赖于 zone 大小、内存节点拓扑和 min_free_kbytes。硬编码修改会破坏水位线之间的比例关系(通常 low ≈ min × 1.3,high ≈ min × 1.6),可能导致 kswapd 频繁唤醒或完全失效。
配套调优建议
仅调 min_free_kbytes 不足以解决所有内存压力问题,还需关注:
-
swappiness(
/proc/sys/vm/swappiness):控制回收匿名页倾向。值高(如 100)→ 更倾向 swap;值低(如 10)→ 优先回收文件页 -
vfs_cache_pressure(
/proc/sys/vm/vfs_cache_pressure):影响 dentry/inode 缓存回收强度。默认 100,调高加速回收,调低保留更多缓存 - 避免 drop_caches 误用:它清缓存但不改变水位线逻辑,不能替代合理配置










