我希望有人可以帮我解决这个问题。
在我们公司,我们正在建立一个连接到Java Push服务器的node.js服务器。
我正在使用https模块而不是http和SLL证书。
节点和客户端之间的连接由socket.io在服务器和客户端中进行。
同时node.js服务器是java服务器的客户端,此连接使用常规套接字(net.connect)。
这个想法是用户连接到服务器,加入一些频道,当一些数据从java服务器到达时,会被分派给相应的用户。
一切似乎都运行良好,但过了一段时间,就像随机一样,有450到700个用户,服务器的CPU达到100%,所有连接都被破坏,但服务器没有崩溃。问题是,如果你在浏览器中访问https:// ...,你没有获得404或类似的东西,但SSL连接错误,而且它真的很快。
我试图在任何地方添加日志,但是没有类似于模式的东西,它就像是随机的。
如果有人遇到同样的问题或者可以给我一些线索,或者提示调试更好,我会很感激。
非常感谢。
答案 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服务器,我很确定你想这样做,以确保它不会融化。
最后,如果您在将来没有日志的错误中需要帮助,可以尝试strace
或dtruss
流程
# strace -p <process-id>
应该做的。