Linux中vm.swappiness是动态属性吗?修改后仍用swap需重启吗?
关于vm.swappiness修改后仍有Swap占用的问题解答
首先明确说:完全不需要重启机器或者进程,你的修改已经立即生效了。下面给你拆解背后的逻辑,以及为什么还能看到Swap被占用:
先纠正一个常见误解:vm.swappiness不是“触发Swap的内存阈值”
你之前以为原设置60意味着内存用到100GB就开始交换,这个理解是错的。vm.swappiness其实是内核在内存回收时,倾向于使用Swap的权重值:
- 数值越低,内核越优先回收页缓存(比如磁盘缓存),尽量不碰Swap
- 数值越高,内核越愿意把不常用的匿名内存页(比如进程的堆、栈)换出到Swap
- 0表示内核除非物理内存完全耗尽,否则绝不使用Swap;100表示内核会尽可能多的使用Swap
所以它和你内存占用到多少百分比没有直接关联,这是很多人容易搞混的点。
为什么修改后Swap还是被占用?
你的echo 1 > /proc/sys/vm/swappiness(注意你命令里多了个尾斜杠,正确路径是/proc/sys/vm/swappiness)执行后,内核马上就会采用新的策略,但已经换出到Swap里的内存页,内核不会主动把它们换回来——除非这些页面被进程再次访问,或者物理内存有大量空闲时,内核才会逐步把Swap里的内容换回到物理内存。
除此之外,哪怕swappiness设为1,在某些场景下内核还是可能会用Swap:比如物理内存出现短暂的峰值,或者某些进程的内存页长期未被访问,内核还是会选择把它们换出去,只是概率比之前低很多。
如何验证修改是否生效?
执行cat /proc/sys/vm/swappiness,如果输出是1,说明你的设置已经生效了,不需要任何重启操作。
如果想主动清理已有的Swap占用(可选)
如果你确实想把Swap里的内容全部换回物理内存,可以执行:
swapoff -a && swapon -a
⚠️ 注意:执行这个命令前,必须确保你的物理内存有足够的空闲空间(要能容纳当前Swap里所有的数据),否则会导致系统内存不足,触发OOM(内存溢出)杀死进程。
总结
- 修改vm.swappiness是即时生效的,无需重启机器或进程
- 已存在的Swap占用不会自动消失,属于正常现象
- 后续内核会根据新的swappiness值,大幅降低使用Swap的倾向
内容的提问来源于stack exchange,提问作者ffff
相关产品推荐
相关产品推荐

