【问题标题】:How to properly scale nodejs app on heroku using clusters如何使用集群在 heroku 上正确扩展 nodejs 应用程序
【发布时间】:2015-04-21 09:55:54
【问题描述】:

我最近在 heroku 日志中注意到一个警告,说这对我来说似乎是新的

web.1:检测到 512 MB 可用内存,每个进程限制为 512 MB (WEB_MEMORY)

web.1:推荐 WEB_CONCURRENCY=1

我做了一些研究,发现了 cluster article,这是在 nodejs 中使用集群的“默认”方式,但它与包含这个新的 WEB_CONCURRENCY 环境变量且大小不同的 newly updated article 完全矛盾对每个测功机的建议(顺便说一句,要小得多)

【问题讨论】:

    标签: node.js heroku


    【解决方案1】:

    第一个链接是从 2014 年 7 月开始的,曾经是推荐的做事方式。然而,Heroku 的 dynos 非常以内存为中心,当使用每个 CPU 的最大内核数时(如第一篇文章所述),很容易超过分配的内存限额。

    相反,新的建议是分析您的应用并确定每个进程需要多少内存。将环境变量WEB_MEMORY 设置为此值,然后将您的集群代码更新为以下内容:

    var cluster = require('cluster');
    var numWorkers = process.env.WEB_CONCURRENCY;
    
    if(cluster.isMaster) {
      // Master process: fork our child processes
      for (var i = 0; i < numWorkers; i++) {
        cluster.fork();
      }
    
      // Respawn any child processes that die
      cluster.on('exit', function() {
        cluster.fork();
      });
    
    } else {
      // Child process, put app initialisation code here.
    }
    

    通过使用WEB_MEMORY 变量,Heroku 可以根据您正在运行的测功机的大小生成WEB_CONCURRENCY 值,从而分叉正确数量的进程,以确保您的应用程序不会超过内存限额。

    顺便说一句,如果您确实超出了内存分配(对于 1x dyno,每个 dyno 512MB),则交换空间将用于超出部分。这会减慢您的应用程序,导致请求时间增加,并且通常会导致缓慢。如果你超过了内存使用量(大约是分配的三倍),Heroku 将重新启动你的测功机。

    【讨论】:

    • 你的意思是,如果我有一个非常节省内存的应用程序,我可能每个测功机有超过 4 个集群?或者我仍然有 CPU 的数量作为约束(因为在新文档中没有提到 CPUs available 的数量)?
    • 它确实取决于您正在编写的应用程序的类型。确实,如果您正在编写一个内存效率高但 CPU 密集型应用程序,那么您可能需要使用不同的技术。但我猜测大多数(严重的)利用集群的节点应用程序将受到 Heroku dyno 上的 RAM 限制而不是 CPU 限制。
    • 但关键是如果 Heroku 现在允许我在不使用太多内存的情况下在常规测功机中分叉超过 4 个集群,你知道我是否可以这样做吗?
    • 你总是能够分叉超过 4 个工人。 Heroku 过去建议你分叉多少 CPU 内核,但现在他们建议改为使用内存。
    • 我很想知道为什么这被否决了 - 请告诉我,我可以相应地更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 2012-02-06
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2018-06-07
    • 2014-11-25
    • 2012-06-12
    相关资源
    最近更新 更多