给小鸡开大 Swap,真能变“杜甫”?聊聊服务器内存优化的坑与技巧
给小鸡开大 Swap,真能变“杜甫”?聊聊服务器内存优化的坑与技巧
最近在圈子里看到个很有意思的问题:“swap 开的越大,小鸡可以变杜甫嘛?” 看得我忍不住笑了。这大概是很多 VPS 爱好者(俗称“捡垃圾党”或 MJJ)共同的梦想:花几美元一年的钱,买到 8G、16G 内存的神仙体验。
实际上,为了榨干廉价 VPS 的每一滴性能,大家确实没少在 Swap 上动心思。今天咱们就抛开玄学,实实在在地聊聊 Swap 到底是个啥,开大了有没有用,以及如何正确地给小鸡“加内存”。
一、Swap 是什么?它是内存的“备胎”
内存(RAM)的读写速度远快于硬盘,Swap 交换分区本质上是使用硬盘空间,速度存在巨大差异。
简单来说,Swap(交换分区)就是硬盘上的一块空间,当物理内存(RAM)不够用时,系统就会把内存里暂时不用的数据“搬”到硬盘上,腾出地方给更活跃的程序用。
你可以把它理解为内存的“备胎”。有备胎总比没有好,至少在关键时刻(比如内存爆满时)能防止系统直接崩溃或被 OOM Killer 杀进程。
二、Swap 开越大,性能越好?那是错觉!
回到开头的问题:开大 Swap 能变杜甫(高性能)吗?答案显然是否定的。
原因很简单:硬盘的速度远慢于内存。
- DDR4 内存的读写速度通常是几万 MB/s;
- SATA SSD 大概是 500 MB/s;
- 即使是 NVMe SSD,也就几千 MB/s。
虽然有差距,但 SSD 的 Swap 还能接受。但如果你用的是那种廉价的云端存储,I/O 性能极差,一旦系统开始频繁读写 Swap,你的“小鸡”就会卡得像个幻灯片。这种现象叫“颠簸”,比直接崩了还难受。
通过 free -h 或 swapon --show 命令查看当前的内存和 Swap 使用情况。
所以,Swap 不能替代真正的内存。它只是保命用的,不是用来提升性能的。
三、既然不提升性能,为什么还要开?
既然 Swap 这么慢,那我们为什么还要折腾它?其实它在某些场景下非常有用:
- 防止崩溃: 你的脚本突然内存泄露,或者流量突增导致 PHP-FPM 进程暴涨,有 Swap 在,硬盘虽然慢点,但能撑住,不至于直接断连。
- 容纳“休眠”数据: 比如你开了个 MySQL,平时占用 1G 内存,但真正活跃的数据只有 200M。剩下的 800M 如果长时间没读写,系统会把它扔进 Swap。这样物理内存就被省下来给其他高频程序用了。
- 跑一些非实时任务: 比如跑个 Python 脚本处理大日志,内存正好差一点点。开了 Swap,虽然跑得慢点,但至少能跑完,不会报错。
四、如何正确地给 Linux 机器设置 Swap?
如果你决定要开 Swap,千万别瞎填一个 100G 的数字,那样既浪费空间又可能严重影响性能。这里有一套比较通用的设置方案。
1. 检查当前状态
先看看机器有没有 Swap,以及 Swap 的使用情况:
free -h
或者
swapon --show
2. 创建 Swap 文件
通常建议 Swap 的大小设置为物理内存的 1 到 2 倍。如果你的物理内存很小(比如 128M),可以适当开大一点(比如 1G 或 2G),因为你不得不频繁依赖它。
下面是创建一个 1G Swap 文件的命令(以 fallocate 为例,速度较快,不支持某些旧文件系统时可用 dd):
如果报错不支持,可以用 dd 命令(会慢一点):
dd if=/dev/zero of=/swapfile bs=1M count=1024 status=progress
3. 设置权限并启用
为了安全起见,Swap 文件只能被 root 读写:
chmod 600 /swapfile
然后把它格式化为 Swap:
mkswap /swapfile
立刻启用它:
swapon /swapfile
4. 设置 Swappiness(关键优化步骤)
这是很多新手容易忽略的点。vm.swappiness 参数控制着系统多么积极地使用 Swap。范围是 0-100。
- 值接近 100: 系统极其积极地使用 Swap,哪怕内存还有很多空余,也可能把数据扔进 Swap。这会导致性能下降。
- 值接近 0: 系统尽量避免使用 Swap,只有内存真的快不够用了才用。
对于大多数 VPS,建议设置为 10 或 15。这样既能保留 Swap 的保命功能,又不会让系统没事找事去读写硬盘。
查看当前值:
cat /proc/sys/vm/swappiness
临时修改(重启失效):
sysctl vm.swappiness=10
永久修改(编辑 /etc/sysctl.conf,添加或修改):
vm.swappiness=10
然后执行 sysctl -p 生效。
5. 开机自动挂载
别忘了编辑 /etc/fstab 文件,把 Swap 文件加进去,否则重启后 Swap 就没了。
在文件末尾添加:
/swapfile none swap sw 0 0
五、终极建议:什么时候千万别玩 Swap?
虽然 Swap 能救命,但下面这些情况,你要慎重:
- 数据库服务器: 如果你的小鸡主要跑 MySQL 或 Redis,内存至关重要。数据库一旦走硬盘 Swap,性能会呈指数级下降,严重拖垮整个业务。这种情况下,要么加钱买内存,要么做读写分离,别指望 Swap。
- 高 I/O 限制的廉价 VPS: 比如某些商家的“超卖”严重型号,硬盘 I/O 本来就被限速在 1MB/s 甚至更低。开 Swap 简直是自废武功。
- 使用 Zram 的情况: 现在有很多机器支持 Zram(压缩内存),把 CPU 算力换内存空间。在开启了 Zram 的机器上再开大文件 Swap,收益其实很低,不如把 Zram 调优一下。
总结
给小鸡开大 Swap,并不能让它变成高性能的“杜甫”,但它确实能让你的“杜甫(内存不足)”变成“李白(虽然穷点,但能写诗)”。
核心思想是: Swap 是最后的防线,而不是常规武器。合理设置大小,调低 Swappiness,让它在关键时刻挺身而出,这才是正确的优化姿势。希望这篇干货能帮大家省下几刀内存费!

评论已关闭