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



我希望任何人都能帮助我解决这个问题。

在我们公司,我们正在建立一个node.js服务器,连接到Java Push服务器。

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

节点和客户端之间的连接是通过socket建立的。

同时node.js服务器是java服务器的客户端,这种连接是通过常规套接字(net.connect)进行的。

这个想法是用户连接到服务器,加入一些通道,当一些数据从java服务器到达时,它被分配给相应的用户。

一切似乎都很好,但过了一段时间,就像随机的,有450到700个用户,服务器的CPU达到100%,所有的连接都断开了,但服务器并没有崩溃。问题是,如果你去https://..。在浏览器中,你不会得到404或类似的东西,而是SSL连接错误,而且它真的很快。

我试着在每个地方添加日志,但是没有像模式这样的东西,它像随机的。

如果有人有同样的问题,或者可以给我一个线索,或者一个提示,以便更好地调试,我将不胜感激。

好了,问题解决了。这是每个Linux服务器都会遇到的问题。所以,如果你正在使用其中一个,你需要阅读这个

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

似乎每台linux服务器都有这个限制,每个进程只能打开1024个文件,你可以用

检查你的限制:
# ulimit -n

增加这个数字

# ulimit -n 5000 (for example)

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

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

warn: error raised: Error: accept EMFILE
warn: error raised: Error: accept EMFILE
warn: error raised: Error: accept EMFILE
...

要注意,如果你不是root用户,你只会在当前会话中修改这个,而不是永久的。

技巧:如果你想计算文件的数量,在这个例子中,是你的节点进程打开的文件的数量,记下你的进程id并调用这个命令。

# ls -l /proc/XXXXX/fd | wc -l

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

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

# ls -l /proc/XXXXX/fd

希望这对你有帮助。无论如何,如果你正在设置一个node js服务器,我很确定你想这样做,以确保它不会融化。

最后,如果你需要帮助,在未来的错误没有日志,你可以尝试strace ing或dtruss ing进程

# strace -p <process-id> 

最新更新