2012-12-20 33 views
9

Tôi đang cố gắng để hồ sơ nodejs v8 bộ nhớ với một máy chủ không làm gì cả. Tôi đã sử dụng nút-memwatch để có được heap diff. Tôi thu thập thông tin heap trước khi kết nối và sau khi kết nối xé xuống. Tôi đã sử dụng nút ghi nhớ. Tôi đã thử 200 kết nối đồng thời từ phía máy khách.nodejs v8 bộ nhớ gc phân bổ thất bại

Đây là dấu vết gc sau khi kết nối bị ngắt.

ai cũng có thể giúp tôi hiểu:

1. khi nào bộ nhớ tăng? sau khi kết nối bị hỏng, máy chủ hoàn toàn không làm gì cả. không nên giả sử luôn luôn rơi như thu gom được thu thập?
2. Lỗi phân bổ là gì? Làm thế nào để tôi thực sự giải thích dấu vết ở đây?

15802 ms: Mark-sweep 8.9 (45.0) -> 8.1 (45.0) MB, 58 ms [allocation failure] [GC in old space forced by flags]. 
16144 ms: Mark-sweep 9.2 (45.0) -> 8.4 (45.0) MB, 53 ms [allocation failure] [GC in old space forced by flags]. 
16495 ms: Mark-sweep 9.5 (45.0) -> 8.7 (46.0) MB, 60 ms [allocation failure] [GC in old space forced by flags]. 
16837 ms: Mark-sweep 9.8 (46.0) -> 9.0 (46.0) MB, 56 ms [allocation failure] [GC in old space forced by flags]. 
17197 ms: Mark-sweep 10.1 (46.0) -> 9.4 (46.0) MB, 62 ms [allocation failure] [GC in old space forced by flags]. 
17905 ms: Mark-sweep 11.5 (46.0) -> 10.0 (47.0) MB, 74 ms [Runtime::PerformGC] [GC in old space forced by flags].                
18596 ms: Mark-sweep 12.2 (47.0) -> 10.7 (47.0) MB, 75 ms [Runtime::PerformGC] [GC in old space forced by flags]. 
19315 ms: Mark-sweep 12.8 (47.0) -> 11.3 (48.0) MB, 83 ms [allocation failure] [GC in old space forced by flags]. 
20035 ms: Mark-sweep 13.4 (48.0) -> 12.0 (49.0) MB, 90 ms [Runtime::PerformGC] [GC in old space forced by flags]. 
21487 ms: Mark-sweep 16.0 (49.0) -> 13.2 (50.0) MB, 96 ms [Runtime::PerformGC] [GC in old space forced by flags]. 
22950 ms: Mark-sweep 17.3 (50.0) -> 14.5 (52.0) MB, 116 ms [Runtime::PerformGC] [GC in old space forced by flags]. 
24376 ms: Mark-sweep 18.8 (52.0) -> 15.9 (53.0) MB, 114 ms [allocation failure] [GC in old space forced by flags]. 
25849 ms: Mark-sweep 19.9 (53.0) -> 17.2 (54.0) MB, 129 ms [Runtime::PerformGC] [GC in old space forced by flags]. 
28773 ms: Mark-sweep 25.2 (54.0) -> 19.7 (57.0) MB, 149 ms [allocation failure] [GC in old space forced by flags]. 
31725 ms: Mark-sweep 27.7 (57.0) -> 22.2 (59.0) MB, 172 ms [Runtime::PerformGC] [GC in old space forced by flags]. 
34678 ms: Mark-sweep 30.2 (59.0) -> 24.7 (61.0) MB, 190 ms [Runtime::PerformGC] [GC in old space forced by flags]. 
44045 ms: Mark-sweep 28.4 (61.0) -> 25.8 (63.0) MB, 180 ms [idle notification] [GC in old space forced by flags]. 
44216 ms: Mark-sweep 25.8 (63.0) -> 25.8 (63.0) MB, 170 ms [idle notification] [GC in old space requested]. 
57471 ms: Mark-sweep 26.9 (63.0) -> 25.8 (62.0) MB, 167 ms [Runtime::PerformGC] [GC in old space forced by flags]. 
57651 ms: Mark-sweep 26.8 (62.0) -> 25.5 (62.0) MB, 160 ms [Runtime::PerformGC] [GC in old space forced by flags]. 
57828 ms: Mark-sweep 26.5 (62.0) -> 25.5 (62.0) MB, 159 ms [Runtime::PerformGC] [GC in old space forced by flags]. 

Cảm ơn,

Trả lời

1

Theo mã:

PrintF("%s %.1f (%.1f) -> %.1f (%.1f) MB, ", 
     CollectorString(), 
     static_cast<double>(start_object_size_)/MB,                      
     static_cast<double>(start_memory_size_)/MB, 
     SizeOfHeapObjects(), 
     end_memory_size_mb); 

Mỗi dòng là một gc, khi gc bắt đầu,

start_object_size_ = heap_->SizeOfObjects(); 

Nói tóm lại gc:

PrintF("total_size_before=%" V8_PTR_PREFIX "d ", start_object_size_);                 
PrintF("total_size_after=%" V8_PTR_PREFIX "d ", heap_->SizeOfObjects()); 

Tính đến lý do tại sao start_object_size_ tăng trong thời gian khi ứng dụng của tôi không hoạt động, tôi đoán có thể trong thời gian gc, một số đối tượng đã trở nên chuyên nghiệp chuyển động đến không gian cũ và gây ra kích thước vật thể trong không gian cũ tăng lên.

5

"thất bại phân bổ" âm thanh rất ấn tượng, nhưng không có thất bại thật sự có liên quan. Nó chỉ có nghĩa là chúng tôi đã phân bổ rất nhiều bộ nhớ đến mức cần phải thực hiện một GC để xem chúng ta có thể thu thập một số bộ nhớ hay không.

Có vẻ như bạn đang chạy cờ --gc-global ("GC buộc cờ"). Đó là một ý tưởng tồi cho sản xuất, mặc dù nó có thể là tốt cho việc thu hẹp một vấn đề khi gỡ lỗi.

Tôi không thể biết tại sao quy trình của bạn bị rò rỉ. Bạn có thể tìm thấy heap profiler hữu ích. Xem https://github.com/felixge/node-memory-leak-tutorial

+0

Có, tôi đang sử dụng --gc toàn cầu và nhỏ gọn để đảm bảo rằng tất cả các lần thu thập được thu thập trước khi lấy phần mềm khác. Đó là nhỏ. Câu hỏi đặt ra là tại sao mem tăng trong gc? – haijin

Các vấn đề liên quan