Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

टीसीमॉलोक के साथ रूबी की मेमोरी आवंटन की रूपरेखा

रूबी में मेमोरी आवंटन कैसे काम करता है?

रूबी को मेमोरी टुकड़ों में मिलती है, जिन्हें पेज कहा जाता है, यहां नई वस्तुएं सहेजी जाती हैं।

फिर…

जब ये पृष्ठ भर जाते हैं, तो अधिक स्मृति की आवश्यकता होती है।

रूबी ऑपरेटिंग सिस्टम से malloc . के साथ अधिक मेमोरी का अनुरोध करती है समारोह।

यह malloc फ़ंक्शन ऑपरेटिंग सिस्टम का ही हिस्सा है, लेकिन ऐसे वैकल्पिक कार्यान्वयन हैं जिनका आप उपयोग कर सकते हैं।

उन कार्यान्वयनों में से एक Google का tcmalloc है।

TCmalloc Google प्रदर्शन टूल सूट का हिस्सा है।

रूबी कैसे मेमोरी आवंटित करती है, इसका पता लगाने के लिए आप इन टूल का उपयोग कर सकते हैं।

और LD_PRELOAD . के लिए धन्यवाद पर्यावरण चर (लिनक्स में) हम आपके सिस्टम के malloc . को बदल सकते हैं tcmalloc के साथ कार्य करें।

इसे पसंद करें :

LD_PRELOAD="/usr/lib/libtcmalloc.so" रूबी-ई "पुट्स 123"

लेकिन यह केवल पुस्तकालय को लोड करता है, यह अभी तक किसी भी डेटा संग्रह को सक्षम नहीं करता है।

आइए देखें कि यह कैसे किया जाता है।

प्रोफाइलर को सक्षम करना

आप एक अतिरिक्त पर्यावरण चर (HEAPPROFILE) के साथ tcmalloc के प्रोफाइलर को सक्षम कर सकते हैं )।

LD_PRELOAD="/usr/lib/libtcmalloc.so" HEAPPROFILE=/tmp/profile ruby ​​-e "puts 123"

यह निम्नलिखित आउटपुट उत्पन्न करेगा:

heap123Dumping हीप प्रोफ़ाइल को /tmp/profile.0001.heap पर ट्रैक करना प्रारंभ करना (बाहर निकलना, 2 MB उपयोग में है)

यहां आप एक पुष्टिकरण देखते हैं कि प्रोफाइलर सक्षम किया गया है।

फिर हम देखते हैं :

  • कार्यक्रम का आउटपुट
  • फ़ाइल नाम (profile.0001.heap )
  • हमारे प्रोग्राम द्वारा उपयोग की जाने वाली मेमोरी की मात्रा (2 MB )

इस फ़ाइल को पढ़ने के लिए आपको tcmalloc के साथ शामिल एक अन्य टूल की आवश्यकता होगी।

pprof --text `कौन सा रूबी` /tmp/profile.0001.heap | सिर -10

यह निम्नलिखित आउटपुट उत्पन्न करेगा:

कुल:2.4 एमबी 1.1 44.7% 44.7% 1.1 44.7% 0x00005570fa4df074 0.7 27.8% 72.5% 0.7 27.8% 0x00005570fa4e0c09 0.4 15.3% 87.8% 0.4 15.3% 0x00005570fa4db460 0.1 5.9% 93.7% 0.1 5.9% 0x00005570fa4 0.1 5.9% 93.7% 0.1 5.9% 0x00005570fa4 % 0x00005570fa6349a0 0.0 1.4% 98.3% 0.0 1.4% 0x00005570fa589924 0.0 0.3% 98.6% 0.0 0.3% 0x00005570fa59c4f2 0.0 0.3% 98.8% 0.0 0.3% 0x00005570fa4db48a 0.0 0.2% 99.0% 0.0 0.2% 0x00005570fa4dbaa5 0.0pre 0.2% 99.1% 0.0pre 0.2% 99.1%> 

खैर, यह सिर्फ स्मृति पतों का एक गुच्छा है! फ़ंक्शन नाम देखने में सक्षम होने के लिए आपको डिबगिंग प्रतीकों के साथ रूबी के एक संस्करण की आवश्यकता है।

तब आपको यह आउटपुट मिलेगा :

स्थानीय फ़ाइल रूबी का उपयोग करना। स्थानीय फ़ाइल /tmp/profile.0001.heap का उपयोग करना। कुल:2.9 एमबी 1.0 36.2% 36.2% 1.0 36.2% objspace_xmalloc0 0.7 26.1% 62.4% 0.7 26.1% संरेखित_मॉलोक 0.5 18.8% 81.1% 0.5 18.8% objspace_xcalloc 0.3 9.9% 91.0% 0.3 9.9% stack_chunk_alloc 0.1 3.7% 94.7% 0.1 3.7% objspace_xrealloc 0.1 2.7% 97.4% 0.1 2.7% Init_Method 0.0 1.3% 98.7% 0.0 1.7% onig_new_with_source 0.0 0.4% 99.2% 0.8 26.6% ढेर 0.2% 99.4 % 0.0 0.2% add_bitset

आप यहां देख सकते हैं कि कितनी मेमोरी आवंटित की गई थी जिसके द्वारा MRI का कार्य करता है।

यह जानना दिलचस्प है कि aligned_malloc रूबी ऑब्जेक्ट्स के लिए नए पेज आवंटित करने के लिए उपयोग किया जाने वाला फ़ंक्शन है, stack_chunk_alloc अंकन चरण के दौरान स्वयं GC द्वारा उपयोग किया जाता है, और objspace_xmalloc0 / objspace_xcalloc स्ट्रिंग्स, सरणियों और किसी भी अन्य डेटा के लिए स्थान आवंटित करें जो RVALUE . में फ़िट नहीं होता है संरचना।

अब:

TCmalloc रूबी ऑब्जेक्ट्स के बारे में कुछ भी नहीं जानता है, केवल एक चीज यह पता लगाने के लिए कि कितनी मेमोरी का अनुरोध किया गया है, malloc, calloc और realloc पर कॉल ट्रैक करें।

यदि आप रूबी स्तर पर ढेर डंप प्राप्त करना चाहते हैं तो आप ObjectSpace.dump_all का उपयोग कर सकते हैं . यह आपको एक JSON फ़ाइल देता है जिसमें आपके एप्लिकेशन में सभी लाइव ऑब्जेक्ट और उनकी मेमोरी का आकार होता है।

लेकिन क्या tcmalloc आपको दिखा सकता है कि सभी सी कार्यों का एक दृश्य है जो अंत में स्मृति का अनुरोध करता है।

pprof --web `जो रूबी' /tmp/profile.0001.heap

यह क्रोम या फ़ायरफ़ॉक्स को एक एसवीजी फ़ाइल के साथ खोलेगा जो इस तरह दिखती है:

टीसीमॉलोक के साथ रूबी की मेमोरी आवंटन की रूपरेखा

TCmalloc न केवल आपको यह अच्छी प्रोफाइलिंग क्षमता प्रदान करता है, बल्कि इसका उपयोग करके आप अपने एप्लिकेशन के प्रदर्शन को 4-9% तक बढ़ा सकते हैं! आप jemalloc भी आजमा सकते हैं , जो एक और malloc है कार्यान्वयन जिसमें एक प्रोफाइलर भी शामिल है।

सारांश

आपने रूबी दुभाषिया के स्मृति उपयोग की कल्पना और विश्लेषण करने के लिए gperftools (Google प्रदर्शन उपकरण) का उपयोग करना सीख लिया है।

पढ़ने के लिए धन्यवाद!


  1. रूबी के साथ चयन क्रम को समझना

    नोट:यह रूबी के साथ अलग-अलग सॉर्टिंग एल्गोरिदम को देखने वाली श्रृंखला का भाग 2 है। भाग 1 ने बबल प्रकार की खोज की। इस पोस्ट में, मैं रूबी के साथ सिलेक्शन सॉर्ट एल्गोरिथम को लागू करने के तरीके के बारे में बताऊंगा। सिलेक्शन सॉर्ट एक इन-प्लेस तुलना सॉर्टिंग एल्गोरिथम है। इसका मतलब यह है कि सॉर्ट किए ग

  1. टीसीमॉलोक के साथ रूबी की मेमोरी आवंटन की रूपरेखा

    रूबी में मेमोरी आवंटन कैसे काम करता है? रूबी को मेमोरी टुकड़ों में मिलती है, जिन्हें पेज कहा जाता है, यहां नई वस्तुएं सहेजी जाती हैं। फिर… जब ये पृष्ठ भर जाते हैं, तो अधिक स्मृति की आवश्यकता होती है। रूबी ऑपरेटिंग सिस्टम से malloc . के साथ अधिक मेमोरी का अनुरोध करती है समारोह। यह malloc फ़ंक्श

  1. रूबी के साथ एक पार्सर कैसे बनाएं

    पार्सिंग स्ट्रिंग्स के एक गुच्छा को समझने और उन्हें किसी ऐसी चीज़ में बदलने की कला है जिसे हम समझ सकते हैं। आप रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं, लेकिन वे हमेशा कार्य के लिए उपयुक्त नहीं होते हैं। उदाहरण के लिए, यह सामान्य ज्ञान है कि नियमित अभिव्यक्तियों के साथ HTML को पार्स करना शायद एक अच्छ