Node.js 节点进程未关闭套接字文件

Node.js 节点进程未关闭套接字文件,node.js,sockets,request,hapijs,Node.js,Sockets,Request,Hapijs,我们的节点服务面临一个奇怪的问题 许多套接字文件描述符在节点进程中保持打开状态,进程中打开的文件(10240个文件)的限制已经达到。所以,我得到了EMFILE错误 服务已暂停并停止接受新请求以及向其他服务发送出站请求 在代码中,我没有明确处理套接字连接 节点进程仍在侦听端口。我们正在使用PM2 Java的类似问题: 以下是各版本的详细信息: 节点版本:8.16.0 Hapi:14.2.0 请求:2.88.2(用于发送 出站请求) 控制台中的命令输出: [CONSOLE ~]$ lsof -p

我们的节点服务面临一个奇怪的问题

许多套接字文件描述符在节点进程中保持打开状态,进程中打开的文件(10240个文件)的限制已经达到。所以,我得到了EMFILE错误

服务已暂停并停止接受新请求以及向其他服务发送出站请求

在代码中,我没有明确处理套接字连接

节点进程仍在侦听端口。我们正在使用PM2

Java的类似问题:

以下是各版本的详细信息:

  • 节点版本:8.16.0
  • Hapi:14.2.0
  • 请求:2.88.2(用于发送 出站请求)
控制台中的命令输出:

[CONSOLE ~]$ lsof -p [PID] | wc -l
10253
[CONSOLE ~]$ ulimit -a
.
.
file size               (blocks, -f) unlimited
.
.
max memory size         (kbytes, -m) unlimited
open files                      (-n) 10240
.
.
.
[CONSOLE ~]$ netstat -np | grep [PORT]
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
[CONSOLE ~]$ netstat -a -n | grep  [PORT]
tcp        0      0 0.0.0.0:[PORT]           0.0.0.0:*               LISTEN     
[CONSOLE ~]$ lsof -i :[PORT]
COMMAND   PID USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
node    [PID] glpd   15u  IPv4 2270823542      0t0  TCP *:[PORT] (LISTEN)
[CONSOLE ~]$ lsof -p [PID]
COMMAND   PID USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
.
.
.
node    [PID] glpd   15u     IPv4         2270823542      0t0        TCP *:[PORT] (LISTEN)
node    [PID] glpd   16u     sock                0,7      0t0 2271652082 protocol: TCP
node    [PID] glpd   17u     sock                0,7      0t0 2271551621 protocol: TCP
node    [PID] glpd   18u     sock                0,7      0t0 2271663118 protocol: TCP
node    [PID] glpd   19u     sock                0,7      0t0 2271662963 protocol: TCP
node    [PID] glpd   20u     sock                0,7      0t0 2271660595 protocol: TCP
node    [PID] glpd   21u     sock                0,7      0t0 2271652144 protocol: TCP
node    [PID] glpd   22u     sock                0,7      0t0 2271660631 protocol: TCP
node    [PID] glpd   23u     sock                0,7      0t0 2271662997 protocol: TCP
node    [PID] glpd   24u     sock                0,7      0t0 2271660660 protocol: TCP
node    [PID] glpd   25u     sock                0,7      0t0 2271663083 protocol: TCP
.
.
.
有人在节点中遇到过这个吗

编辑:

此服务的所有传入请求的套接字超时都被禁用(设置为false),因为它是我们的主要处理服务,我们无法预测处理请求所需的时间。

我也遇到了同样的问题。在我的例子中,NodeEmailer在传输后没有关闭连接。close()。更新到最新的nodemailer版本解决了这个问题。

我也遇到了同样的问题。在我的例子中,NodeEmailer在传输后没有关闭连接。close()。更新到最新的nodemailer版本解决了问题。

您的流程是怎么做的?您是否100%确定没有一些从未发送响应的传入http请求导致它们保持打开状态一段时间?有90%以上的概率是您自己的代码中的某个东西,可能有9%的概率是由您正在使用的某个模块和@jfriend00引起的:我用“lsof”和“netstat”检查了相同的情况,以确定是否有东西挂起在TCP状态中。。。似乎没有什么悬而未决的。。。这些命令的输出被添加到问题中以供参考。您是否在某处泄漏了文件句柄?@jfriend00:所有文件描述符类型都是“sock”,我没有通过代码显式处理这些类型。如果重新编辑,您所述的理据毫无意义。一旦您拥有了所有的请求,您需要多长时间来服务该请求与服务器上的套接字超时完全无关,而套接字超时完全和读取请求有关。您应该在服务器应用程序中始终有一个读取超时,以保护自己免受恶意客户端和未及时发送整个请求的客户端的攻击。否则,您将累积插座泄漏,而这正是正在发生的事情。您的过程是如何做的?您是否100%确定没有一些从未发送响应的传入http请求导致它们保持打开状态一段时间?有90%以上的概率是您自己的代码中的某个东西,可能有9%的概率是由您正在使用的某个模块和@jfriend00引起的:我用“lsof”和“netstat”检查了相同的情况,以确定是否有东西挂起在TCP状态中。。。似乎没有什么悬而未决的。。。这些命令的输出被添加到问题中以供参考。您是否在某处泄漏了文件句柄?@jfriend00:所有文件描述符类型都是“sock”,我没有通过代码显式处理这些类型。如果重新编辑,您所述的理据毫无意义。一旦您拥有了所有的请求,您需要多长时间来服务该请求与服务器上的套接字超时完全无关,而套接字超时完全和读取请求有关。您应该在服务器应用程序中始终有一个读取超时,以保护自己免受恶意客户端和未及时发送整个请求的客户端的攻击。否则,您将累积插座泄漏,而这正是正在发生的情况。