集群socket.io服务器挂起

时间:2017-04-03 17:14:43

标签: node.js socket.io

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

我发现一个悬挂条件,当服务器在300个并发用户处受压时,我无法将任何内部故障归咎于此。在较低的并发性下,我不会看到悬挂情况。

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

我可以看到的最后一个活动是socket.io,但是,这些消息表明套接字正在关闭(&#34;因为客户端命名空间断开&#34;因为它们自己的&#34;测试结束& #34;周期。看起来传入的连接似乎没有得到服务。

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

在服务器应用程序中,我有处理程序用于未捕获的异常和try-catch阻止所有内容。

在之前的迭代中,我还使用了cluster,但是颠倒了职责,以便主进程处理连接(工作者处理全局数据)。那并没有表现出同样的失败。不确定连接分配是否有问题。为此,我还放弃了internalMessage个事件来监控cluster的内部运作。

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

1 个答案:

答案 0 :(得分:0)

我可以通过将cluster调度策略从Round Robin(SCHED_RR)更改为None(操作系统特定于SCHED_NONE)来删除挂起条件。我不知道这是否是由于连接分发中的错误(或调度策略中固有的其他内容),但这一改变似乎可以防止挂起情况。