5 min read

yarn install 导致服务器死机?一文搞定内存耗尽问题

yarn install 导致服务器死机?一文搞定内存耗尽问题

问题描述

在服务器上执行 yarn install 导致服务器死机,这是一个非常常见的问题,尤其是在内存较小的服务器上。

核心原因:内存耗尽

当执行 yarn install 时,Yarn 需要做以下几件非常消耗内存的事情:

1. 构建依赖关系树

解析 package.yarn.lock 文件,计算出所有依赖包及其正确版本,形成一个复杂的依赖关系图。项目越大,依赖越多,这个过程越吃内存。

2. 下载和解压包

下载 tarball 包到缓存,然后解压到 node_modules 目录。解压大量文件需要内存。

3. 构建原生模块

如果依赖包中包含需要编译的原生模块(例如,通过 node-gyp),编译过程(尤其是 C++ 编译)是极其消耗 CPU 和内存的。

4. Node.js 本身的限制

在默认情况下,32位系统的Node.js内存限制约1.4GB,64位系统约1.7GB。对于大型项目,这个限制很容易被突破。

当物理内存被占满后,系统会开始使用 Swap 空间(虚拟内存)。如果 Swap 空间也不足,或者 Swap 的频繁读写导致 I/O 阻塞,操作系统内核的 OOM Killer 会被迫介入,强制终止占用内存最多的进程(很可能就是 Node 或 Yarn)来保护系统,这时你就会看到进程被杀死,或者整个系统失去响应(死机)。

解决方案(按推荐顺序)

方案1:增加 Swap 空间(最简单、最有效的临时方案)

Swap 空间相当于一块硬盘空间,被当作内存来使用。增加 Swap 可以给 Yarn 更多的"喘息"空间,避免物理内存耗尽。

检查当前 Swap 空间:

free -h

创建 Swap 文件(例如,增加 4GB):

# 1. 创建一个 4GB 的空文件
sudo dd if=/dev/zero of=/swapfile bs=1024 count=4M

# 2. 设置正确的权限
sudo chmod 600 /swapfile

# 3. 将其设置为 Swap 空间
sudo mkswap /swapfile

# 4. 启用 Swap 文件
sudo swapon /swapfile

# 5. (可选) 为了永久生效,编辑 /etc/fstab,在文件末尾添加一行
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

完成后再运行 free -h,你会看到可用的 Swap 空间变大了。然后再次尝试 yarn install

方案2:优化 Yarn 的安装过程

使用 --network-concurrency--memory-limit

这些标志可以限制 Yarn 的资源使用。

# 限制并行网络请求数为 1,减少瞬时压力
yarn install --network-concurrency 1

# 明确设置内存限制(例如 1GB)
yarn install --memory-limit 1024

# 可以组合使用
yarn install --network-concurrency 1 --memory-limit 1024

使用 --ignore-scripts(谨慎使用):

这个命令会跳过 package. 中定义的任何 postinstall 等脚本。这对于避免编译那些耗内存的原生模块非常有效。

yarn install --ignore-scripts

风险:如果某个依赖包必须通过 postinstall 脚本进行构建才能正常工作,那么跳过它可能会导致运行时错误。你可以在安装完成后,再单独为需要的包运行 yarn rebuild

方案3:升级服务器配置(根本解决方案)

如果项目确实很大,最直接的办法是增加服务器的物理内存。例如,将 1GB 内存的服务器升级到 2GB 或 4GB。对于云服务器(如 AWS EC2, 阿里云 ECS),这通常很容易做到。

方案4:在本地安装,然后上传 node_modules

如果服务器资源实在有限,且项目变动不频繁,可以考虑:

  1. 在你的本地开发机(内存足够)上运行 yarn install
  2. 将整个 node_modules 目录打包压缩。
  3. 上传压缩包到服务器,解压到项目根目录。

这种方法虽然"笨",但能绕过服务器资源不足的问题。

# 本地
tar -czf node_modules.tar.gz node_modules
# 上传到服务器后
tar -xzf node_modules.tar.gz

方案5:使用 Docker(进阶方案)

在 Dockerfile 中构建你的应用,可以利用 Docker 构建时的资源限制功能,并且构建环境与宿主机隔离。你可以在一个资源更充足的机器上构建 Docker 镜像,然后将镜像推送到服务器运行。

总结与推荐步骤

  1. 首选尝试:立即为服务器 增加 Swap 空间(例如 4GB),这是最快、最有效的缓解方法。
  2. 同时进行:在安装命令后加上资源限制参数:yarn install --network-concurrency 1 --memory-limit 1024
  3. 如果仍不行:尝试使用 yarn install --ignore-scripts。如果安装成功,但应用运行出错,再针对出错的包单独处理。
  4. 长期规划:如果项目持续发展,升级服务器内存是最根本的解决方案。
  5. 临时救急:考虑在本地安装,上传 node_modules

通过以上方法,你应该能解决服务器因 yarn install 而死机的问题。