如何使用群集风格(使用更多的核心)?

我正在尝试使用cluster库启动sails.js应用程序,以便它可以产生更多的进程来使用我的机器的所有内核,但不知何故,这里使用express的方法会失败。

 var cluster = require('cluster'), numCPUs = require('os').cpus().length; // create the server if (cluster.isMaster) { for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', function(worker, code, signal) { console.log('worker %d died (%s). restarting...', worker.process.pid, signal || code); cluster.fork(); }); } else { // Start sails and pass it command line arguments require('sails').lift(require('optimist').argv); console.log("Sails forked"); } 

之后,我通常通过运行它:

 $ sails lift 

但是当我为这个性能testing运行Apache平台时,我得到了相同的结果。 任何帮助? 我错过了什么吗?

编辑

即使当我把console.logcluster.fork如果部分,那么我不会得到输出。

最后,我已经使用了pm2模块 ,就像在一个sails问题中提到的一样https://github.com/balderdashy/sails/issues/170

首先应该安装它:

 $ npm install -g pm2 

然后运行脚本:

 $ pm2 start app.js -i max 

那么你可以用以下方式来监控它

 $ pm2 monit 

在这里输入图像描述

或列出过程:

 $ pm2 l 

在这里输入图像描述

试试这个,看看你的输出是什么(很简单的代码只是为了debugging):

 var cluster = require('cluster'), numCPUs = require('os').cpus().length; console.log('global '+numCPUs); // create the server if (cluster.isMaster) { console.log('master '+numCPUs); for (var i = 0; i < numCPUs; i++) { console.log('this is for CPU '+i); cluster.fork(); console.log('just for giggles '+i); } } else { console.log('This is a worker!'); } 

…大概你应该得到所有这些调用的输出。 如果一切都如预期的那样,开始将代码一点一点地加回去,看它是否中断,在哪里,或者是否开始工作。

如果你错过了一些输出或者某些意想不到的事情,而且你仍然不知道下一步该做什么,请在这里发表你的结果。

以下是来自我的开发者服务器的预期输出示例:

 global 8 master 8 this is for CPU 0 just for giggles 0 this is for CPU 1 just for giggles 1 this is for CPU 2 just for giggles 2 this is for CPU 3 just for giggles 3 this is for CPU 4 just for giggles 4 this is for CPU 5 just for giggles 5 this is for CPU 6 just for giggles 6 this is for CPU 7 just for giggles 7 global 8 This is a worker! global 8 This is a worker! global 8 This is a worker! global 8 global 8 This is a worker! This is a worker! global 8 This is a worker! global 8 This is a worker! global 8 This is a worker! 

…它展示了一些有趣的事情,实际上,如果你不太熟悉集群的API或者只是想看看它的实际操作,特别是cluster.fork()是一个asynchronous调用(即它不会执行,直到下一个循环,因此,为什么你不看到工人们宣布自己,直到他们已经分叉),但是这个孩子的过程,一旦产生,将并行执行(因此,双倍的global 8This is a worker!在中间的消息)。