小内存服务器上 Next.js 构建失败?用 Swap 解决

1GB 内存 VPS 上 Next.js 构建 OOM 崩溃?不用升级套餐——创建 Swap 交换文件用磁盘换内存。本文讲解 fallocate/mkswap/swapon 完整步骤与持久化配置。

最佳实践
Web 构建模块与工具协作插画

Next.js 构建期的内存峰值超过小 VPS 物理内存时进程被 OOM Killer 杀掉(报错含糊甚至无报错)。解法:用磁盘创建 Swap 交换空间兜底——fallocate -l 2G /swapfile → chmod 600 → mkswap → swapon,再写入 /etc/fstab 持久化,构建即可通过。

问题根源:构建是内存怪兽

next build 要做全量编译、类型检查、页面预渲染,内存峰值轻松突破 1GB。小内存 VPS 上的表现很迷惑:CPU 拉满、机器卡死、SSH 都连不上,最后进程悄无声息地被杀——没有明确错误信息,因为凶手是内核的 OOM Killer,不是 Next.js。

先确认是否为内存不足。Swap 可能缓解宿主机内存压力,但会增加磁盘 I/O;容器配额、插件死锁、网络请求或构建错误仍需分别排查。

Swap:用磁盘换内存

Swap 是把磁盘空间当"溢出内存"用:内存不足时,内核把不活跃的内存页换到磁盘,给活跃任务腾地方。代价是换入换出慢(磁盘比内存慢几个数量级)——但对"构建这种一次性峰值"场景,慢点没关系,能跑完就行。

完整实施步骤

# 1. 检查现有 swap(多数 VPS 默认为空)
sudo swapon --show

# 2. 确认磁盘空间充足
df -h

# 3. 创建 2GB swap 文件
sudo fallocate -l 2G /swapfile

# 4. 收紧权限(安全必须)
sudo chmod 600 /swapfile

# 5. 格式化为 swap 区
sudo mkswap /swapfile

# 6. 启用
sudo swapon /swapfile

# 7. 验证
sudo swapon --show
free -h

free -h 的 Swap 行显示 2.0Gi 即生效。再跑 npm run build,构建会明显变慢(磁盘换页)但能完整跑完。

持久化:重启不丢

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

什么时候不该用 Swap

Swap 是"构建期峰值"和"突发尖刺"的创可贴,不是常态内存不足的替代品:如果你的应用运行时长期依赖 Swap(kswapd 持续繁忙、响应明显变慢),说明内存真的不够,该升级了。判断方法:vmstat 1 观察 si/so(换入换出)是否持续非零。

区分构建 OOM 与运行时内存问题

增加 Swap 之前,先从构建日志、宿主机内存和容器退出原因确认是否真的发生 OOM。将这些数据采集到观测云后,可对照构建阶段的资源峰值与平时的应用负载。构建进程和线上服务应使用不同标签;内核 OOM 或容器事件也需要相应日志与事件采集配置,不能仅凭内存使用率推断某次构建被 OOM Killer 杀死。

接入文档:进程监控 · 容器与 Kubernetes 采集 · 日志采集。

常见问题(FAQ)

Q:Swap 设多大合适?

按构建峰值、宿主机内存、容器限制和磁盘预算评估。本文的 2GB 仅为命令示例,不能保证适用于所有项目。

Q:fallocate 失败怎么办?

某些文件系统(如老的 ext4 配置、btrfs)不支持 fallocate,改用 dd:sudo dd if=/dev/zero of=/swapfile bs=1M count=2048,效果相同只是创建慢些。

Q:能不能干脆在本地构建再传产物?

完全可以且更专业:CI 或本地构建 .next 产物,服务器只跑 next start(运行时内存需求远低于构建)。Swap 方案适合"没有 CI 的小项目"快速止血。


参考文档

本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台