2012-05-14 29 views
30

Có một số công cụ để phát hiện rò rỉ bộ nhớ trong nodej không? Và cho tôi biết về kinh nghiệm của bạn trong việc thử nghiệm các ứng dụng nodejs.Phát hiện rò rỉ bộ nhớ trong nodejs

+2

Tôi đọc blog này và tôi tìm thấy nó hữu ích, http: // dtrace. org/blogs/bmc/2012/05/05/gỡ lỗi-nút-js-memory-leaks/ – tawfekov

Trả lời

10

Trong theo dõi xuống một bộ nhớ bị rò rỉ Tôi đã thử nút kiểm tra ở trên.
Kể từ tháng 4 năm 2012, bản cập nhật này không được cập nhật để hoạt động với bản phát hành nút hiện tại v0.6.12 Như vậy tôi đã tìm thấy: https://github.com/c4milo/node-webkit-agent.
Nó có thể hiển thị ảnh chụp nhanh heap cho động cơ V8 mới hơn mà không được trình kiểm tra nút hỗ trợ. Theo thứ tự ngắn tôi đã có thể phát hiện các mô-đun bị rò rỉ (trong trường hợp có thể loggly), tôi hy vọng bạn có thành công tương tự!

+2

Điều này hoạt động khá tốt. Tôi đã sử dụng nút này cho v0.8.x quá –

+1

+1 cho trình kiểm tra nút bị hỏng. – liuyanghejerry

6

tôi cũng có thể giới thiệu các nguồn sau đây:

  1. tập sau NodeUp, nơi profiling và bộ nhớ bị rò rỉ công cụ phát hiện sẽ được thảo luận:

  2. Điều này ar ticle - Tracking Down Memory Leaks in Node.js – A Node.JS Holiday Season, về cơ bản tổng hợp tất cả các mô-đun và kỹ thuật được biết đến rộng rãi để theo dõi rò rỉ bộ nhớ

  3. Công cụ Mac OS - Instruments có thể hữu ích để gỡ lỗi mô-đun gốc (C++). Nó không quá phức tạp như các công cụ SmartOS, nhưng rất dễ cài đặt.
2

Tôi sử dụng công cụ dev dev và tệp heapsnapshot trực tiếp, không phải trình kiểm tra nút hoặc tác nhân nút-webkit.

require() mô hình heapdump.

Gửi tín hiệu usr2 tới tiến trình nodej đang chạy để nhận tệp heapsnapshot.

Tải tệp heapsnapshot trên tab hồ sơ của công cụ dành cho nhà phát triển Chrome.

0

Một điều tốt là https://github.com/bnoordhuis/node-heapdump rất đơn giản và bạn có thể xem kết quả trong Chrome (vì động cơ V8 cùng trong trình duyệt javascript và nodejs) và so sánh kích thước đối tượng trong bộ nhớ ở mọi thời điểm mà bạn muốn.

Và một mẹo khác làm thế nào để phát hiện rò rỉ bộ nhớ "manualy" hoặc giúp ngăn chặn nó, là lực lượng thu gom rác ở một số nơi của mã của bạn và xem những gì sẽ xảy ra.

Khởi động ứng dụng của bạn bằng "nút --expose-gc file.js" và bất kỳ nơi nào trong mã bạn có thể sử dụng hàm gc(); để gọi thu gom rác thải.

1

Tôi đã sử dụng các Memwatch gói NPM:

Hãy xem đến Github repositoryNPM source

Về cơ bản gói này sẽ kiểm tra việc sử dụng bộ nhớ heap ngay sau khi thu gom rác thải được thực hiện bởi động cơ V8, và cung cấp cho bạn đường cơ sở về mức sử dụng bộ nhớ thực tế.

Đây là cách tôi sử dụng nó:

var memwatch = require('memwatch'); 

memwatch.on('leak', function(info) { 
    console.log('Memwatch leak: '); 
    console.log(info); 
}); 

memwatch.on('stats', function(stats) { 
    console.log.message('Memwatch stats: '); 
    console.log(stats); 
}); 

Từ các tài liệu gốc:

Sự kiện 'stats', phát ra thỉnh thoảng, cung cấp cho bạn các dữ liệu mô tả sử dụng đống của bạn và các xu hướng theo thời gian.

Sự kiện 'leak', được phát ra khi xuất hiện mã của bạn bị rò rỉ bộ nhớ. Nó thường được thực hiện khi kích thước heap liên tục phát triển trong một khoảng thời gian ngắn.

Đồng hồ báo thức cũng cung cấp lớp "HeapDiff" để tính toán trạng thái heap giữa hai ảnh chụp nhanh bạn có thể thực hiện các chức năng của mình.

Có thể là một ý tưởng hay để chạy đồng hồ báo thức trong môi trường sân khấu của bạn, để theo dõi các sự kiện gây ra sự cố.

+1

memwatch đã chết – mateeyow

+0

Bạn cần 'memwatch-next' nó hỗ trợ các cuộc gọi tương tự. –

1

Phương pháp 1-
Node cho phép chúng ta tự kích hoạt Garbage Collection, và nó là điều đầu tiên mà chúng ta nên làm gì khi cố gắng xác nhận rò rỉ bộ nhớ. Điều này có thể được thực hiện bằng cách chạy Node với cờ --expose-gc (tức là node --expose-gc index.js). Khi nút đang chạy trong chế độ đó, bạn có thể kích hoạt một bộ sưu tập Garbage theo cách lập trình bất cứ lúc nào bằng cách gọi global.gc() từ chương trình của bạn.

Bạn cũng có thể kiểm tra lượng bộ nhớ được sử dụng bởi quy trình của bạn bằng cách gọi process.memoryUsage(). HeapUsed.

Bằng cách kích hoạt thủ công việc thu thập rác và kiểm tra vùng heap được sử dụng, bạn có thể xác định xem bạn có thực sự quan sát rò rỉ bộ nhớ trong chương trình của mình hay không. Tăng trưởng bộ nhớ trở nên rõ ràng hơn khi bạn làm bài kiểm tra này.

Phương pháp 2 - cờ --inspect

3 Heap Dumps Phương pháp

Node của hạ cánh trong phiên bản nút 6. Tính năng này cho phép bạn gỡ lỗi và kiểm tra quá trình nút của bạn từ bên trong DevTools Chrome.

Đơn giản chỉ cần khởi động ứng dụng thông qua các cờ --inspect:

$ node --inspect index.js

Thực hiện theo các URL để thanh tra và điều hướng đến tab nhớ.

DevTools Memory Tab

enter image description here Đây là những gì chúng tôi sẽ làm:

Hit ứng dụng với autocannon -c 1 -d 60 http://localhost:PORT
[https://www.npmjs.com/package/autocannon]
Chụp đống sau khoảng 10 giây , và một lần nữa sau 30 giây.

So sánh ảnh chụp nhanh heap
Chế độ xem so sánh cho chúng ta biết điều gì đã xảy ra giữa các ảnh chụp nhanh. Bạn có thể thấy một số lượng lớn các đối tượng đã được tạo ra hoặc không được GC thu thập.

Vui lòng đọc các bài viết tuyệt vời này để tìm hiểu thêm.
Họ đã giúp đỡ rất nhiều để tìm & sửa chữa rò rỉ: -

https://www.alexkras.com/simple-guide-to-finding-a-javascript-memory-leak-in-node-js/

https://www.nearform.com/blog/self-detect-memory-leak-node/

https://addyosmani.com/blog/taming-the-unicorn-easing-javascript-memory-profiling-in-devtools/