我注意到最近在heroku日志中发出警告说这对我来说似乎是个新手
web.1:检测到512 MB可用内存,每个进程512 MB限制(WEB_MEMORY)
web.1:推荐WEB_CONCURRENCY = 1
我做了一些研究并找到了这个cluster article,这是在nodejs中使用群集的“默认”方式,但它与包含这个新WEB_CONCURRENCY
环境的newly updated article完全矛盾每个dyno的变量和不同大小的建议(更小,顺便说一句)
答案 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将重新启动你的dyno。