节点elasticsearch客户端导致内存泄漏

时间:2015-07-06 07:53:24

标签: node.js express memory-leaks elasticsearch

在我的Web应用程序中,我正在使用节点elasticsearch客户端。 与rest客户端我正在测试应用程序。 我发送了邮递员测试运行器的请求,迭代次数为1000,观察到的内存增加了。

在运行任何测试用例之前,应用程序需要45MB~。 在运行1000次迭代的测试用例之后,应用程序正在消耗~90MB。 重新运行相同的测试用例后,内存增长到~120MB。 我觉得应用程序中存在内存泄漏。

节点版本:0.12.5 Elasticsearch DB版本:1.5.2 Elasticsearch节点客户端:4.0.2

示例代码:

var client = new elasticsearch.Client({
  hosts: elasticHosts
});


app.all('*', function(req, res, next) {
  validateApiKey(req.headers["apikey"],next,res);    
})

function validateApiKey(ApiKey,next,response) {
    var hits;
    var isValidApiKey = false

    client.search({
      index: 'clients',
      type: 'search',
      body: {
        "query":{
        "match":{
          "apikey" : ApiKey                  
        }
      }
    }
  },function(err,res) {
  response.send(true);
}

如果使用节点版本0.10.39,我注意到发生了内存泄漏。

节点版本有问题吗?或Elasticsearch客户端版本?还是用我的代码?

有些人可以帮助解决这个问题。

1 个答案:

答案 0 :(得分:0)

如果甚至有内存泄漏迹象,请注意,请使用process.memoryUsage() https://nodejs.org/api/process.html#process_process_memoryusage

输出将采用以下格式:

{ rss: 4935680,
  heapTotal: 1826816,
  heapUsed: 650472 }

如果要缓存大量数据(可能是Elasticsearch的情况),rss(驻留集大小)的正常行为似乎是一致的。因此,heapTotal和heapUsed指标更有可能成为更好的指标。

如果您的应用程序没有挂起或性能随着时间的推移而降低,则可能并不表示内存泄漏。

再看看http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection,深入了解一下v8垃圾收集。

如果您仍然怀疑内存泄漏,或者您的应用显示上面列出的告示标志,您可能需要查看使用https://www.npmjs.com/package/memwatch

之类的内容来跟踪泄漏