swap 要不要开:多大合适,swappiness 怎么调
1G 内存的 VPS 动不动就 OOM?小够讲 swap:要不要开、开多大、swappiness 怎么调,swapfile 三条命令搞定,小内存 VPS 的救命稻草。
我是小够。小内存 VPS(1G/2G)最常见的死法:内存一吃紧,OOM killer 直接把你的进程杀掉,网站 502,服务全停。加内存要加钱,但有个免费的缓冲垫:swap。
swap 是什么
简单说,swap 是硬盘上划出来的一块空间,内存不够时系统把不常用的内存页临时挪到硬盘上。速度比内存慢得多,但有总比没有强——至少不会直接 OOM 被杀。
要不要开
小够的建议:
- 1G/2G 内存:开,这是刚需
- 4G 内存:可以开,大小随缘,有备无患
- 8G 以上:开不开都行,一般用不上
注意:swap 是救命稻草,不是性能方案。如果系统长期大量用 swap,说明内存真的不够了,该升级配置,别硬扛。
三条命令搞定 swapfile
# 1. 创建 2G 的 swapfile
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
# 2. 格式化并启用
sudo mkswap /swapfile
sudo swapon /swapfile
# 3. 开机自动挂载,写进 fstab
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
开多大?经验值:内存 1G 配 2G swap,2G 配 2-4G,4G 配 4G。别配太大,swap 不是越大越好。
swappiness 怎么调
swappiness 决定系统多积极地用 swap,0-100,默认 60。小够的建议:
- 建站/应用服务器:设 10,尽量用内存,swap 只做最后的保险
- 内存实在紧张:保持默认 60 也行
# 临时生效
sudo sysctl vm.swappiness=10
# 永久生效
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
怎么看 swap 在工作
free -h # 看 Swap 那一行用了多少
swapon --show # 看 swapfile 状态
如果 swap 长期占用超过一半,说明内存吃紧了,该考虑升级,而不是调大 swap。
小够的结论
swap 是小内存 VPS 的标配,2G swapfile 五分钟配好,关键时刻能救命。但记住它的定位:保险丝,不是发动机。频繁触发 swap 就是系统在告诉你:该加内存了。
swapfile vs swap 分区
两种实现方式:
- swapfile:普通文件,灵活,随时建随时删,小够推荐
- swap 分区:安装系统时划分,改大小要动分区,麻烦
新装机没分 swap 分区?没关系,swapfile 完全够用,性能没区别。
zram:内存压缩,另一种思路
除了硬盘 swap,还有 zram:在内存里划一块压缩区,内存不够时先压缩存放。速度比硬盘 swap 快得多,适合内存小但 CPU 有富余的机器。
# Ubuntu/Debian 装 zram-tools
sudo apt install zram-tools
zram 和 swapfile 可以共存:先 zram 顶着,实在不够再落盘。小内存 VPS 上这个组合很香。
swappiness 不同场景怎么设
| 场景 | 建议值 | 理由 |
|---|---|---|
| 建站/应用服务器 | 10 | 尽量用内存,swap 只做保险 |
| 内存吃紧的老机器 | 60(默认) | 让系统积极换出不活跃内存 |
| 数据库服务器 | 1-10 | 数据库最怕 swap 抖动,尽量别换 |
数据库对 swap 特别敏感:MySQL 被换出去再换回来,查询直接卡死。跑数据库的机器,swappiness 设低,内存留够。
关闭 swap
sudo swapoff /swapfile
# 从 /etc/fstab 删掉那行
# 删文件
sudo rm /swapfile
常见问题
Q:swap 会损耗 SSD 寿命吗? A:正常用 swap 的写入量很小,不用担心。只有"长期大量换页"那种才伤盘——但那种情况你更该担心的是内存不够,而不是盘的寿命。
Q:云商家说"我们不建议开 swap",听吗? A:有些商家模板默认没开 swap,是因为他们的超售模型怕你把 IO 打爆。但对你自己而言,小内存机器开 swap 利大于弊。IO 监控看着点就行。
Q:swap 开了,OOM 还是发生了?
A:swap 满了 + 内存满了,OOM 照样来。swap 是缓冲,不是无限续命。看 free -h,swap 长期占满就是加内存的信号。