2015-02-19 36 views
5

Tôi đã sử dụng express trên node.js đang chạy trên máy chủ heroku cho một dự án đơn giản. Khi tôi bắt đầu sử dụng di tích mới để theo dõi bộ nhớ, tôi nhận thấy một mẫu bộ nhớ bị rò rỉ chậm. Tôi đã xóa tất cả mã tôi đã phát triển và tất cả các mô-đun nút khác và chỉ để lại các mô-đun di chuyển mới và chính nó. Tôi vẫn quan sát rò rỉ bộ nhớ. Tôi đã tự hỏi nếu đây là rò rỉ bộ nhớ express.js. Here is the graphic from new relicExpress.js trên Node.js có bị rò rỉ bộ nhớ không?

Dưới đây là tất cả các trái mã:

require('newrelic'); 
var express = require('express'); 
var app = express(); 
var env = process.env.NODE_ENV || 'development'; 
if ('development' == env) { 
    app.set('port', process.env.PORT || 3000); 
} 
app.get('/', function (req, res) { 
    res.send('The server is up and running!'); 
}); 
app.listen(app.get('port'), function() { 
    console.log('Express server listening on port %d in %s mode', app.get('port'), app.get('env')); 
}); 

Và package.json

{ 
    "name": "memleakdebug", 
    "version": "1.0.0", 
    "description": "", 
    "main": "index.js", 
    "scripts": { 
    "test": "echo \"Error: no test specified\" && exit 1" 
    }, 
    "author": "", 
    "license": "ISC", 
    "dependencies": { 
    "express": "^4.11.2", 
    "newrelic": "^1.16.2" 
    } 
} 

UPDATE1: Bây giờ phát triển bộ nhớ thậm chí thông qua giới hạn 512MB Heroku cho tầng miễn phí. Bộ sưu tập rác dường như không hoạt động.

Memory keeps growing

+2

Điều bạn đã thể hiện là tăng mức sử dụng bộ nhớ, không nhất thiết phải rò rỉ. Bạn cần phải kiểm tra những gì xảy ra khi hệ thống được đặt dưới áp lực bộ nhớ. 350MB (điểm cao nhất trong biểu đồ của bạn) không phải là rất nhiều bộ nhớ sử dụng trên các hệ thống hiện đại; V8 có thể không có bận tâm để làm bất kỳ bộ sưu tập rác (chưa). –

+0

Mã ban đầu của tôi đã thực hiện một vài trăm yêu cầu http và nó đã thổi sử dụng bộ nhớ lên đến 1,5 GB. Bạn có thể vui lòng cho tôi một ví dụ đơn giản và giới hạn bộ nhớ mà tôi có thể làm V8 để làm GC không? – user3211198

+0

Cách đơn giản nhất có lẽ là cung cấp ít bộ nhớ hơn. Tôi chắc rằng Heroku cho phép bạn kiểm soát điều đó. –

Trả lời

10

Như Lasse trả lời, có rò rỉ bộ nhớ trong Relic mới.

https://discuss.newrelic.com/t/memory-leaking-only-with-node-js-agent-installed/14448

tôi đã thử nghiệm và loại bỏ

require('newrelic'); 

Như bạn có thể nhìn thấy trong hình dưới đây, kể từ khi tôi loại bỏ các tác nhân New Relic không có rò rỉ bộ nhớ hơn.

enter image description here

+0

Cập nhật - coleague đang chạy Node.js + New Relic không có vấn đề gì. Chúng tôi đã tìm thấy sự khác biệt đáng kể duy nhất là tôi đang chạy Node.js v0.12.x và anh ấy đang chạy 0.10.x. Có ai xác nhận không? – Sax

+1

Có một cuộc thảo luận lớn về [Cộng đồng di tích mới] (https: //discuss.newrelic.com/t/node-js-agent-memory-leak/9092/27) và một bài viết tiếp theo của họ, chuyển buck vào Node Core. Tuy nhiên việc cập nhật phụ thuộc vào '1.24.x' dường như đã giải quyết nó (không có gì thay đổi), ít nhất là mỗi lần thử nghiệm sơ bộ. [Node0.12] (https://discuss.newrelic.com/t/an-update-on-memory-management-in-node-js-perception-vs-reality/31934) đã liên tục sử dụng lượng bộ nhớ cao hơn. – nerdwaller

+0

Thx @nerdwaller cần biết. Tôi sẽ báo cáo lại khi tôi thực hiện một thử nghiệm mới. – Sax