2012-12-20 32 views
9

मैं कुछ भी नहीं सर्वर के साथ nodejs v8 मेमोरी प्रोफाइल करने की कोशिश कर रहा हूं। मैंने ढेर भिन्न होने के लिए नोड-मेमवॉच का उपयोग किया। कनेक्ट करने से पहले और कनेक्शन को तोड़ने से पहले मैं ढेर जानकारी एकत्र करता हूं। मैंने नोड-मेमवॉच का इस्तेमाल किया। मैंने क्लाइंट साइड से 200 समवर्ती कनेक्शन की कोशिश की।nodejs v8 मेमोरी जीसी आवंटन विफलता

यहां कनेक्शन के बाद जीसी ट्रेस है।

किसी को भी मदद कर सकते हैं मुझे समझने की:

1.Why स्मृति वृद्धि हो रही है? कनेक्शन टूटने के बाद, सर्वर बिल्कुल कुछ नहीं कर रहा है। क्या यह हमेशा कचरा इकट्ठा होने के रूप में नहीं छोड़ना चाहिए?
2. आवंटन विफलता क्या हैं? मैं वास्तव में यहां ट्रेस की व्याख्या कैसे करूं?

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]. 

धन्यवाद,

उत्तर

1

देखें कोड के अनुसार:

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); 

प्रत्येक पंक्ति, एक जी सी है जब जीसी शुरू कर दिया,

start_object_size_ = heap_->SizeOfObjects(); 

जीसी सारांश में:

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

क्यों start_object_size_ के रूप में उस समय बढ़ता है जब मेरा ऐप निष्क्रिय होता है, मैं शायद जीसी के दौरान अनुमान लगा रहा हूं, कुछ वस्तुओं को समर्थक मिला पुरानी जगह पर प्रेरित और पुरानी जगह में वस्तु का आकार बढ़ गया।

5

"आवंटन विफलता" बहुत नाटकीय लगता है, लेकिन कोई वास्तविक विफलता शामिल है। इसका मतलब यह है कि हमने इतनी मेमोरी आवंटित की है कि यह देखने के लिए समय है कि हम कुछ स्मृति एकत्र कर सकते हैं या नहीं।

ऐसा लगता है कि आप - जीसी-ग्लोबल फ्लैग ("जीसी झंडे द्वारा मजबूर") के साथ चल रहे हैं। यह उत्पादन के लिए एक बुरा विचार है, हालांकि डीबगिंग करते समय समस्या को कम करने के लिए यह ठीक हो सकता है।

मैं नहीं बता सकता कि आपकी प्रक्रिया क्यों लीक हो रही है। आप ढेर प्रोफाइलर उपयोगी हो सकता है। https://github.com/felixge/node-memory-leak-tutorial

+0

हां, मैं यह सुनिश्चित करने के लिए - जीसी-ग्लोबल और कॉम्पैक्ट का उपयोग कर रहा हूं कि ढेर को अलग करने से पहले एकत्र किए गए सभी कचरे। यह मामूली है। प्रश्न यह है कि जीसी के दौरान मेम क्यों बढ़ता है? – haijin