node.js - 套接字进程未关闭套接字文件

标签 node.js sockets request hapijs

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

许多套接字文件描述符针对节点进程仍然处于打开状态,并且针对进程已达到打开文件(10240个文件)的限制。因此,我收到了EMFILE错误。

服务已停止并停止接受新请求以及将出站请求发送到其他服务。

我在代码中没有地方明确地处理套接字连接。

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

Java的类似问题:https://serverfault.com/questions/153983/sockets-found-by-lsof-but-not-by-netstat

以下是版本的详细信息:

  • 节点版本: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
    .
    .
    .
    

    有人在Node上遇到过这个吗?

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

    最佳答案

    我有同样的问题。在我的情况下,nodemailer在transport.close()之后没有关闭连接。更新到最新的nodemailer版本可以解决此问题。

    关于node.js - 套接字进程未关闭套接字文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60560343/

    相关文章:

    c - 接受的套接字上的“错误文件描述符”错误

    javascript - Ionic 2 与 WooCommerce API

    swift - NSURLSession:无需身份验证即可 NSURLSession ( Swift )

    sockets - 简单的聊天协议(protocol)

    Go 的垃圾收集器在使用时删除 ZeroMQ 套接字

    javascript - Puppeteer pdf 分页错误

    node.js - 使用 OAuth 通过 REST API 从 Magento 到 NodeJS

    JavaScript 在继续之前需要等待请求

    node.js - Express.js 路由模块不工作

    javascript - NodeJS 在需要整数的地方返回 0