好的节点是异步的,没有阻塞,只能由当前脚本完成,它可以完美地处理多个连接,所以这意味着对于高并发性,它会使用所有的CPU,但每个进程只能使用一个内核,因为Node不是线程的。所以从技术上讲,推荐拥有与核心一样多的进程,每个进程都有一个核心。在这种情况下,高度并发的节点集群将使用所有的CPU。如果你不止这些,你就会浪费你的内存,并在你的操作系统调度程序中增加额外的工作。除此之外,每个nodejs进程都有启动时间。所以在运行时创建一个nodejs进程是非常昂贵的。
从Node.js的文档:
这些子节点仍是V8的全新的实例。假设至少有 为每个新节点启动30毫秒和10MB内存。也就是说,你不能创建数千个这样的数字。
结论做的最好的事情是到餐桌,就像你的CPU内核的数量,这就是:
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('death', function(worker) {
console.log('worker ' + worker.pid + ' died');
cluster.fork();
});
} else {
// Worker processes have a http server.
http.Server(function(req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
}
实际上,我们有一个生产服务器,这样做,可拍摄约1000并发,并且服务Hello世界的延迟小于10ms。
我认为这个问题几乎与“你可以在Windows 7(64bit)上运行多少个进程?”这对于SO来说并不是真正的主题。 – 2012-02-14 11:19:32
有趣,但只是好奇,你想要做什么? Node的模型应该是单个Node进程应该能够处理大量的并发请求。您不需要为每个并发请求启动一个新进程。 – 2012-02-14 11:25:46
是的,我知道。这只是一种懒惰的方式来测试一个并发条件(实质上,我有每个工作人员在启动时发出一个http请求,并将状态返回到命令行)。所以这个发现是偶然的。 :D @Dan D,我想我对node.js过程特别感兴趣,因为我提供的链接包含了关于这个主题的大量信息,但我想知道node.js工作人员是否在内存使用方面做了特定的事情/每个进程的分配。正如罗汉所说,这是我无论如何可以解决的一个问题。 – Charlie 2012-02-14 11:38:13