kubeSphere部署vue项目因为内存被杀死
报错原因
公司使用的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
从提供的日志文件分析,进程被杀死的原因可以归结为以下几点:
- 进程被强制终止:日志中有明显的
Killed 标记,这通常意味着系统主动终止了该进程。随后,在整个流水线流程的最后,有一个错误代码137,这是典型的 "out of memory" (OOM) 情况下系统返回的错误代码。这表示系统检测到内存使用超过限制而强制终止了进程。 - 内存不足:从日志内容来看,在执行
npm install 过程中,可能由于需要安装的依赖较多,内存消耗迅速增加,最终导致系统内存不足,触发 OOM 机制,杀死了该进程。 - 资源配置:日志中可以看到,容器的资源配置为
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 ci 是一个npm命令,用于在项目中安装依赖。它与常规的 npm install 命令有所不同,主要用于自动化环境,如持续集成(CI)系统。以下是 npm ci 的一些关键特性:
- 快速安装:
npm ci 会使用package-lock.json 或npm-shrinkwrap.json 文件来安装依赖,这通常比npm install 更快,因为它不需要重新计算依赖树。 - 一致性:由于
npm ci 严格遵循package-lock.json 文件,它可以确保在不同环境中安装相同版本的依赖,从而提高了构建的一致性。 - 不修改
package-lock.json:与npm install 不同,npm ci 不会修改package-lock.json 文件。这意味着它不会尝试解决依赖冲突,而是严格按照锁文件中指定的版本进行安装。 - 错误处理:如果
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时,都会自动应用这个内存限制。