kubeSphere部署vue项目因为内存被杀死

409 阅读4分钟

kubeSphere部署vue项目因为内存被杀死

image

报错原因

公司使用的kubeSphere​自动部署项目,在安装依赖的时候被杀死进程,报错如下:

+ export SASS_BINARY_SITE=https://npmmirror.com/mirrors/node-sass
+ export CHROMEDRIVER_LEGACY_CDNURL=https://npmmirror.com/mirrors/chromedriver
+ npm install --registry=https://xxxxx.com/repository/npm-group/ --unsafe-perm=true --allow-root --loglevel verbose
npm verb cli /usr/local/bin/node /usr/local/bin/npm
npm info using npm@8.19.4
npm info using node@v16.20.2
npm timing npm:load:whichnode Completed in 0ms
npm timing config:load:defaults Completed in 2ms
npm timing config:load:file:/usr/local/lib/node_modules/npm/npmrc Completed in 1ms
npm timing config:load:builtin Completed in 1ms
npm timing config:load:cli Completed in 53ms
npm timing config:load:env Completed in 1ms
npm timing config:load:file:/home/jenkins/agent/workspace/aiwei-vue-ibaby_release-test-new/.npmrc Completed in 1ms
npm timing config:load:project Completed in 17ms
npm timing config:load:file:/root/.npmrc Completed in 1ms
npm timing config:load:user Completed in 1ms
npm timing config:load:file:/usr/local/etc/npmrc Completed in 3ms
npm timing config:load:global Completed in 3ms
npm timing config:load:validate Completed in 1ms
npm timing config:load:credentials Completed in 1ms
npm timing config:load:setEnvs Completed in 1ms
npm timing config:load Completed in 81ms
npm timing npm:load:configload Completed in 81ms
npm timing npm:load:mkdirpcache Completed in 2ms
npm timing npm:load:mkdirplogs Completed in 0ms
npm verb title npm install
npm verb argv "install" "--registry" "https://nexus.aiwei365.com/repository/npm-group/" "--unsafe-perm" "true" "--allow-root" "--loglevel" "verbose"
npm timing npm:load:setTitle Completed in 2ms
npm timing config:load:flatten Completed in 3ms
npm timing npm:load:display Completed in 7ms
npm verb logfile logs-max:10 dir:/root/.npm/_logs
npm verb logfile /root/.npm/_logs/2024-08-09T02_07_54_460Z-debug-0.log
npm timing npm:load:logFile Completed in 7ms
npm timing npm:load:timers Completed in 0ms
npm timing npm:load:configScope Completed in 0ms
npm timing npm:load Completed in 101ms
npm timing arborist:ctor Completed in 1ms
npm timing idealTree:init Completed in 1549ms
npm timing idealTree:userRequests Completed in 0ms
npm timing idealTree:#root Completed in 0ms
npm timing idealTree:buildDeps Completed in 2ms
npm timing idealTree:fixDepFlags Completed in 1ms
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'pkcs7@0.2.3',
npm WARN EBADENGINE   required: { node: '^0.10', npm: '^1.4.6' },
npm WARN EBADENGINE   current: { node: 'v16.20.2', npm: '8.19.4' }
npm WARN EBADENGINE }
npm timing idealTree Completed in 1577ms
npm timing reify:loadTrees Completed in 1593ms
npm timing reify:diffTrees Completed in 30ms
npm timing reify:retireShallow Completed in 1ms
Killed
script returned exit code 137

Jenkinsfile​安装依赖如下

export SASS_BINARY_SITE=https://npmmirror.com/mirrors/node-sass
export CHROMEDRIVER_LEGACY_CDNURL=https://npmmirror.com/mirrors/chromedriver
npm install --registry=https://XXXX/repository/npm-group/ --unsafe-perm=true --allow-root --loglevel verbose 
echo $(date +"%Y-%m-%d %H:%M:%S") ${APPLICATION_NAME_EN}/branch/${BRANCH_NAME} npm install >> /app/npm_install.log

从提供的日志文件分析,进程被杀死的原因可以归结为以下几点:

  1. 进程被强制终止:日志中有明显的 Killed​ 标记,这通常意味着系统主动终止了该进程。随后,在整个流水线流程的最后,有一个错误代码 137​,这是典型的 "out of memory" (OOM) 情况下系统返回的错误代码。这表示系统检测到内存使用超过限制而强制终止了进程。
  2. 内存不足:从日志内容来看,在执行 npm install​ 过程中,可能由于需要安装的依赖较多,内存消耗迅速增加,最终导致系统内存不足,触发 OOM 机制,杀死了该进程。
  3. 资源配置:日志中可以看到,容器的资源配置为 limits: cpu: "4", memory: "8Gi"​,而实际在运行 npm install​ 时,可能这个内存限制不足以支撑整个依赖安装过程。如果依赖数量庞大,尤其是大文件或编译密集型包的安装,会占用大量内存。

解决方案建议

  • 增加内存分配:如果可能,增加容器的内存限制。例如将内存从 8Gi​ 提高到 16Gi​ 或更高,具体数值可以根据实际需要进行调整。
  • 优化依赖管理:检查 package.json​ 文件,移除不必要的依赖或尝试使用 npm ci​ 而不是 npm install​,以减少内存使用。
  • 分步骤安装:将 npm install​ 拆分为多个步骤,或者尝试使用 npm​ 的 --max-old-space-size​ 参数来增加 Node.js 进程的最大内存使用限制。

解决

得知杀死原因和处理方式,那么我们修改安装方式并设置内存限制

修改Jenkinsfile​文件

export SASS_BINARY_SITE=https://npmmirror.com/mirrors/node-sass
export CHROMEDRIVER_LEGACY_CDNURL=https://npmmirror.com/mirrors/chromedriver
npm ci --registry=https://XXXX/repository/npm-group/ --unsafe-perm=true --allow-root --loglevel verbose --max-old-space-size=4096
echo $(date +"%Y-%m-%d %H:%M:%S") ${APPLICATION_NAME_EN}/branch/${BRANCH_NAME} npm install >> /app/npm_install.log

知识点

npm ci

npm.nodejs.cn/cli/v9/comm…

npm ci​ 是一个npm命令,用于在项目中安装依赖。它与常规的 npm install​ 命令有所不同,主要用于自动化环境,如持续集成(CI)系统。以下是 npm ci​ 的一些关键特性:

  1. 快速安装npm ci​ 会使用 package-lock.json​ 或 npm-shrinkwrap.json​ 文件来安装依赖,这通常比 npm install​ 更快,因为它不需要重新计算依赖树。
  2. 一致性:由于 npm ci​ 严格遵循 package-lock.json​ 文件,它可以确保在不同环境中安装相同版本的依赖,从而提高了构建的一致性。
  3. 不修改 package-lock.json:与 npm install​ 不同,npm ci​ 不会修改 package-lock.json​ 文件。这意味着它不会尝试解决依赖冲突,而是严格按照锁文件中指定的版本进行安装。
  4. 错误处理:如果 npm ci​ 遇到错误,它会立即停止,不会尝试修复问题。这使得它在自动化环境中更加可靠。

总的来说,npm ci​ 是一个适用于自动化环境的工具,它提供了一种更快、更一致的方式来安装依赖。在本地开发环境中,通常使用 npm install​,但在CI/CD流程中,npm ci​ 是更好的选择。

--max-old-space-size

--max-old-space-size​ 是一个Node.js的命令行选项,用于限制V8引擎的最大堆内存使用量。当你运行一个Node.js应用程序时,如果遇到内存不足的问题,可以通过设置这个选项来增加可用的内存限制。

如果你在安装大型依赖或者运行需要大量内存的npm脚本时遇到内存不足的问题,可以在运行npm命令时设置这个选项。例如:

npm install --max-old-space-size=4096

或者,如果你经常需要更大的内存限制,可以在你的环境变量中设置这个选项。在Windows系统中,可以在系统的环境变量中添加如下设置:

SET NODE_OPTIONS=--max-old-space-size=4096

在Linux或macOS系统中,可以在你的shell配置文件(如 .bashrc​ 或 .bash_profile​)中添加:

export NODE_OPTIONS=--max-old-space-size=4096

这样,每次启动Node.js或npm时,都会自动应用这个内存限制。