【问题标题】:Nodejs connect EMFILE - How to reuse connections?Nodejs连接EMFILE - 如何重用连接?
【发布时间】:2015-09-03 01:02:03
【问题描述】:

我正在实现基于 NodeJS 的脚本,用于与 couchbase 和其他服务进行通信。这是一个长时间运行的脚本,过了一会儿我得到了服务的“连接 EMFILE”。我的代码示例如下:

function createContainer(chunkName,recordingID,chunkData)
{
  var swiftHTTPPath='http://'+swiftIPAddr+'/swift/v1/'+recordingID;
  var path = '/swift/v1/'+recordingID;
  var swiftOptions = {
    hostname : swiftIPAddr,
    port     : swiftPort,
    path     : path,
    method   : 'PUT',
  };

  http.get(swiftHTTPPath, function(res) {
    if(res.statusCode == '404')
    {
      var req = http.request(swiftOptions, function(res)
      {
        res.setEncoding('utf8');
        res.on('data', function (chunk)
        {
          console.log('Container created');
        });
        res.on('end', function() {
        });
      });
      req.on('error', function(e)
      {
        console.log(e.message);
      });
      req.end();
    }
    else
    {
      console.log('Container already exists');
    }
  }).on('error', function(e)
  {
    console.log('e.message);
  });
}

以下命令显示有超过 1024 个打开的连接

lsof -i -n -P > mylog.log

........
node    14135 ubuntu 1020u  IPv4 5249347      0t0  TCP 10.1.1.1:53623->10.1.1.2:8091 (ESTABLISHED)
node    14135 ubuntu 1021u  IPv4 5249350      0t0  TCP 10.1.1.1:42021->10.1.1.2:11210 (ESTABLISHED)
node    14135 ubuntu 1022u  IPv4 5249351      0t0  TCP 10.1.1.1:53627->10.1.1.2:8091 (ESTABLISHED)
........

我可以增加 ulimit 值,但我想知道我是否以正确的方式执行 HTTP GET、POST 请求。有没有办法重用/终止连接?

【问题讨论】:

    标签: node.js ulimit


    【解决方案1】:

    由于您的所有(或大部分)请求似乎都发送到单个主机,您可以将每个主机的最大并发套接字数设置为有限的数量,例如 100。使用 agent.maxSockets 选项执行此操作节点的http 模块。

    关于简单地重用连接,这应该自动发生。事实上它不是让我相信你同时发出许多请求......所以你也可以通过更渐进地发出请求来解决这个问题。

    【讨论】:

    • 感谢您的回复。不幸的是,由于系统的性质,我无法逐步发出请求。那么这是否意味着我要同时发出 1024 个请求(我怀疑)?我可以在我的 HTTP 请求中做一些不同的事情吗?
    • 我的理解是,一旦请求(GET、PUT)完成或至少应该重新使用,套接字就会关闭。我计划 24x7 运行脚本并连接到多个系统。我该如何处理这种情况?
    • @KarthikJ:嗯,你可以简单地增加你的 ulimit。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多