2核2G的云服务器总卡死?加内存前,先花5分钟开个 Swap

前两年我买过一台 99 块一年的 2核2G 小服务器,就挂在上面跑 WordPress。

平时好好的,偶尔莫名其妙就 502,过一会儿自己又好了。翻日志查到 Out of memory 那一行,才知道是被内核直接砍了进程。

当时我的第一反应是"内存不够,加钱升级"。后来有人提醒我一句:你这机器 Swap 开着没?

我一查,swapon --show 是空的。系统装完就没给你开。

开完之后,那台机器又安安稳稳跑了大半年,中间还是 99 块续的费。

所以今天把这事从头讲一遍:Swap 到底该不该开,怎么开,以及哪些人劝你别开。

Swap 是个啥

Linux 会用硬盘上的一块空间,来假装自己还有内存。

物理内存不够用了,系统就把一些"暂时不动"的内存页挪到硬盘上,把 RAM 腾给正在干活的程序。

一句话:Swap 是内存的后备箱,不是内存本身。

这个区别很重要,后面聊坑的时候还会回来。

 开 Swap 的三个实在好处
打开网易新闻 查看精彩图片
开 Swap 的三个实在好处

1. 防的不只是"慢",还有"死"

内存真不够的时候,没有 Swap 的机器会直接触发 OOM Killer——内核自己动手,把你的进程一枪毙掉。表现出来就是网站瞬间 502,你连救的机会都没有。

有 Swap 的话,系统会先"喘一口气",把不常用的页挪出去顶着,给你留出排查的时间。

慢一点,和直接死掉,是两码事。

2. 挡住"假性内存不足"

这个坑挺阴的。像 Java、Node.js 这类程序,启动时会先申请一大块虚拟内存,虽然实际用不了那么多,但系统要是预留不出来,它就直接启动失败。

你明明看 free -h 还有空闲内存,服务就是起不来。给个 Swap 兜底就顺了。

3. 成本基本等于零

Swap 用的是系统盘的空间。你那个 40G 的系统盘,可能用了不到 10G,剩下 30G 白放着。

从里面划 1~2G 出来,几乎不花什么成本——反正这个价位的机器本来就是按整台计费的。

那为什么有人说"千万别开"

这话不是没道理,主要是三点。

硬盘真的比内存慢太多。 内存是 GB/s 级别,SSD 云盘顺序写也就 100~200MB/s,随机读写更差。一旦系统频繁往 Swap 上倒腾数据,你会明显感觉到卡,SSH 敲个命令都一顿一顿的。

有些机型根本不让你开。 部分轻量服务器和抢占式实例,出于性能隔离的考虑默认禁掉了 Swap。你强行开,可能表面开了、实际不生效,或者过一会儿被系统自己关掉。

最怕的是拿它掩盖问题。 服务卡,你去开 Swap;卡的原因其实是代码内存泄漏、数据库没调优、插件堆太多。Swap 一开,卡感变轻了,真正的问题反而被藏起来了。

治标不治本,拖久了更难受。

谁建已开

建议开:

  • • 内存 ≤2G 的入门机,比如 2核2G 跑 WordPress

  • • 开发测试环境,跑 Docker、编译代码这种偶尔吃内存的活儿

  • • 你还没摸清自己的程序到底要吃多少内存

别指望它救场:

  • • 高并发生产环境,比如电商、API 网关——该加内存就加内存

  • • 大内存的 NVMe 实例,开 Swap 纯属占地方

  • • 磁盘 I/O 本来就是瓶颈的机器,再加 Swap 是雪上加霜

一句话:Swap 适合救急,不适合扛活。

5 分钟开一个 2G Swap

Ubuntu / CentOS 都能用,逐行复制就行:

# 创建 2GB 的 Swap 文件
sudo fallocate -l 2G /swapfile

# 设置权限(必须是 600,别人不该读到这块空间)
sudo chmod 600 /swapfile

# 格式化成 Swap
sudo mkswap /swapfile

# 启用
sudo swapon /swapfile

# 写入 fstab,重启后自动生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

完事验证一下:

swapon --show
free -h

看到 Swap 那一行有数字,就成了。

但这里有个原文没交代的前提,我要单独拎出来说:

上面第一条 fallocate 命令,在 ext4、XFS 上一般没问题,但 btrfs 文件系统明确不支持这样创建 swapfile,强行来有可能把文件系统搞出问题。

如果你不确定自己的根分区是什么格式,跑一下 df -T /。看到 btrfs,就把第一条换成:

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress

慢一点,但稳。

另外,如果是 RHEL / CentOS 系并且开着 SELinux,加一步:

sudo restorecon -v /swapfile

不然可能重启之后 Swap 起不来。

三个容易踩的坑 坑一:以为开了 Swap 就等于扩容内存

不是。Swap 只是把"死亡时间"往后推,它不给你加内存。

看 free -h,如果 Swap 使用率长期超过 50%,说明这台机器是真的该升级了,别再指望它。

坑二:小内存机器上开一个巨大的 Swap

2G 内存配 4G Swap,听着很安全,实际上系统一旦开始频繁交换,会卡到几乎没法用。

小内存机器的正确姿势是:小 Swap(1~2G)+ 监控告警 + 老实优化程序。

坑三:装完就不管 swappiness

Linux 默认 vm.swappiness=60,意思是"挺早就开始用 Swap"。对跑网站的机器来说太积极了,本该留在内存里的热数据也被挪走了。

调低一点:

sudo sysctl vm.swappiness=10
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

顺便纠一个流传很广的说法:别设成 0。内核 3.5 之后,swappiness=0 不是"尽量少用",而是"除非内存告急否则完全不用",结果反而更容易撞上 OOM。服务器设 1 比设 0 稳当。

至于调到多少合适,大致分档:数据库类 110,应用服务器 1030,普通网站 10~20,够用了。

zram 可能比 Swap 更香

这块是我想额外补的,因为这几年情况变了。

打开网易新闻 查看精彩图片

传统的 Swap 是往硬盘上写,慢。而 zram 是在内存里做一块压缩过的块设备——数据不出内存,只是被压缩了。

用 zstd 压缩,大致能压到 3:1。也就是说划出来 1G 的 zram,实际能装进两三个 G 的内容。延迟是微秒级,而且完全不碰硬盘,没有写入磨损。

对你那台 2核2G 的小机器来说,这往往比传统 Swap 更划算。

现在 Fedora、Pop!_OS 这类发行版已经默认给开了。Ubuntu 上装一下就有:

sudo apt install zram-tools

装完重启,zramctl 能看到设备就说明生效了。

那什么时候还是得靠传统 Swap?大概是这几种:内存大到几十 G、要休眠、或者数据本身已经压缩过(图片、视频这种,压不动)。这时候 zram 帮不上什么忙,直接用硬盘 Swap 更简单。

两者也能一起用:zram 当第一层,磁盘 Swap 兜底。

星哥的云上小店

上面说的 99 元 2核2G 活动机,走官方渠道就能买,我这边放了两个入口:

  • • 阿里云: y.xgss.net/a

  • • 腾讯云: y.xgss.net/tx

复制这一段粘贴到浏览器地址栏打开就行(微信里点了跳不过去)。走这个入口价格跟你自己上官网买是一样的,不会多花一分钱,算是顺手支持一下我继续折腾。

买之前先看清楚配置和地域,2核2G 拿来练手、跑博客绰绰有余,真上生产还是老老实实加内存。

最后

Swap 这个东西,你指望它提升性能,它会让你失望。

但它能让你在服务快要崩的那一刻,多出半小时去查日志,而不是半夜被用户的投诉电话叫醒。

装完 Swap,记得配个内存和 Swap 使用率的告警。告警不响,说明你的机器配置是够的;告警一响,那就是真该加内存了。

一句话收尾:它不是让机器变快的药,是防止你摔死的安全网。