Node.js 节点进程未关闭套接字文件
我们的节点服务面临一个奇怪的问题 许多套接字文件描述符在节点进程中保持打开状态,进程中打开的文件(10240个文件)的限制已经达到。所以,我得到了EMFILE错误 服务已暂停并停止接受新请求以及向其他服务发送出站请求 在代码中,我没有明确处理套接字连接 节点进程仍在侦听端口。我们正在使用PM2 Java的类似问题: 以下是各版本的详细信息: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
- 节点版本: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”,我没有通过代码显式处理这些类型。如果重新编辑,您所述的理据毫无意义。一旦您拥有了所有的请求,您需要多长时间来服务该请求与服务器上的套接字超时完全无关,而套接字超时完全和读取请求有关。您应该在服务器应用程序中始终有一个读取超时,以保护自己免受恶意客户端和未及时发送整个请求的客户端的攻击。否则,您将累积插座泄漏,而这正是正在发生的情况。