小内存 VPS(Virtual Private Server,虚拟专用服务器)上,1GB 甚至 512MB 的内存到底够不够用?不够用时,OOM(Out of Memory,内存耗尽)就会找上门。本文通过在一台 1GB 内存的 VPS 上做 OOM 复现测试,帮你解决”要不要开 Swap(交换分区)”这个老问题:用开启与关闭 Swap 前后进程存活率、磁盘 IO(Input/Output,输入输出)开销和响应延迟的实测对比,指导你如何配置 Swap 才能在”浪费磁盘”和”进程被杀”之间取得平衡。如果你也曾被 MySQL(一种开源关系型数据库)半夜无故停止、PHP-FPM(PHP 进程管理器)频繁 502 这类问题困扰,这篇实测记录值得看完。
先搞懂 OOM Killer 的工作逻辑
Linux 内核在物理内存和 Swap 都接近耗尽时,会启动 OOM Killer(内存耗尽终止器),按照内核计算的 OOM 评分从高到低挑选”最该死”的进程直接杀掉。评分规则并不只看内存占用,还会综合进程运行时长、nice 值等权重,所以被杀的经常是 MySQL、Java 这类常驻大内存进程,而不是刚启动的元凶脚本。这也是为什么很多人排查时发现”死的是数据库,搞事的是采集脚本”。
理解这个机制后,Swap 的角色就清楚了:它是在 OOM Killer 动手之前的最后一道缓冲。系统通过内核参数 vm.swappiness(默认值 60)控制倾向程度,数值越高越愿意把不活跃内存页换出到磁盘。
实测环境与压力方法
测试机为一台 1 核 CPU、1GB 内存、25GB SSD(Solid State Drive,固态硬盘)的 KVM(基于内核的虚拟机)架构 VPS,系统 Debian 12,内核 6.1,运行 WordPress + MySQL 8.0 + PHP-FPM 的标准建站环境,空闲时内存占用约 620MB。
压力方式用两个脚本叠加:一是 stress-ng --vm 2 --vm-bytes 900M --timeout 600s 制造内存挤占,二是用 ab -n 2000 -c 20 对本地 WordPress 首页压测模拟真实访问。每组测试重复 3 次取平均,通过 dmesg | grep -i "out of memory" 统计 OOM 事件,用 vmstat 1 采样 si/so(换入换出页数)观察 Swap 活动,iostat -x 1 记录磁盘利用率。关闭 Swap 组执行 swapoff -a 后确认 free -m 中 Swap 行为 0 才开始计时;开启组设置为 2GB Swap 文件、swappiness=10。
实测数据:Swap 换来了什么,又付出了什么

三组重复测试的数据相当一致。关闭 Swap 组中,stress-ng 启动后约 40 秒物理内存即告耗尽,MySQL 在 3 次测试中全部被 OOM Killer 杀掉,压测请求失败率约 37%,站点平均响应时间从 340ms 恶化到超时。开启 2GB Swap 组中,MySQL 在 3 次测试里均存活,只有 stress-ng 自身进程在 Swap 用尽后被杀,压测失败率降到 6%,但代价是磁盘利用率长时间维持在 85% 以上,vmstat 采样到 si 持续在 4000-9000 KB/s 区间波动,页面平均响应时间上升到 900ms 左右——变慢了,但没有挂。
另一组值得注意的数字是恢复速度:关闭 Swap 组在 OOM 后 MySQL 服务需要手工重启,而开启 Swap 组压力解除后 5 分钟内性能就回到基线水平,Swap 占用从峰值 1.6GB 自然回落到约 300MB。这说明 Swap 不仅救了进程,也省了一次半夜人工介入。

不同场景下的取舍建议
实测结论可以按内存规格分成三档。1GB 及以下:建议开,Swap 设为物理内存的 1-2 倍(1-2GB),swappiness=10;这点磁盘换进程存活率非常划算,尤其是跑数据库或面板的机器。2-4GB:建议开但可以保守,Swap 取 1GB 左右即可,重点是留一道兜底而不是常态使用;如果磁盘本身是普通 HDD(Hard Disk Drive,机械硬盘),把 swappiness 压到 5 以下,避免频繁换页拖垮 IO。8GB 及以上:业务内存规划合理时,Swap 的实际作用有限,设 1GB 作保险即可,不需要追求大 Swap。
有两个实操细节容易踩坑。其一是 Swap 文件必须建在 SSD 且空间充足的分区上,创建命令是 fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile,别忘了写入 /etc/fstab 让重启后生效。其二是把 vm.swappiness=10 写进 /etc/sysctl.conf 并执行 sysctl -p,很多教程漏掉这步,导致 Swap 配了但内核行为没变。另外,如果你的 VPS 用的是 OpenVZ(一种容器虚拟化架构)或部分 LXC(Linux 容器)方案,宿主通常不提供独立 Swap,这条路径直接不成立,选购时就要留意虚拟化类型——相关虚拟化架构差异可以参考站内的虚拟主机 vs VPS 全维度对比。
别让 Swap 掩盖真正的内存问题
Swap 是兜底方案,不是扩容手段。如果一台 1GB VPS 的 Swap 长期占用超过 50%,说明业务负载已经超出这台机器的合理范围,正确的方向是优化应用(比如给 MySQL 限制 innodb_buffer_pool_size、给 PHP-FPM 降 pm.max_children)或者直接升配,而不是继续加大 Swap 把磁盘也拖垮。监控上可以用一条简单的告警规则覆盖两个指标:free -m 的可用内存低于总量 10%,或 vmstat 的 si 持续大于 2000 KB/s 超过 5 分钟,任一触发就该去查内存大户了,排查思路可以结合站内的美国 VPS 速度影响因素与优化指南一起看。
选购阶段同样值得把这个因素算进去。同样是 1GB 内存,不同虚拟化架构、不同磁盘介质的表现差异可能比 Swap 开不开还大,选机器时可以对照站内的美国 VPS 服务器速度影响因素与优化指南和站内选购指标类文章逐项核对。以 Hostease 的 KVM 方案为例,其 VPS 默认提供独立 Swap 支持和 SSD 存储,与本文实测环境一致,小内存套餐也能按上面的命令自行调整 Swap。
总结与行动建议
回到标题的问题:服务器 Swap 分区要不要开?实测给出的答案是——小内存 VPS 建议开,用 1-2GB 磁盘空间换取进程存活率和故障恢复能力,这笔账是划算的;中大型内存机器按需保留 1GB 兜底即可。如果你需要一套可以直接落地的动作,可以按这个顺序做:先在测试机上建好 Swap 文件并写入 fstab,再把 swappiness 调到 10 并持久化,最后给可用内存和换页速率配上告警。配置完成后,建议用 stress-ng 复现一次本文的压力场景,亲眼确认 MySQL 不再被 OOM Killer 杀掉,这比任何教程都有说服力。
延伸阅读推荐 Linux 内核官方文档中关于 vm.swappiness 与内存管理的说明,里面解释了换页行为背后的内核逻辑。




