512MB/1GB 低配 VPS 救星:Swap 权重、ZRAM 内存压缩与 SSD 损耗防护
2026-08-14 · DevCraft Studio
512MB/1GB 小内存 VPS 总在 OOM 崩溃和 SSD 磨损间两难?本文讲清 vm.swappiness 调优(降到 10-20)、ZRAM 内存压缩交换(2-3 倍扩容)、ZSWAP 与磁盘 Swap 的分层方案,并给出 SSD 写入寿命防护与一步步实操清单。
延伸阅读
更多相关攻略推荐:Ollama AI系列(2):VPS上的AI推理与API应用、Ollama AI系列(2):VPS上的AI推理与API应用、【CPU选型 01】搭载 AMD Ryzen 9950X 的 VPS、ARM / Ampere 席卷 VPS:性价比真香还是兼容陷阱?、Ollama AI系列(2):VPS上的AI推理与API应用。
一、512MB 的 VPS,开不开 Swap 是个两难
很多朋友第一次拿到 512MB 甚至 1GB 内存的便宜 VPS,跑个面板、装个 MySQL,没两天就发现半夜服务器连不上了。登录一看,SSH 卡死,top 里内存全红,最后往往是 OOM Killer(内存耗尽杀手)把关键进程干掉了。
这时候老鸟会告诉你:开个 Swap 交换分区啊。可问题来了——开吧,小内存机器本来磁盘 IO 就弱,Swap 一频繁读写,系统更卡,还加速 SSD 磨损;不开吧,一点内存峰值就 OOM 崩给你看。这不就是个两难吗?
其实这个问题在现代 Linux 内核里已经有相对优雅的解法了:调小 swappiness 让系统优先用物理内存,再用 ZRAM 在内存里开一块压缩交换区,必要时配合 ZSWAP 和磁盘 Swap 做分层。下面咱们一层层拆开讲。
二、先搞明白:Swap 到底是个啥,OOM Killer 又是谁
简单说,Swap 就是拿一部分磁盘空间假装成内存用。当物理内存不够时,Linux 会把不常用的内存页(page)挪到 Swap 里腾地方,这个过程叫换出(swap out)。等程序又要用到那块数据,再换回来(swap in)。
那 OOM Killer 是什么?当物理内存和 Swap 都快被吃光,内核发现再不动作整个系统就要死锁,就会启动一个叫 Out-Of-Memory Killer 的机制,按算法给每个进程打个分,把最该杀的那个进程咔嚓掉,用牺牲一个保住整体的方式续命。问题就出在:它未必杀的是你那个吃内存的坏进程,有时候把你 SSH、MySQL 一起带走,服务器就彻底失联了。
所以关键不是要不要 Swap,而是怎么让 Swap 又快又不伤盘,同时别让任何一个进程能吃掉全部内存。
三、第一招:调小 vm.swappiness,让系统别那么爱用 Swap
vm.swappiness 是内核的一个参数,取值范围 0 到 100,它决定了系统在内存还够用的时候,有多积极地把数据换到 Swap 上。值越高,越早换出;值越低,越舍不得换,优先赖在物理内存里。
大多数发行版(Ubuntu、Debian、CentOS 系)默认值都是 60。对桌面或大内存机器还行,但对我们这种小内存 VPS 就太激进了。通用建议:
- 普通服务器:调到 10-30,减少不必要的磁盘 IO;
- 数据库这种对延迟极敏感的服务跑在宿主机上:甚至可以压到 1-10;
- 注意:这不是越小越好,设成 0 代表除非内存彻底耗尽否则绝不用 Swap,极端情况下反而容易触发硬 OOM。
临时改(立即生效,重启失效):
- sudo sysctl vm.swappiness=10
永久改要编辑 /etc/sysctl.conf,加一行 vm.swappiness=10,再执行 sudo sysctl -p 生效。文件里你还可以顺手调 vm.vfs_cache_pressure,它的默认值也是 100,如果是文件服务器可以适当降到 50,让系统多留点目录和 inode 缓存,文件读写更快。
四、真正的黑科技:ZRAM,在内存里开一块压缩交换区
ZRAM 是 Linux 内核自带的一个模块,从内核 3.14 起就进主线了。它干的事很妙:不往慢吞吞的磁盘写,而是直接在物理内存里划出一块区域,把它当成一个块设备来用,数据写进去之前先实时压缩。
想想看,文本、未压缩的程序数据压缩率是很高的,通常能压到原来的 1/2 到 1/3。也就是说,你给 ZRAM 分 512MB 内存,实际能装下约 1GB 到 1.5GB 的交换数据——等于用一点 CPU 做压缩,换来了两三倍的逻辑内存容量。这正是小内存 VPS 的救星。
而且因为全程在内存里,读写延迟是纳秒级,跟磁盘 Swap 的毫秒级完全不是一个量级。你的 SSH 即使被迫 swap 一点东西,也不会卡到连不上。
典型步骤(以 Ubuntu 手动配置为例):
- 加载模块:sudo modprobe zram(可带 num_devices=1 指定设备数);
- 选压缩算法:echo lz4 > /sys/block/zram0/comp_algorithm(lz4 快、zstd 压得狠、lzo 兼容好);
- 设大小:echo 512M > /sys/block/zram0/disksize(建议不超过物理内存的 50%-100%);
- 格式化启用:sudo mkswap /dev/zram0 然后 sudo swapon /dev/zram0 -p 100(优先级 100 让它优先于磁盘 Swap)。
用 zramctl 和 swapon --show 可以看到它已经在线。Fedora、Pop!_OS 这类发行版甚至默认就帮你开好了 ZRAM。
五、ZSWAP 又是啥?它和 ZRAM 不是一回事
这俩名字像,容易混。一句话区分:ZRAM 本身就是 Swap 设备,是纯内存里的虚拟盘;ZSWAP 是磁盘 Swap 前面的压缩缓存层,它不替代磁盘 Swap,而是在数据真正落盘之前先拦一道,能压就压在内存里,压不动或内存池满了再写盘。
ZSWAP 从内核 3.11 就有了。适合的场景是:你本来就有磁盘 Swap 分区,但想减少它对 SSD 的写入。实测开启后,对磁盘的物理写入能断崖式下降,有测试显示可降九成以上,等于给 SSD 套了层护盾。
那它俩能一起用吗?能。很多系统同时开 ZRAM(主 Swap)+ ZSWAP(缓存)+ 少量磁盘 Swap(兜底),形成三层。不过对咱们小内存 VPS,最实用的组合通常是:ZRAM 当主力,留一点磁盘 Swap 当极端情况的保险。
六、分层方案:ZRAM 为主、磁盘 Swap 兜底的稳态配置
我的建议是这样搭:
- 第一层 ZRAM:分物理内存 50% 左右,压缩比约 2-3 倍,承担日常绝大部分交换,延迟极低;
- 第二层磁盘 Swap:分 512MB-1GB 的交换文件(权限 600),只在 ZRAM 不够、真正内存告急时顶上,平时基本不动它,所以 SSD 磨损极小;
- 可选 ZSWAP:如果你坚持保留磁盘 Swap,再开 ZSWAP 把这一层的写入再压一层。
关于 swappiness,这里有个进阶思路:传统服务器建议 10-20 是怕磁盘 Swap 慢;但当你以 ZRAM 为主 Swap 时,因为 ZRAM 也是内存,有人直接把 swappiness 设到 100,配合 vm.page-cluster=0(避免预读带来的多余解压开销),让冷数据更积极进 ZRAM。新手稳妥起见,从 10-20 起步,压测后再调。
七、SSD 磨损防护:别让 Swap 把你廉价 VPS 的盘写废了
便宜 VPS 用的多是 TLC/QLC 颗粒 SSD,有写入寿命上限(TBW)。频繁 Swap 写入确实会消耗。防护要点:
- 用 ZRAM 扛主力交换:压在内存里,根本不落盘,零磁盘写入,这是最彻底的护盘;
- 磁盘 Swap 平时几乎不用:靠上面的分层,它只在极端峰值才动,一年写不了几次;
- 监控写入:用 lsblk -D 看磁盘写入统计,或者用 smartctl -A /dev/sda 看磨损相关字段(具体字段名因厂商而异);
- 真要省心:很多云厂商的 VPS 其实是网络存储或分布式盘,物理磨损由厂商扛,但你仍该避免无意义的疯狂 Swap 影响性能。
八、实操清单:给你的 512MB/1GB VPS 动个手
以一台 1GB 内存的 Debian/Ubuntu VPS 为例,一条可行路径:
- 先看现状:free -h、swapon --show、cat /proc/sys/vm/swappiness;
- 调 swappiness:sudo sysctl vm.swappiness=10,并写进 /etc/sysctl.conf 持久化;
- 开 ZRAM:sudo apt install zram-tools(Debian 11+ 自带),sudo systemctl enable --now zramswap.service,再 swapon --show 确认 /dev/zram0 出现;
- 留兜底 Swap 文件:用 dd 出一个 512MB 文件,mkswap 后 swapon,写进 /etc/fstab,但优先级设低(比如 -p 1);
- 压测验证:用 stress-ng --vm 2 --vm-bytes 800M 模拟内存压力,观察 free -h、zramctl、dmesg 有没有异常 OOM。
验证稳定跑个一两天,用 htop 看各进程内存占用,没问题就大功告成。
十、真实踩坑实录:我见过的几个翻车现场
讲了这么多参数,不如直接看几个真事。第一个是我自己踩的:有台 1GB 的机器跑 Redis,我图省事把 swappiness 直接设成 0,心想反正有 ZRAM 顶着。结果某天 Redis 做了一次大 Key 删除,内核回收不过来,因为 swappiness 为 0 时系统极度不愿意换出,物理内存瞬间打满,OOM Killer 二话不说把 Redis 和旁边的 cron 一起干掉,监控直接断线。后来我乖乖把 swappiness 调回 15,再没出过事。教训就是:0 不是保险,是赌极端情况,平时别这么干。
第二个坑是 ZRAM 大小设太大。有朋友给 512MB 的机器分了 1GB 的 ZRAM,觉得越大越好。可 ZRAM 本身要占用物理内存来做压缩缓冲,分 1GB 等于先把 1GB 物理内存借走一半还多,反而让可用内存更紧张,系统照样卡。正确做法是 ZRAM 不超过物理内存的 75%,一般取 50% 最稳。压缩是要花 CPU 和内存本钱的,不是白送你容量,分太狠会搬石头砸自己脚。
第三个坑最隐蔽:有人开了磁盘 Swap 文件就以为高枕无忧,可那文件放在云厂商的网络盘上,一旦真的频繁 swap,网络盘的写入延迟比本地盘还高,系统卡得连 top 都刷不出来。你以为是网络出问题,其实是 swap 在背后疯狂读写拖慢了一切。这种机器更该以 ZRAM 为主,磁盘 Swap 只留个几百 MB 的象征性兜底,平时根本不碰它。
十一、内核版本与一键工具:不同系统怎么省心搞
手动改 sysfs 节点虽然能搞懂原理,但重启就丢,终究得变成服务。不同发行版其实都有现成工具,别什么事都自己敲 echo:
- Ubuntu 22.04 及更新版本:装 zram-tools 后系统自带 zramswap 服务,开箱即用;更现代的做法是用 systemd-zram-generator,写一个 /etc/systemd/zram-generator.conf,里面填 [zram0] 和 zram-size=512,重启后自动生效,连压缩算法都帮你选好;
- CentOS / Rocky / AlmaLinux:同样用 zram-generator,RHEL 系从 8 开始就推荐这套,配置方式和上面一模一样;
- 老旧内核(低于 3.14):很遗憾,ZRAM 用不了,只能老老实实建磁盘 Swap 文件,并把 swappiness 压到 10 左右,尽量减少写入,别指望压缩交换;
- 懒人方案:直接用发行版默认(Fedora、Pop!_OS 默认就开 ZRAM),或者搜一下社区的一键脚本,但脚本要看得懂再跑,别闭眼 curl 管道 bash,生产机器上瞎跑脚本比不开 Swap 还危险。
最后给你一张对比表(文字版,方便心里有数):纯磁盘 Swap 方案,优点是配置最简单、容量可以很大,缺点是慢、伤盘、容易卡;纯 ZRAM 方案,优点是极快、零磁盘写入、完全不伤盘,缺点是占用物理内存、容量受限于压缩比;ZRAM 加少量磁盘 Swap 的分层方案,优点是兼顾速度与兜底安全,缺点是要稍微调一下参数,多花两分钟。对我这种小内存 VPS 用户来说,第三档是最香的,记住一个原则:ZRAM 扛日常,磁盘 Swap 只当救命绳,平时别让它动。