为测试自研页面回收算法,如何禁用Linux内核默认page frame reclamation与swapping?
禁用Linux内核默认页面回收与交换机制的方法
1. 快速禁用swap功能
- 立即停止所有swap操作:执行
swapoff -a,这会让内核停止往swap分区读写数据,但默认的页面回收逻辑仍会运行——毕竟内存不足时内核还是会尝试回收文件页这类可释放的内存。 - 永久禁用swap:把
/etc/fstab里所有swap相关的配置行注释掉,避免系统启动时自动挂载swap分区。
2. 内核编译层面彻底禁用默认回收逻辑
如果要完全替换默认的页面回收机制,需要修改内核源码后重新编译:
- 关闭后台回收守护进程:找到
mm/vmscan.c中的kswapd_run()调用,直接注释掉,负责后台页面回收的kswapd就不会启动了。 - 关闭swap相关编译选项:在内核配置中关掉
CONFIG_SWAP,这会直接移除所有swap相关代码,同时砍掉依赖swap的那部分页面回收逻辑;另外CONFIG_ZSWAP、CONFIG_ZRAM这类swap增强功能也需要一并关闭。 - 移除紧急回收触发点:注释掉
try_to_free_pages()函数的调用,这是内核在内存不足时触发直接回收的入口,注释后默认回收机制就不会被触发。
3. 运行时调参限制默认回收行为
虽然没法完全禁用,但可以通过sysctl参数大幅降低默认回收的触发概率:
- 设置
vm.swappiness=0:让内核尽可能避免使用swap,但文件页的回收操作仍会正常进行。 - 调大
vm.min_free_kbytes:把这个参数设为一个接近系统总内存一半的数值(不能超过一半,否则系统可能无法启动),让内核始终保留大量空闲内存,从而避免触发页面回收。
注意事项
- 禁用默认回收后,你的自研算法必须能完全接管内存管理,否则系统在内存不足时会直接触发OOM崩溃。
- 修改内核源码时要注意依赖关系,部分子系统可能会调用默认的回收函数,需要做好兼容处理,避免编译失败或运行时panic。
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

