2012-11-28 25 views
8

मैं एक ऐसे अनुप्रयोग पर काम कर रहा हूं जो समांतरता के लिए 8 गुना तक खुद को फोर्क करता है। प्रत्येक कांटा में कांटा के समय मूल प्रक्रिया से मेमोरी स्पेस की पूरी प्रति होती है। कांटे जल्दी होते हैं क्योंकि लिनक्स प्रक्रियाओं के बीच पृष्ठों को साझा करता है और जब वे संशोधित होते हैं तो केवल नए होते हैं। अभ्यास में स्मृति खपत में वृद्धि, मेरे आवेदन के लिए लगभग 3x प्रतीत होता है। परिवर्तनों की पहचान करने के लिए उपयोग करने के लिए उपकरण या तकनीकों के लिए कोई सुझाव जो उस विकास को कम करेगा?कॉपी-ऑन-राइट का उपयोग कर सी ++ प्रोग्राम की मेमोरी खपत को कम करने के लिए कैसे?

एक विचार संशोधित पृष्ठों की पेज विखंडन को देखने के लिए है। फोर्क प्रक्रियाओं में आवंटित किए गए कार्यों की केवल ब्रूट फोर्स परीक्षा भी है। किसी भी मामले में, आप उस विश्लेषण करने के लिए कौन सी तकनीकों या औजारों की सिफारिश कर सकते हैं?

ध्यान रखें कि कार्यक्रम भी समानांतरवाद साथ कई घंटे लग जाते पूरा करने के लिए और 1TB तक की स्मृति पदचिह्न है तो उपकरण विकल्प सीमित हैं रखें।

+4

क्या आपको कांटा की जरूरत है? आप समानांतरता के लिए अलग-अलग धागे भी बना सकते हैं, और सभी एक ही मेमोरी (सभी प्रभावों के साथ) –

+1

साझा करेंगे, एक बहुत ही सामान्य सुझाव है, लेकिन आप लिखने वाली मेमोरी को अलग करने के लिए पूल आवंटकों (या इसी तरह) का उपयोग करने का प्रयास कर सकते हैं कई प्रक्रियाओं में, स्मृति से जो कांटे के बाद स्थिर रहता है। चूंकि गाय एक समय में एक मेमोरी पेज किया जाता है, इसलिए आपके द्वारा संशोधित स्मृति के साथ मिश्रित कोई भी पढ़ने-योग्य स्मृति अनावश्यक डुप्लिकेशन में परिणाम देती है। चूंकि अनुमानित-केवल-पढ़ने वाले आवंटक से स्मृति को संशोधित करने से बचना महत्वपूर्ण नहीं है, इसलिए यदि आप पहले से सुनिश्चित नहीं हैं कि स्मृति कौन सा है, तो एक ह्युरिस्टिक अभी भी मदद कर सकता है। –

उत्तर

2

आप उपभोग की निगरानी के लिए vmstat, systemtap और glibc के malloc-hooks का उपयोग कर सकते हैं। आप उपभोग के वास्तविक प्रभाव को समझने के लिए perf का उपयोग कर सकते हैं कि यह देखने के लिए कि दोष कहाँ हो रहे हैं।

यदि आप बड़े मेमोरी पूल (जैसे आप डेटा की एक बड़ी मात्रा के माध्यम से स्ट्रीमिंग कर रहे हैं) का उपयोग करते हैं तो आपके एप्लिकेशन को टीएलबी दबाव का सामना करना पड़ता है, तो आप 4k पृष्ठों के ऊपरी हिस्से को कम करने के लिए विशाल/बड़े पृष्ठों का उपयोग कर सकते हैं।

आप कर्नेल को अपनी प्रक्रियाओं के भीतर से बताने के लिए madvise का भी उपयोग कर सकते हैं जो आप आवंटित स्मृति के साथ संभवतः करने जा रहे हैं।