3

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

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

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

节点和客户端之间的连接是由 socket.io 在服务器和客户端中建立的。

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

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

一切似乎都正常,但过了一段时间,就像随机一样,有 450 到 700 个用户,服务器的 CPU 达到 100%,所有连接都断开了,但服务器没有崩溃。问题是,如果您在浏览器中访问 https://...,您不会收到 404 或类似的信息,而是出现 SSL 连接错误,而且速度非常快。

我试图在任何地方添加日志,但没有像模式这样的东西,它像随机的。

如果有人有同样的问题,或者能给我带来线索,或者更好地调试的提示,我将不胜感激。

非常感谢。

4

1 回答 1

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 服务器,我很确定您想要这样做以确保它不会融化。

最后,如果您在未来没有日志的错误中需要帮助,您可以尝试straceing 或dtrussing 过程

# strace -p <process-id> 

应该做的工作。

于 2013-05-13T06:20:45.127 回答