我的节点服务面临一个奇怪的问题。
许多套接字文件描述符针对节点进程仍然处于打开状态,并且针对进程已达到打开文件(10240个文件)的限制。因此,我收到了EMFILE错误。
服务已停止并停止接受新请求以及将出站请求发送到其他服务。
我在代码中没有地方明确地处理套接字连接。
节点进程仍在监听端口。我们正在使用PM2。
Java的类似问题:https://serverfault.com/questions/153983/sockets-found-by-lsof-but-not-by-netstat
以下是版本的详细信息:
出站请求)
控制台中的命令输出:
[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
.
.
.
有人在Node上遇到过这个吗?
编辑:
此服务的所有传入请求的套接字超时都被禁用(设置为false),因为它是我们的主要处理服务,我们无法预测处理请求所花费的时间。
最佳答案
我有同样的问题。在我的情况下,nodemailer在transport.close()之后没有关闭连接。更新到最新的nodemailer版本可以解决此问题。
关于node.js - 套接字进程未关闭套接字文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60560343/