windows - node.js 集群可以在 64 位 Wintel PC 上生成多少个子进程?

标签 windows node.js concurrency 64-bit process

我正在运行并发测试,为了简洁起见,为每个欺骗性 http 请求定义了一个进程。它适用于多达 64 个请求/进程,但在 65 个时折叠。我在 I5 笔记本电脑上运行 Window 7(64 位),内存为 4GB。

在运行测试时,我打开了一个 Chrome(带有几个选项卡),我希望操作系统的常见系统进程也会产生一些影响,但我对最低级别的 node.js 知之甚少了解问题所在。

例如,一篇文章建议在 2GB 64 位 Windows XP 系统上运行超过 8000 个进程是可能的:

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

但我遇到的 64 个子进程数字相当显眼。

有什么想法吗?

最佳答案

node是异步的,没有阻塞,只有当前脚本,它可以完美处理多个连接,也就是说在高并发时,它会使用你所有的CPU,但每个进程只能使用一个核心,因为 Node 没有线程化。因此,从技术上讲,建议拥有与核心一样多的进程,每个进程一个核心。在这种情况下,在高并发情况下,Node 集群将使用所有 CPU。如果你做的不止于此,那么你就是在浪费你的 RAM 并在你的操作系统调度程序上增加额外的工作。除此之外,每个 nodejs 进程都有一个启动时间。所以在运行时创建一个nodejs进程是非常昂贵的。

来自 Node.JS 文档:

These child Nodes are still whole new instances of V8. Assume at least 30ms startup and 10mb memory for each new Node. That is, you cannot create many thousands of them.

结论最好的办法是按照你的 CPU 核心数进行 fork ,即:

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 毫秒的延迟。

关于windows - node.js 集群可以在 64 位 Wintel PC 上生成多少个子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9275654/

相关文章:

c# - 如何使用 ForNpgsqlUseXminAsConcurrencyToken 创建的 EF Core 并发 token

node.js - 找不到 Titanium CLI

java - ActiveMQ 队列的活跃消费者太多

c++ - 可能的 std::async 实现错误 Windows

Windows 批处理脚本 - 查找字符串并回显之后的所有内容

javascript - Jade 将字符串数组渲染为字符串数组

node.js - Nodejs 测试 Hyperledger Composer v0.15 失败,错误为 : Card not found: PeerAdmin@hlfv1

c++ - Clang++ 4.0.0 在windows下编译报错

windows - 如何在不同的进程中运行 PowerShell 脚本并将参数传递给它?

windows - 运行1天后看不到Matlab命令窗口