如何使用集群在heroku上正确缩放nodejs app

时间:2015-02-19 21:02:33

标签: node.js heroku

我注意到最近在heroku日志中发出警告说这对我来说似乎是个新手

  

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

     

web.1:推荐WEB_CONCURRENCY = 1

我做了一些研究并找到了这个cluster article,这是在nodejs中使用群集的“默认”方式,但它与包含这个新WEB_CONCURRENCY环境的newly updated article完全矛盾每个dyno的变量和不同大小的建议(更小,顺便说一句)

1 个答案:

答案 0 :(得分:7)

第一个链接是从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可以根据您正在运行的dyno的大小生成WEB_CONCURRENCY值,从而分叉正确数量的进程以确保您的应用不会超过记忆限额。

顺便说一下,如果你确实超过了内存分配(1x dyno每个dyno 512MB),交换空间将用于超额。这会降低您的应用程序速度,导致请求时间增加,并且通常会导致缓慢。如果超出内存使用量(大约是分配的三倍),Heroku将重新启动你的d​​yno。