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

时间:2013-05-10 06:55:13

标签: node.js https websocket 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连接错误,而且它真的很快。

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

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

非常感谢。

1 个答案:

答案 0 :(得分:6)

好的,问题解决了。这是每个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是进程ID。这将帮助您了解这是否是您的问题,一旦启动节点服务器,您可以使用此命令检查它是否到达顶部,并在冻结后停止增长。 (默认为1024或“ulimit -n”)。

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

# ls -l /proc/XXXXX/fd

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

最后,如果您在将来没有日志的错误中需要帮助,可以尝试stracedtruss流程

# strace -p <process-id> 

应该做的。