3

我一直在四处寻找,看看是否有其他人遇到过这个问题,但我有点预料到不会,这就是我发现的。

我现在面临的问题与我正在构建的应用程序的架构有关;node.js 中的游戏服务器。截至目前,服务器以单个“管理器”进程启动,该进程控制所有子进程。游戏的每个“区域”或“区域”都cluster.fork()使用单独的进程进行旋转,以便每个“区域”可以在服务器上拥有自己的线程,以优化服务器一次运行许多这些“区域”的能力.

我现在面临的困境是这样的。由于每个“区域”都在单个线程中运行,并且该线程已经每秒运行复杂的 3D 数学 X 次以保持“区域”同步,我不想打开 Socket.io(通信用于与游戏客户端交谈的库)在同一个线程中。我想我挂断的地方是在cluster.on('message')主进程中使用处理程序的性能以及使用process.send({...}).

我想看看是否有其他人有这方面的经验,或者从根本上知道整个集群模块是如何工作的,本质上是这样的:

调用是否更快:

var io = require('socket.io').listen( 1337 );
io.sockets.on('connection',...); //map all the functionality here in the "zone" thread

或者做更多这样的事情:

var cluster = require('cluster');
var io = [];
//arbitrary number for the thread count, not important for theory testing
for( var i = 0; i < 4; ++i) {
    var process = cluster.fork({...});
    process.on('message',myRelayFunction);
    io.push( process );
}

当然,假设cluster.fork()调用是通过管道传输到一个脚本中,该脚本除了打开一个 socket.io 连接并将来自各个客户端的消息中继到“区域”进程之外什么都不做。

我已经尝试对此进行性能测试,但我发现很难判断这是否更快,因为我很难通过连接使机器饱和以获取要测试的输出。

我想确保这是可扩展的,以便在较重的负载下,应用程序可以充分利用服务器上的多个 CPU 内核。所以这当然是说我应该将 socket.io 侦听器多线程化到多个线程中,但我担心的是,由于它们在技术上都通过管道返回到单线程进程中,这不会让我付出任何可能的多线程性能提升-穿线他们?我在这里的测试/基准测试部门有点空虚,我不知道这一切背后的理论如何运作得足够好,无法说出这里最好的基本方法是什么......所以我非常感谢任何反馈/输入任何人对此的看法;)

4

1 回答 1

4

我能够进行更多测试,并且似乎将 socket.io 侦听器放在单独的线程中仍然对性能非常有益,即使它们必须将数据输入/输出单个“区域”(管理器)进程。这样,服务器可以使用单独的 CPU 来处理 IO 处理而不是区域处理。

所以这里的答案是,是的,将侦听器/套接字多线程化到单独的线程中仍然是有益的,即使所有这些线程都在与单个线程进行通信。这当然会导致我遇到的另一个问题,即如何最好地优化 node.js 中多个子进程之间的通信因为这是这个过程中的下一个逻辑步骤/障碍,我将链接到下面的问题以防万一else 稍后会在这个问题上磕磕绊绊。

node.js 集群中的子进程间通信选项

于 2013-01-21T18:31:32.860 回答