我正在运行并发测试,为了简洁起见,为每个欺骗性的http请求定义了一个进程。它适用于多达64个请求/进程,但折叠为65.我在I5笔记本电脑上运行Window 7(64位),带有4GB Ram。
在运行测试的同时我打开了Chrome(带有少量选项卡),我希望操作系统的常见系统进程也会产生一些影响,但我对于最低级别的node.js知之甚少。了解问题所在。
例如,有一篇文章建议在2GB 64位Windows XP系统上运行8000多个进程:
http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx
但我遇到的64个儿童过程数字相当显眼。
有什么想法吗?
答案 0 :(得分:11)
Well节点是异步的,没有阻塞,只有当前脚本才能完美地处理多个连接,这意味着在高并发性上,它会使用你所有的CPU,但每个进程只能使用一个核心,因为Node没有线程化。因此,从技术上讲,建议拥有的流程与核心一样多,每个流程一个核心。在这种情况下,在高并发性上,节点集群将使用所有CPU。如果你超过这个,你就是在浪费你的RAM,并在你的操作系统调度程序上投入额外的工作。除此之外,每个nodejs进程都有一个启动时间。因此,在运行时创建nodejs进程非常昂贵。
来自Node.JS docs:
这些子节点仍然是V8的全新实例。至少假设 每个新节点启动30ms,内存10mb。也就是说,你做不到 创造了数千个。
结论最好的做法是将CPU分配为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的延迟。