रूबी में मेमोरी आवंटन कैसे काम करता है?
रूबी को मेमोरी टुकड़ों में मिलती है, जिन्हें पेज कहा जाता है, यहां नई वस्तुएं सहेजी जाती हैं।
फिर…
जब ये पृष्ठ भर जाते हैं, तो अधिक स्मृति की आवश्यकता होती है।
रूबी ऑपरेटिंग सिस्टम से 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 प्रदर्शन उपकरण) का उपयोग करना सीख लिया है।
पढ़ने के लिए धन्यवाद!