Nodejs连接EMFILE - 如何重用连接?

时间:2015-09-03 01:02:03

标签: node.js ulimit

我正在实现基于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请求。有没有办法重用/终止连接?

1 个答案:

答案 0 :(得分:0)

由于您的所有(或大多数)请求看起来都是单个主机,因此您可以将每个主机的最大并发套接字数设置为有限的数量,例如100.使用http://my.test.site执行此操作Node的http模块中的选项。

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