2012-02-14 19 views
3

我正在运行并发测试,并且为了简洁起见,为每个欺骗性http请求定义了一个进程。它适用于多达64个请求/进程,但折叠到65.我在I5笔记本电脑上运行Window 7(64位),带有4GB Ram。一个node.js集群可以在64位Wintel PC上产生多少个子进程?

在运行测试时,我打开了一个Chrome浏览器(带有一些选项卡),我期望操作系统的公共系统进程也会有一些效果,但我对最低级别的node.js知之甚少了解问题所在。

例如,一篇文章表明,它是可能的一个2GB的64位Windows XP系统上运行超过8000点的过程:

http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx

但是,我遇到了相当显着的64个孩子的过程图。

任何想法?

+1

我认为这个问题几乎与“你可以在Windows 7(64bit)上运行多少个进程?”这对于SO来说并不是真正的主题。 – 2012-02-14 11:19:32

+1

有趣,但只是好奇,你想要做什么? Node的模型应该是单个Node进程应该能够处理大量的并发请求。您不需要为每个并发请求启动一个新进程。 – 2012-02-14 11:25:46

+0

是的,我知道。这只是一种懒惰的方式来测试一个并发条件(实质上,我有每个工作人员在启动时发出一个http请求,并将状态返回到命令行)。所以这个发现是偶然的。 :D @Dan D,我想我对node.js过程特别感兴趣,因为我提供的链接包含了关于这个主题的大量信息,但我想知道node.js工作人员是否在内存使用方面做了特定的事情/每个进程的分配。正如罗汉所说,这是我无论如何可以解决的一个问题。 – Charlie 2012-02-14 11:38:13

回答

11

好的节点是异步的,没有阻塞,只能由当前脚本完成,它可以完美地处理多个连接,所以这意味着对于高并发性,它会使用所有的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。

+1

100毫秒延迟服务'你好世界'?我带你回顾一下。我从我的dev-machine开始在2ms内为Redis提供一些缓存 – 2012-03-02 19:57:09

+0

嗯,我在我的笔记本电脑上得到它少于10ms ...服务器性能有点低( – 2012-03-05 01:44:54

+0

)如果我在同一台服务器上有两个应用程序,这些应用程序是集群? 想象一下,我有一个4核心cpu。我应该为每个应用程序设置2个内核还是仅使用每个应用程序中的最大内核? – 2016-12-09 14:47:48

相关问题