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 长期占满就是加内存的信号。