【问题标题】:AWS elastic beanstalk deploy fails with ENOMEM errorAWS 弹性 beanstalk 部署失败并出现 ENOMEM 错误
【发布时间】:2017-09-18 21:59:28
【问题描述】:

您的 AWS Elastic Beanstalk 部署失败: - 间歇性 - 没有真正明显的原因

第 1 步:检查明显的日志

/var/log/eb-activity.log

  Running npm install:  /opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/npm
  Setting npm config jobs to 1
  npm config jobs set to 1
  Running npm with --production flag
  Failed to run npm install. Snapshot logs for more details.
  Traceback (most recent call last):
    File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 695, in <module>
      main()
    File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 677, in main
      node_version_manager.run_npm_install(options.app_path)
    File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 136, in run_npm_install
      self.npm_install(bin_path, self.config_manager.get_container_config('app_staging_dir'))
    File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 180, in npm_install
      raise e
  subprocess.CalledProcessError: Command '['/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/npm', '--production', 'install']' returned non-zero exit status 1 (ElasticBeanstalk::ExternalInvocationError)
caused by: + /opt/elasticbeanstalk/containerfiles/ebnode.py --action npm-install

第 2 步:谷歌搜索相应的快照日志文件...

/var/log/nodejs/npm-debug.log

58089 verbose stack Error: spawn ENOMEM
58089 verbose stack     at exports._errnoException (util.js:1022:11)
58089 verbose stack     at ChildProcess.spawn (internal/child_process.js:313:11)
58089 verbose stack     at exports.spawn (child_process.js:380:9)
58089 verbose stack     at spawn (/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/lib/node_modules/npm/lib/utils/spawn.js:21:13)
58089 verbose stack     at runCmd_ (/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/lib/node_modules/npm/lib/utils/lifecycle.js:247:14)
58089 verbose stack     at /opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/lib/node_modules/npm/lib/utils/lifecycle.js:211:7
58089 verbose stack     at _combinedTickCallback (internal/process/next_tick.js:67:7)
58089 verbose stack     at process._tickCallback (internal/process/next_tick.js:98:9)
58090 verbose cwd /tmp/deployment/application
58091 error Linux 4.4.44-39.55.amzn1.x86_64
58092 error argv "/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/node" "/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/npm" "--production" "install"
58093 error node v6.10.0
58094 error npm  v3.10.10
58095 error code ENOMEM
58096 error errno ENOMEM
58097 error syscall spawn
58098 error spawn ENOMEM

第 3 步:显而易见的选项...

  • 使用更大的实例就可以了...

  • 不要修复,再试一次

    • 再次部署就可以了...

    • 克隆环境并运行...

    • 重建环境,它就可以工作了......

  • 觉得自己很肮脏和错误

【问题讨论】:

    标签: node.js amazon-web-services out-of-memory amazon-elastic-beanstalk enomem


    【解决方案1】:

    我们很少会在开发上使用这个数量;但是,ElasticBeanstalk 通过派生的工作人员并行化了部分构建过程。这意味着在 SETUP 期间,对于较大的包,可能会出现内存不足而导致操作失败的情况。

    这正是发生在我身上的事情!我的 node.js 服务器在我的 dev ec2 t2-micro 上运行良好,但是当我在弹性 beanstalk(也带有 t2-micro)上部署暂存环境时出现此错误,将 eb 实例更改为 t2-small 就可以了。

    【讨论】:

    • 可以通过升级到 npm v5 来解决:“大包的下载流进出磁盘。npm 现在能够安装 any 大小的包而不运行内存不足。对发布它们的支持待定(由于注册表限制)。来源:blog.npmjs.org/post/161081169345/v500
    • @rmharrison 也许您应该发表评论而不是作为可能的答案?对我来说,这似乎是最简单的解决方案(尽管它增加了部署过程的额外延迟)
    • 仅供参考:我已升级到 npm@5 但还需要在 .npmrc 中设置 unsafe-perm=true 以防止在 node-gyp 运行期间出现 EACCES 错误,请参阅 stackoverflow.com/questions/46001516/…
    • @rmharrison 不幸的是,npm v5.4.2 没有帮助
    【解决方案2】:

    TL;DR

    您的实例(在我的情况下为 t2.micro)内存不足,因为实例启动是并行的。

    破解解决方案:在实例上配置 SWAP 空间并重试

    一次性登录实例时...

    sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
    sudo /sbin/mkswap /var/swap.1
    sudo chmod 600 /var/swap.1
    sudo /sbin/swapon /var/swap.1
    

    来自/更多细节:How do you add swap to an EC2 instance?

    在部署过程中,我们使用了一些 SWAP,但没有崩溃

    Mem:   1019116k total,   840880k used,   178236k free,    15064k buffers
    Swap:  1048572k total,    12540k used,  1036032k free,    62440k cached
    

    实际分辨率

    更大的实例

    • 虽然可以通过 EBS 扩展存储,但实例具有固定的 CPU 和 RAM,AWS source
    • 花钱,这些只是开发实例,内存只是启动期间的问题

    在 ElasticBeanStalk 中自动配置交换

    • 应该是.ebextensions/
    • 未决问题:云形成风格还是部署/重启挂钩?

    加入“无服务器”潮流

    • API Gateway + Lambda + Friends 的承诺是我们不应该处理这个问题。
    • 对于云原生微服务,您“够高”吗?它们是否适合您的问题,而像 SOA 这样陈旧/过时的东西就足够了。
    • 一旦采用云优先,就很难恢复到本地,这是某些人的要求。

    少用臃肿的包

    • 有时您会被遗留问题困扰
    • 可能由必要的传递或子依赖引起。它在哪里结束...分解其他人的图书馆?

    说明

    快速谷歌显示ENOMEM 是内存不足错误。 t2.micro 实例只有 1 GB 的 RAM。

    我们很少会在开发上使用这个数量;但是,ElasticBeanstalk 通过派生的工作人员并行化了部分构建过程。这意味着在SETUP期间,对于较大的包,可能会出现内存不足而导致操作失败的情况。

    使用free -m我们可以看到...

    开始(大量可用内存)

                 total       used       free     shared    buffers     cached
    Mem:       1019116     609672     409444        144      45448     240064
    -/+ buffers/cache:     324160     694956
    Swap:            0          0          0
    

    在下一次滴答时内存不足)

    Mem:       1019116     947232      71884        144      11544      81280
    -/+ buffers/cache:     854408     164708
    Swap:            0          0          0
    

    部署过程中止

                 total       used       free     shared    buffers     cached
    Mem:       1019116     411892     607224        144      13000      95460
    -/+ buffers/cache:     303432     715684
    Swap:            0          0          0
    

    【讨论】:

    • 当 npm 本身仅使用 300mb 时发生在我身上。
    • 对 Stack Overflow 的建议:让这样的人显示他们的比特币钱包地址,这样我就可以在他们为我节省时间和金钱时为他们提供帮助。
    • 我用我正在使用的 .ebextensions 文件创建了一个要点(似乎正在工作):gist.github.com/nsacerdote/8e2fae3e1dd936d6a6d6d906b92b7460
    猜你喜欢
    • 2016-05-01
    • 2014-06-28
    • 2015-12-15
    • 2017-01-29
    • 1970-01-01
    • 2016-08-06
    • 2014-03-22
    • 2023-03-15
    • 2012-01-10
    相关资源
    最近更新 更多