2008-09-29 18 views
33

के लिए मल्टीथ्रेडेड मेमोरी आवंटकों में वर्तमान में मेरे पास भारी बहु थ्रेडेड सर्वर एप्लिकेशन है, और मैं एक अच्छी बहु-थ्रेडेड मेमोरी आवंटक के लिए खरीदारी कर रहा हूं।सी/सी ++

अब तक मैं बीच फंसे हूँ:

  • सूर्य की umem
  • गूगल के tcmalloc
  • संभाजक
  • एमरी बर्जर के ढेर

इंटेल सूत्रण बिल्डिंग ब्लॉक्स मैं क्या है से पाया गया होर्ड सबसे तेज़ हो सकता है, लेकिन मैंने आज से पहले इसके बारे में नहीं सुना था, इसलिए अगर मैं वास्तव में ऐसा लगता हूं तो मुझे संदेह है। किसी भी व्यक्ति को इन आवंटकों को आजमाने का व्यक्तिगत अनुभव है?

+1

क्या विशिष्ट समस्या (रों) आप वर्तमान डिफ़ॉल्ट ढेर प्रबंधक आपके द्वारा प्रयोग किए हल करने की कोशिश कर रहे हैं? और, वह कौन सा है? –

+3

अपने एप्लिकेशन में यह जांचने का प्रयास करें कि क्या आप थ्रेड-स्थानीय स्टोरेज का उपयोग करके प्रदर्शन में सुधार कर सकते हैं। यदि ऐसा करने की संभावना है, तो लाभ बहुमत वाले आवंटक का उपयोग करने से बेहतर हो सकता है। – trshiv

उत्तर

16

मैंने tcmalloc का उपयोग किया है और होर्ड के बारे में पढ़ा है। दोनों में समान कार्यान्वयन होते हैं और दोनों धागे/सीपीयू की संख्या (उनके संबंधित साइटों पर आलेखों के अनुसार) के संबंध में मोटे तौर पर रैखिक प्रदर्शन स्केलिंग प्राप्त करते हैं।

तो: यदि प्रदर्शन वास्तव में अविश्वसनीय रूप से महत्वपूर्ण है, तो प्रदर्शन/लोड परीक्षण करें। अन्यथा, बस एक पासा रोल करें और सूचीबद्ध में से एक चुनें (अपने लक्षित प्लेटफ़ॉर्म पर उपयोग की आसानी से भारित)।

और trshiv's link से, ऐसा लगता है जैसे होर्ड, टीसीएमएलओसी, और पीटीएमएलोक सभी गति के लिए मोटे तौर पर तुलनीय हैं। कुल मिलाकर, टीटीएमएलओसी को जितना संभव हो उतना छोटा कमरा लेने के लिए ऑप्टिमाइज़ किया गया है, होर्ड को स्पीड + मेमोरी उपयोग के व्यापार-बंद के लिए अनुकूलित किया गया है, और टीसीएमएलओसी को शुद्ध गति के लिए अनुकूलित किया गया है।

+1

trshiv का लिंक है [यहां] (http://dsc.sun.com/solaris/articles/multiproc/multiproc।एचटीएमएल) अब –

+0

दोनों लिंक अब टूट गए हैं – Assimilater

4

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

+0

यदि यह एक बहुप्रचारित वातावरण है, तो आवंटन ढेर केवल छोटी मात्रा में बहुत छोटी वस्तुओं के लिए जाने का तरीका है - आप धागे पर ढेर के आकार को हिट नहीं करना चाहते हैं, क्योंकि तब आपको सामान्य स्मृति भ्रष्टाचार के समान समस्या मिलती है। – hazzen

+0

हाँ, मैं हज़ेन से सहमत हूं। थ्रेड-लोकल स्टोरेज समेत आवंटन स्टैक मेमोरी भ्रष्टाचार का कारण बन सकता है यदि आप बड़े पैमाने पर बड़े आकार के आकार से निपटते हैं। – trshiv

3

हमने एक परियोजना पर होर्ड का उपयोग किया जहां मैंने कुछ साल पहले काम किया था। यह बहुत अच्छा काम लग रहा था। मेरे पास अन्य आवंटकों के पास कोई अनुभव नहीं है। यह अलग-अलग प्रयास करने और लोड परीक्षण करने के लिए बहुत आसान होना चाहिए, नहीं?

5

मैं व्यक्तिगत रूप से एक बहुप्रचारित आवंटक के रूप में ptmalloc को प्राथमिकता और अनुशंसा करता हूं। होर्ड अच्छा है, लेकिन मूल्यांकन में मेरी टीम कुछ साल पहले होर्ड और पीटीएमएलोक के बीच हुई थी, ptmalloc बेहतर था। जो मुझे पता है, ptmalloc कई सालों से आसपास रहा है और इसे बहुसंख्यक आवंटक के रूप में व्यापक रूप से उपयोग किया जाता है।

आपको this comparison उपयोगी मिल सकता है।

+0

लिंक किया गया आलेख [यहां] [http://dsc.sun.com/solaris/articles/multiproc/multiproc.html) ले जाया गया है। –

11

वास्तव में यह बताने का एकमात्र तरीका है कि कौन सा मेमोरी आवंटक आपके आवेदन के लिए सही है, कुछ प्रयास करना है। उल्लिखित सभी आवंटकों को स्मार्ट लोगों द्वारा लिखा गया था और दूसरों को एक विशेष माइक्रोबेंमार्क या किसी अन्य पर हराया जाएगा। यदि आपका पूरा आवेदन पूरे दिन करता है तो थ्रेड ए में एक 8 बाइट खंड मॉलोक होता है और इसे थ्रेड बी में मुक्त करता है, और किसी भी चीज़ को संभालने की आवश्यकता नहीं होती है, तो आप शायद एक मेमोरी आवंटक लिख सकते हैं जो पैंट को किसी भी से हटा देता है अब तक सूचीबद्ध हैं। यह बहुत अधिक के लिए बहुत उपयोगी नहीं होगा। :)

मुझे होर्ड का उपयोग करके कुछ अनुभव है जहां मैं काम करता हूं (पर्याप्त है कि हालिया 3.8 रिलीज में संबोधित अधिक अस्पष्ट बगों में से एक उस अनुभव के परिणामस्वरूप पाया गया था)।यह एक बहुत अच्छा आवंटक है - लेकिन आपके लिए कितना अच्छा है, आपके वर्कलोड पर निर्भर करता है। और आपको अपने कोड को जीपीएल किए बिना वाणिज्यिक परियोजना में इसका उपयोग करने के लिए होर्ड (हालांकि यह बहुत महंगा नहीं है) के लिए भुगतान करना होगा।

बहुत थोड़ी देर के लिए पीटीएमएलओसी 2 ग्लिबैक के मॉलोक के पीछे आवंटक रहा है, और इसलिए यह अविश्वसनीय रूप से व्यापक रूप से उपयोग और परीक्षण किया जाता है। यदि सभी चीजों के ऊपर स्थिरता महत्वपूर्ण है, तो यह एक अच्छी पसंद हो सकती है, लेकिन आपने इसे अपनी सूची में उल्लेख नहीं किया है, इसलिए मुझे लगता है कि यह बाहर है। कुछ वर्कलोड के लिए, यह भयानक है - लेकिन यह किसी भी सामान्य उद्देश्य मॉलोक के बारे में भी सच है।

यदि आप इसके लिए भुगतान करना चाहते हैं (और कीमत मेरे अनुभव में उचित है), SmartHeap SMP भी एक अच्छा विकल्प है। उल्लिखित अधिकांश अन्य आवंटकों को ड्रॉप-इन मॉलोक/मुफ्त नए/हटाए गए प्रतिस्थापन के रूप में डिज़ाइन किया गया है जो LD_PRELOAD'd हो सकते हैं। SmartHeap का भी इस तरह उपयोग किया जा सकता है, लेकिन इसमें एक संपूर्ण आवंटन-संबंधित API भी शामिल है जो आपको अपने आवंटकों को आपके दिल की सामग्री में सुदृढ़ करने देता है। परीक्षणों में हमने (फिर से, किसी विशेष एप्लिकेशन के लिए बहुत विशिष्ट) किया है, स्मार्टहेप ड्रॉप-इन मॉलोक प्रतिस्थापन के रूप में कार्य करते समय प्रदर्शन के लिए होर्ड के समान था; दोनों के बीच असली अंतर अनुकूलन की डिग्री है। आप बेहतर प्रदर्शन कर सकते हैं कम सामान्य उद्देश्य के लिए आपको अपने आवंटक की आवश्यकता है।

और आपके उपयोग के मामले के आधार पर, एक सामान्य उद्देश्य बहुप्रचारित आवंटक ऐसा नहीं हो सकता है जिसे आप उपयोग करना चाहते हैं; यदि आप लगातार & फ्रीिंग ऑब्जेक्ट्स हैं जो सभी एक ही आकार के हैं, तो आप केवल एक साधारण स्लैब आवंटक लिखना चाहेंगे। स्लैब आवंटन का उपयोग लिनक्स कर्नेल में कई स्थानों पर किया जाता है जो उस वर्णन में फिट होते हैं। (मैं आपको कुछ और उपयोगी लिंक दूंगा, लेकिन मैं एक "नया उपयोगकर्ता" हूं और स्टैक ओवरफ्लो ने फैसला किया है कि नए उपयोगकर्ताओं को भी एक ही जवाब में मददगार नहीं है। Google काफी अच्छी तरह से मदद कर सकता है, हालांकि ।)

2

शायद अपने प्रश्न के लिए एक देर प्रतिक्रिया है, लेकिन

क्यों mallocs करने के लिए यदि आप प्रदर्शन देहाती उतार है?

प्रारंभिक समय में एक बड़ी मेमोरी विंडो का एक मॉलोक करने का बेहतर तरीका होगा और फिर light weight Memory manager के साथ आएगा जो lease out the memory chunks at run time होगा।

यह आपके ढेर विस्तार पर सिस्टम कॉल की किसी भी संभावना से बचाता है।

2

आप ltalloc (फास्ट पूल आवंटक की गति के साथ सामान्य उद्देश्य वैश्विक स्मृति आवंटक) का प्रयास कर सकते हैं।

3

लॉकलेसिंक आवंटक बहुत अच्छा है और यदि आपके कोई प्रश्न हैं तो डेवलपर उत्तरदायी है। इस्तेमाल किए गए कुछ अनुकूलन चालों के बारे में उन्होंने एक लेख लिखा है, यह एक दिलचस्प पढ़ा है: http://locklessinc.com/articles/allocator_tricks/। मैंने अतीत में उत्कृष्ट परिणामों के साथ इसका इस्तेमाल किया है।

enter image description here