मेमोरी आर्किटेक्चर: एरलांग बनाम जावा

मैंने एक बहुत ही दिलचस्प लेख पढ़ा, "मेमोरी मैनेजमेंट स्ट्रेटेजीज़ फॉर एरलेंग वीएम"। इसे जेस्पर विल्हेमसन द्वारा एक शोध प्रबंध के रूप में लिखा गया था। मैंने सोचा कि एरलांग के स्मृति प्रबंधन और ओरेकल के जावा वीएम के बीच अंतर पर चर्चा करना अच्छा होगा।

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

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

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

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

लेकिन यह पोस्ट Erlang प्रोग्रामिंग मॉडल के बारे में नहीं है। वह इस बारे में है कि एरलांग वीएम मेमोरी के साथ कैसे काम करता है।

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

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

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

संदेश का ढेर संदेशों में प्रयुक्त डेटा के लिए है। संदेशों को प्रक्रियाओं के बीच भी वितरित किया जाता है। संदेश स्ट्रीम भेजने वाले से गंतव्य स्थान तक एक पॉइंटर को कॉपी करके धाराओं के बीच स्थानांतरित किए जाते हैं। संदेश डेटा को संदेशों के ढेर में संग्रहीत किया जाता है।

मैं एरलंग मेमोरी मॉडल से प्रभावित था। यह मुझे जावा एकल-ढेर मॉडल की तुलना में बहुत अधिक स्केलेबल लगता है। भाषा के शब्दार्थ और एरलंग मेमोरी मॉडल पूरी तरह से संयुक्त हैं।

उदाहरण के लिए, सरल तथ्य जो ढेर बंद होते हैं, गतिरोध की उपस्थिति को समाप्त करते हैं, और इसलिए, उनके लिए जाँच से।

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

जावा को एरलांग से बहुत कुछ सीखना है। हालांकि, जावा में कुछ अच्छी चीजें हैं जो मुझे याद आती हैं जब बड़े एर्लांग सिस्टम के साथ काम करते हैं।

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

मेमोरी ग्रोथ को रोकने के लिए Erlang VM में कोई मैकेनिज्म नहीं हैं। एक वर्चुअल मशीन खुशी से इतनी मेमोरी आवंटित करती है कि सिस्टम स्वैप में बदल जाता है और वर्चुअल मेमोरी से बाहर चला जाता है। यह मशीन को KVM कंसोल के माध्यम से एक्सेस करने पर भी जमने का कारण बन सकता है। अतीत में, हमें फिर से उन तक पहुँच प्राप्त करने के लिए कारों को ओवरलोड करना पड़ा।

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

इसका मतलब यह है कि जब आप एक उत्पादन वातावरण में "बड़े" एर्लांग वीएम चलाते हैं, तो आपको एक ऑपरेटिंग सिस्टम स्तर की जांच की आवश्यकता होती है जो कि बहुत अधिक मेमोरी का उपयोग करने पर प्रक्रिया को मार देगा।

इस प्रकार, मेरा मानना ​​है कि एर्लैंग का निजी हीप मेमोरी मॉडल एक बहुत शक्तिशाली उपकरण हो सकता है। यह रनटाइम पर लॉकिंग तंत्र की संपूर्ण कक्षाओं को समाप्त कर देता है, जिसका अर्थ है कि यह जावा से बेहतर होगा। दूसरी ओर, जावा की तंग मेमोरी सीमा आपको एक जीत देती है जब आपका सिस्टम पूरी तरह से चित्रित होता है या DDoS के तहत।

खैर, और अंत में:

Erlang VM के लिए कमांड लाइन विकल्प हैं जो आपको निजी हीप टोपोलॉजी का उपयोग करने से साझा हीप टोपोलॉजी का उपयोग करने में सक्षम बनाते हैं।

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

संदर्भ:
जावा-मॉनीटर पर हमारे JCG साथी Kees Jan Koster से Erlang memory आर्किटेक्चर बनाम Java मेमोरी आर्किटेक्चर

हैप्पी कोडिंग! शेयर करना ना भूले!
बायरन

= - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - =
मूल के लिंक में दिलचस्प (और नापसंद) टिप्पणियां हैं, जिन्हें रुचि रखने वालों को पढ़ना चाहिए!

Source: https://habr.com/ru/post/In117538/


All Articles