Node.js SSL服务器冻结,高CPU,没有崩溃但没有连接

Jav*_*bos 3 https websocket node.js socket.io

我希望有人能帮我解决这个问题.

在我们公司,我们正在建立一个连接到Java Push服务器的nod​​e.js服务器.

我正在使用https模块而不是http和SLL证书.

节点和客户端之间的连接由socket.io在服务器和客户端中进行.

同时node.js服务器是java服务器的客户端,这个连接是用常规套接字(net.connect)建立的.

这个想法是用户连接到服务器,加入一些频道,当一些数据从Java服务器到达时,这将被分派给相应的用户.

一切似乎工作正常,但过了一段时间,像随机一样,有450到700个用户,服务器的CPU达到100%,所有连接都被破坏,但服务器没有崩溃.问题是,如果你去浏览器中的https:// ...,你没有得到404或类似的东西,但SSL连接错误,它真的很快.

我试图在任何地方添加日志,但是没有类似于模式的东西,它就像是随机的.

如果有人有同样的问题或者可以给我一个线索,或者提示调试更好,我会很感激.

非常感谢.

Jav*_*bos 6

好的,问题解决了.这是每个Linux服务器都会出现的问题.因此,如果您正在使用其中一个,则需要阅读此内容.

原因是Linux服务器每个进程的文件的默认限制.

似乎单个linux服务器都带有每个进程打开的1024个文件的限制,您可以通过以下方式检查您的限制:

# ulimit -n
Run Code Online (Sandbox Code Playgroud)

增加这个数字

# ulimit -n 5000 (for example)
Run Code Online (Sandbox Code Playgroud)

每个套接字创建一个新的虚拟文件.

由于某种原因,我的服务器没有显示任何错误,服务器刚刚冻结,停止日志,没有信号或任何证据.当我开始发送时,我在另一台机器上设置了服务器的副本

warn: error raised: Error: accept EMFILE
warn: error raised: Error: accept EMFILE
warn: error raised: Error: accept EMFILE
...
Run Code Online (Sandbox Code Playgroud)

请注意,如果您不是root用户,则只会为当前会话而不是永久更改此权限.

技巧:如果你想要节点文件的数量,在这种情况下,你的节点进程打开的文件数,请注意你的进程ID并调用此命令.

# ls -l /proc/XXXXX/fd | wc -l
Run Code Online (Sandbox Code Playgroud)

其中XXXXX是进程ID.这将帮助您了解这是否是您的问题,一旦启动节点服务器,您可以使用此命令检查它是否到达顶部,并在冻结后停止增长.(默认为1024或"ulimit -n").

如果您只想检查进程打开哪些文件:

# ls -l /proc/XXXXX/fd
Run Code Online (Sandbox Code Playgroud)

希望这可以帮到你.无论如何,如果你要设置一个节点js服务器,我很确定你想这样做,以确保它不会融化.

最后,如果你需要在今后的错误,帮助没有日志,你可以尝试strace荷兰国际集团和dtruss荷兰国际集团进程

# strace -p <process-id> 
Run Code Online (Sandbox Code Playgroud)

应该做的工作.