2015-07-06 99 views
1

在我的web應用程序中,我使用節點elasticsearch客戶端。 與其他客戶端我正在測試應用程序。 我發送了一個請求,郵遞員測試運行器的迭代次數爲1000,觀察內存增加。節點elasticsearch客戶端導致內存泄漏

在運行任何測試用例應用程序之前,需要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 0.39。

這是節點版本的問題嗎?或Elasticsearch客戶端版本?或與我的代碼?

有些可以幫助解決這個問題。

回答

0

眼球如果甚至存在存儲器泄漏的指示,使用process.memoryUsage() https://nodejs.org/api/process.html#process_process_memoryusage

輸出將在以下格式:

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

看起來正常行爲如果你正在緩衝大量數據(可能是Elasticsearch的情況),那麼rss(駐留集大小)會一直增長。因此,堆總數和堆使用的度量標準更可能是更好的指標。

如果您的應用程序未掛起或隨着時間的推移性能下降,則可能不會指示內存泄漏。

看看http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection瞭解更多深入瞭解v8垃圾收集的內容。

如果仍懷疑有內存泄漏,或者您的應用程序顯示上面列出的蛛絲馬跡,你可能想看看與作爲https://www.npmjs.com/package/memwatch

+0

嗨snozza,感謝您的建議這樣的東西跟蹤泄漏。 – thrivikram

+0

嗨snozza,謝謝你的建議。對於每個休息API調用,我觀察到內存在增加。與郵差休息客戶端我跑了3K次相同的查詢,內存不斷增加。我注意到在pm2和linux命令ps的幫助下內存增加。你覺得代碼中是否存在導致此問題的任何錯誤? elasticsearch節點客戶端是否緩存應用程序中的數據?如果是這種情況,我該如何清除應用程序中的緩存。 – thrivikram

+0

如果不知道應用程序的具體細節,可能會導致內存泄漏(假設有),很難說清楚。我發現這個指南很方便http://www.nearform.com/nodecrunch/self-detect-memory-leak-node/它應該可以幫助你找出導致內存增加的原因。您可能會發現直接分析您的應用的更多成功。 – snozza