我正在运行并发测试,为了简洁起见,为每个欺骗的 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个子进程的数字相当引人注目。
有什么想法吗?
Node 是异步的,没有阻塞,仅由当前脚本执行,它可以完美处理多个连接,这意味着在高并发情况下,它会占用你所有的 CPU,但每个进程只能使用一个核心,因为 Node没有螺纹。因此,从技术上讲,建议拥有与核心一样多的进程,每个进程一个核心。在这种情况下,在高并发情况下,节点集群将使用所有 CPU。如果超出这个范围,就会浪费 RAM 并在操作系统调度程序上投入额外的工作。除此之外,每个nodejs进程都有一个启动时间。所以在运行时创建一个nodejs进程是非常昂贵的。
来自 Node.JS 文档:
这些子节点仍然是 V8 的全新实例。假设至少 每个新节点的启动时间为 30 毫秒,内存为 10 MB。也就是说,你不能 创建数千个。
结论最好的办法是根据 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('exit', function(worker) {
console.log('worker ' + worker.process.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 world 提供不到 10 毫秒的延迟。