linux中vm.swappiness是控制内核换出匿名内存倾向的权重参数,非开关;临时修改用sudo sysctl vm.swappiness=1或echo 1 | sudo tee /proc/sys/vm/swappiness,立即生效但重启失效;永久生效需新建/etc/sysctl.d/99-swappiness.conf写入vm.swappiness=1并执行sudo sysctl --system加载。

Linux 中调整 vm.swappiness 就是调节内核“多早、多愿意”把进程的匿名内存(比如堆、栈)换出到 swap。它不是开关,而是权重——值越低,越坚持用物理内存;越高,越倾向提前腾内存到磁盘。
怎么临时改,立刻生效
适合测试效果,重启后失效:
- 运行
sudo sysctl vm.swappiness=1 - 或等效写法:
echo 1 | sudo tee /proc/sys/vm/swappiness - 验证是否成功:
cat /proc/sys/vm/swappiness应输出1
注意:输入超出 0–100 范围(比如 150)不会报错,但内核会静默忽略。
怎么永久生效,不被系统忽略
现代 Linux(RHEL 8+/Ubuntu 20.04+)默认用 sysctl.d 机制,直接改 /etc/sysctl.conf 或只用 sysctl -p 容易漏加载:
- 新建配置文件:
sudo tee /etc/sysctl.d/99-swappiness.conf - 重载全部配置:
sudo sysctl --system - 确认生效:
sysctl vm.swappiness返回1,且systemctl list-units | grep sysctl显示 active
不同场景该设多少
没有万能值,关键看用途和硬件:
-
数据库(PostgreSQL/MySQL)、Redis、Java 应用:设为
1。避免延迟突增,又保留 OOM 前最后缓冲 -
桌面或开发机(Chrome + IDE + Docker):
10–30较平衡,减少后台进程被换出影响前台 -
Kubernetes 宿主机:若容器启用了
memory.swap.max,宿主机建议 ≤10,避免策略冲突 -
小内存设备(≤2GB RAM):可设
80,但必须配足够 swap(≥RAM×1.5),否则易 OOM
常见误区和验证方法
别光看 free -h 的 Swap used 是不是 0——空闲时没压力,swap 就不会动:
- 真实状态要看:
cat /proc/meminfo | grep -E "MemAvailable|SwapTotal|SwapFree" - 观察换页活动:
watch -n 1 'grep -E "pgpgout|pgpgin" /proc/vmstat',pgpgout持续接近 0 才说明 swap 基本未触发 -
vm.swappiness=0不等于禁用 swap:内存真耗尽时,5.8+ 内核仍可能 fallback 到 swap 或触发 OOM











