我在Node.js(6.9.0)中编写基于socket.io的服务器。我正在使用内置cluster
模块来启用多个进程。目前,只有两个过程:主人和工人。主设备接收连接并维护内存中的全局数据结构(工作人员可以通过IPC查询)。通过处理每个传入连接,工作进程完成大部分工作。
我发现一个悬挂条件,当服务器在300个并发用户处受压时,我无法将任何内部故障归咎于此。在较低的并发性下,我不会看到悬挂情况。
我启用所有形式的调试(使用debug
模块:socket.io:socket
,socket.io:client
以及我自己对debug
的自定义调用。)< / p>
我可以看到的最后一个活动是socket.io
,但是,这些消息表明套接字正在关闭(&#34;因为客户端命名空间断开&#34;因为它们自己的&#34;测试结束& #34;周期。看起来传入的连接似乎没有得到服务。
我使用Artillery.io作为测试客户端。
在服务器应用程序中,我有处理程序用于未捕获的异常和try-catch
阻止所有内容。
在之前的迭代中,我还使用了cluster
,但是颠倒了职责,以便主进程处理连接(工作者处理全局数据)。那并没有表现出同样的失败。不确定连接分配是否有问题。为此,我还放弃了internalMessage
个事件来监控cluster
的内部运作。
我没有使用任何其他模块进行连接分发或粘性会话。由于只有一个流程处理连接(此时),它似乎并不相关。
答案 0 :(得分:0)
我可以通过将cluster
调度策略从Round Robin(SCHED_RR
)更改为None(操作系统特定于SCHED_NONE
)来删除挂起条件。我不知道这是否是由于连接分发中的错误(或调度策略中固有的其他内容),但这一改变似乎可以防止挂起情况。