2015-02-15 26 views
5

Tôi đã chạy máy chủ của mình với pm2 start ...pm2 monit đang hiển thị cho tôi 3GB memory sau 2 giờ. Vì vậy, tôi đính kèm memwatch, bây giờ tôi chờ đợi thêm 2 giờ và một lần nữa bộ nhớ được hiển thị bởi pm2 monit đạt 3GB.Node.JS rò rỉ bộ nhớ với PM2

Vì vậy, tôi đã kiểm tra bản ghi nhật ký được tạo. Chỉ cho tôi:

{ before: { nodes: 75659, size_bytes: 11141702, size: '10.63 mb' }, 
    after: { nodes: 73226, size_bytes: 10840598, size: '10.34 mb' }, 
    change: 
    { size_bytes: -301104, 
    size: '-294.05 kb', 
    freed_nodes: 5141, 
    allocated_nodes: 2708, 

Và khác:

{ before: { nodes: 72591, size_bytes: 10728318, size: '10.23 mb' }, 
    after: { nodes: 73284, size_bytes: 10798062, size: '10.3 mb' }, 
    change: 
    { size_bytes: 69744, 
    size: '68.11 kb', 
    freed_nodes: 5931, 
    allocated_nodes: 6620, 

Bây giờ tôi thực sự bối rối, đó là những bản ghi cuối cùng vì vậy tôi khá chắc chắn đó là những bản ghi được tạo ra khi pm2 monit cho thấy sự rò rỉ bộ nhớ khổng lồ.

Vì vậy, tại sao là memwatch hiển thị cho tôi 10MB+ bộ nhớ và pm2 monit hiển thị 3GB+?


Bây giờ chuyển sang cái gì đó như forever hoặc monit để xem nếu rò rỉ vẫn còn tồn tại.


Một chút hơn nền

  • Tôi đã cố gắng để cấu hình và tìm chỗ rò rỉ và không chỉ là bất kỳ rò rỉ hiển thị trên hồ sơ.
  • Sự khác biệt của đồng hồ bấm giờ được bắt đầu khi khách hàng kết nối và sự khác biệt được thực hiện khi khách hàng ngắt kết nối.
+0

Về điều này, tôi đã cố gắng để hồ sơ nó trong 2 ngày qua và không thể tìm thấy vấn đề. Vì vậy, cuối cùng tôi đã quyết định chuyển sang Golang, điều này thật tuyệt vời, bộ nhớ lớn và sự khác biệt về hiệu suất. Rất hiệu quả. Cuối cùng không có rò rỉ khó hiểu. Cộng với nó khá dễ dàng để mã hóa, mã hóa javascript để golang trong vòng chưa đầy một ngày. – majidarif

Trả lời

3
  • Tôi cũng đã phải đối mặt với cùng một vấn đề, nhưng sau khi nghiên cứu nhỏ tôi thấy rằng nodejs không gọi thu gom rác khi sử dụng PM2.
  • Vì vậy, cho đến khi PM2 bản sửa lỗi phát hành công việc tạm thời xung quanh là lực lượng gọi thu gom rác, sử dụng sau

PM2 bắt đầu app.js --node-args = '- vạch trần-gc'

Đối số trên --expose-gc sẽ cho phép chúng tôi ép bộ thu gom cuộc gọi từ nút js, giờ sử dụng mã sau để thu thập bộ nhớ nhà để xe.

if (global.gc) { 
    global.gc(); 
} else { 
    console.log('Garbage collection unavailable. use --expose-gc ' 
    + 'when launching node to enable forced garbage collection.'); 
} 

Điều này sẽ giải quyết vấn đề rò rỉ PM2 meomry.

+4

Bạn có thể cung cấp nguồn cho 'nhưng sau ít nghiên cứu tôi thấy rằng nodejs không gọi bộ thu gom rác khi sử dụng pm2.'. Cảm ơn. – majidarif