2017-04-03 118 views
0

我正在Node.js(6.9.0)中编写基于socket.io的服务器。我正在使用内置的cluster模块来启用多个进程。目前,只有两个过程:一个主人和一个工人。主站接收连接并维护内存中的全局数据结构(工作人员可通过IPC查询)。工作进程通过处理每个传入连接完成大部分工作。群集的socket.io服务器挂起

我发现一个挂起的情况,当服务器压力超过300个并发用户时,我无法归因于任何内部故障。在较低的并发性下,我没有看到挂起的情况。

我使所有形式的调试(使用debug模块:socket.io:socketsocket.io:client以及我自己的自定义调用debug)。

我能看到的最后一个活动是在socket.io,但是,这些消息表明由于它们自己的“测试结束”周期,套接字正在关闭(“reason reason namespace disconnect”)。这看起来好像传入的连接没有被服务。

我使用Artillery.io作为测试客户端。

在服务器应用程序中,我有一些处理未捕获的异常和try-catch块。

在之前的迭代中,我也使用了cluster,但是颠倒了职责,以便主进程处理连接(处理全局数据的工作人员)。这并没有表现出同样的失败。不知道连接分配是否有问题。为此,我还倾倒了internalMessage事件来监视cluster的内部工作。

我没有使用任何其他模块进行连接分配或粘性会话。由于只有一个处理连接的处理(此时),它似乎并不相关。

+1

你是如何通过主从连接的? – robertklep

+0

我正在使用'cluster'提供的内建机制(据我所知)。实质上,我没有明确地做任何事情:工作人员创建服务器,初始化'socket.io',然后只监听特定的端口。 '集群'指示该工作人员'听'呼叫到主人并且路由(通过“循环”)每个新连接到工作人员。 – gboysko

+0

你可以尝试'cluster'提供的其他方法(参见[this](https://nodejs.org/api/cluster.html#cluster_cluster_schedulingpolicy),特别是'cluster.SCHED_NONE'),但它也可能是值得的就像暂时禁用查询主服务器的全局数据结构的工作人员。我认为只有一名工人是暂时的(一旦这个问题得到解决,可以扩大到多名工人)? – robertklep

回答

0

我能够通过将cluster调度策略从循环法(SCHED_RR)更改为无,这是操作系统特定的(SCHED_NONE)删除挂起的条件。我无法分辨这是否是由于连接分配中的错误(或调度策略中的其他内在因素),但这一改变似乎可以防止挂起状况。