在使用 AWS EC2 进行项目部署时,尤其是构建大型项目(例如 React 和 Next.js 项目)时,内存不足可能成为一个瓶颈。常见的错误是构建过程中进程因为 内存不足(Out of Memory) 被系统自动终止。为了避免此类问题,增加 Swap 空间 是一个常见且有效的解决方案。

本文将详细介绍如何在 EC2 实例上创建 Swap 空间,解决内存不足的问题。

什么是 Swap?

Swap 是硬盘空间被用作虚拟内存的一个机制。当系统的物理内存(RAM)不足时,操作系统会将不活跃的数据从 RAM 移到 Swap 空间。这允许系统继续运行,但可能会导致性能下降,因为硬盘比 RAM 慢得多。

为何需要增加 Swap?

  • EC2 实例内存不足:例如,t2.micro 实例只有 1GB 内存,运行大型应用(如 npm run build)时,容易出现内存不足的情况。

  • 防止进程被杀:当内存不足时,Linux 系统会自动结束某些进程,可能会导致正在进行的构建任务(如 next build)被中断。

增加 Swap 空间,可以临时缓解内存不足的问题,让进程能够继续运行直到完成构建。

在 EC2 实例上创建 Swap 空间

步骤 1:创建 Swap 文件

首先,我们需要创建一个大小为 2GB 的 Swap 文件,作为虚拟内存。执行以下命令:

sudo fallocate -l 2G /swapfile

这将会在根目录下创建一个 2GB 的 swapfile

步骤 2:设置正确的权限

为了确保只有 root 用户能够访问此文件,我们需要设置文件权限:

sudo chmod 600 /swapfile

步骤 3:创建 Swap 空间

接下来,使用以下命令将文件格式化为 Swap 格式:

sudo mkswap /swapfile

步骤 4:启用 Swap

启用 Swap 文件,让系统开始使用它:

sudo swapon /swapfile

步骤 5:使 Swap 在重启后生效

为了确保在服务器重启后 Swap 仍然可用,我们需要将其添加到 /etc/fstab 文件中:

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

如何确认 Swap 是否成功启用?

可以使用以下命令检查 Swap 是否已经成功启用:

free -h

你应该看到类似以下的输出:

              total        used        free      shared  buff/cache   available
Mem:          1.9Gi       1.5Gi       150Mi       10Mi       250Mi       200Mi
Swap:         2.0Gi       500Mi       1.5Gi

如何监控 Swap 使用情况?

如果你希望实时监控 Swap 的使用情况,可以使用以下命令:

watch -n 1 free -h

这会每秒刷新一次内存使用情况,帮助你实时查看 Swap 空间的使用情况。

Swap会产生额外费用吗?

不会多花钱!Swap 只是利用 硬盘(EBS 存储) 作为虚拟内存,不会影响你的 EC2 费用,但可能会稍微增加 EBS 读写操作。

  • ❌ 不会额外收费:EC2 计费主要基于 实例类型,而不是内存使用情况。

  • ✅ 可能影响 EBS I/O 费用:如果你的 EBS 是 按 IOPS 计费的(如 io1/io2),大量使用 Swap 可能会增加少量存储读写费用。但如果你用的是 gp3 或 gp2(默认的通用 SSD),影响基本可以忽略。

💡 Swap 使用建议

  • Swap 推荐 2GB,如果你的 EC2 是 t2.micro(1GB RAM),创建 2GB Swap 足够应对 npm run build

  • Swap 只是临时应急,如果你的项目长期占用大量内存,建议升级到 2GB RAM(如 t3.small)

如果你的 npm run build 成功运行后,日常网站访问占用内存不高,Swap 只是构建时用,不会产生持续成本,所以可以放心用! 🚀

总结

增加 Swap 空间是解决 EC2 内存不足问题的简单而有效的方法,尤其适用于内存较小的实例(如 t2.micro)。通过创建 Swap 文件,我们可以临时增加系统的可用内存,防止因内存不足而导致的构建中断。尽管 Swap 可以缓解内存问题,但长远来看,如果你的项目越来越大,建议考虑 升级 EC2 实例 或优化项目内存使用。

通过本文提供的步骤,你可以轻松地在 EC2 上创建 Swap,并确保项目构建不会因为内存不足而中断。