swap非必需但配置不当易致oom或性能雪崩;应先用free -h和swapon -s评估内存压力,再据场景选择文件方式创建、合理设swappiness并写入/etc/fstab持久化。

Swap不是必须的,但没配好会导致OOM崩溃或性能雪崩——关键不在“加不加”,而在“怎么加、加多少、怎么控”。
如何判断当前系统是否需要Swap
别一上来就建文件。先看真实压力:free -h 和 swapon -s 是基础入口。如果 Mem 行的 available 长期低于 500MB,且 swap 行全是 0,说明物理内存已绷紧,Swap是缓冲刚需;但如果 available 常驻 2GB+,而 swappiness 又设得很高(比如默认 60),反而可能把冷页无谓换出,拖慢响应。
常见误判点:
- 看到
swap used不为 0 就以为“正在用 Swap”——其实可能是内核预分配或短暂缓存,cat /proc/swaps看priority和type更准 - 云服务器(尤其使用普通云盘)盲目开 Swap:I/O 延迟高,
swapon后反而top里%wa暴涨,服务变卡
创建Swap文件比分区更安全、更常用
除非你有整块闲置磁盘且追求极致性能,否则优先用文件方式。它不依赖分区表、可动态删改、路径可控。
实操要点:
- 用
fallocate替代dd:更快、不写零(sudo fallocate -l 4G /swapfile),但需确保文件系统支持(ext4/xfs 支持,btrfs 不推荐) - 必须设权限:
sudo chmod 600 /swapfile,否则mkswap会报Permission denied -
mkswap /swapfile后别跳过验证:运行sudo swapon --show=NAME,TYPE,SIZE,USED,PRIORITY,确认类型是file、大小匹配、USED初始为 0
/etc/fstab 中的 swap 条目容易写错
写进 /etc/fstab 是为了让 Swap 开机生效,但格式错一个字符就会导致启动失败或 swapon -a 报错。
正确写法(仅一行):
/swapfile none swap sw 0 0
关键细节:
-
none是固定占位符,不能写成swap或路径 -
sw是挂载选项,不是defaults——后者在某些发行版(如较新 Ubuntu)下会导致swapon失败 - 末尾两个
0:第一个表示是否备份(dump),第二个表示是否 fsck(swap 不需要) - 写完务必执行
sudo swapon -a测试,再sudo systemctl daemon-reload(部分 systemd 系统要求)
vm.swappiness 控制的是“倾向性”,不是开关
很多人设了 vm.swappiness=10 还是看到 Swap 被大量使用,是因为误解了它的作用:它不禁止换出,只调节内核在内存压力下选择换出冷页 vs 回收 page cache 的权重。
典型场景建议值:
- 数据库服务器(MySQL/PostgreSQL):
vm.swappiness=1—— 宁可 OOM killer 杀进程,也不让查询因 Swap I/O 卡住 - Web 应用服务器(Nginx + PHP/Python):
vm.swappiness=10~30—— 平衡突发流量与稳定性 - 开发测试机或内存严重不足的旧设备:
vm.swappiness=60(默认)或略高,但要监控si/so字段(vmstat 1)是否持续非零
设置后立即生效:echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf && sudo sysctl -p。注意:该值不影响已换出的页,只影响后续决策。











