OS में मेमोरी बैलूनिंग


13

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

क्या प्रक्रियाओं के लिए एक ओएस स्तर पर लागू करना संभव है (मैं मुख्य रूप से स्मृति के दोहराव के लिए सोच रहा था जब एक ही साइट पर कई टैब के साथ क्रोमियम के साथ ब्राउज़ करना), क्या यह पहले से ही लागू किया गया है?

जवाबों:


14

वास्तव में, आपने जो भ्रमित किया है वह गुब्बारा और 'समान-पृष्ठ-विलय' है। मैं भेद स्पष्ट करने के लिए दोनों पर विस्तृत चर्चा करने का प्रयास करूँगा।

मेमोरी गुब्बारा

यह सुनिश्चित करने के लिए एक चाल है कि अतिथि वर्चुअल मशीन को आवंटित की गई कुछ मेमोरी किसी अन्य अतिथि या होस्ट (स्वयं कैश) द्वारा उपयोग करने योग्य है । यह निम्नलिखित तरीके से किया जाता है:

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

तब यह मेजबान कर्नेल को सूचित करता है, कि यह वास्तव में इन मेमोरी पेजों को कोर से हटा सकता है, कि वे अतिथि में उपयोग नहीं होने जा रहे हैं (जब तक कि अतिथि कुछ मेमोरी दबाव का अनुभव नहीं करता है, जिस बिंदु पर गुब्बारा अपस्फीति करेगा, और उपयोग करेगा ये रेंज फिर से)।

अंत में, कर्नेल किसी अन्य अतिथि को ठीक उसी मेमोरी को आवंटित कर सकता है, और यदि मेहमान बहुत सारी मुफ्त मेमोरी के साथ चल रहे हैं, तो पूरी मेमोरी उपयोग को और अधिक कुशल बनाते हैं।

वही पेज मर्जिंग

यह तकनीक समान मेमोरी पेजों की पहचान करती है, कि किसी कारण से पहले से ही कॉपी-ऑन-राइट के साथ 'अर्ध-रीड-ओनली' चिह्नित नहीं है, और उन्हें इस तरह चिह्नित करता है।

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

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

यही वजह है कि समय-समय पर समान स्मृति पृष्ठों के लिए पूरे सिस्टम को स्कैन कर सकते हैं है - समय की सबसे, वे समान होगा भर में , अतिथि ओएस नहीं हर एक के भीतर - अतिथि गिरी एक सभ्य स्मृति यह सीमा के भीतर साफ रखने का काम करता है। इस प्रकार, विशिष्ट वीएम वातावरण में, जहां एक होस्ट कर्नेल 50+ मेहमानों को संभालता है, मेमोरी सेविंग काफी पर्याप्त हो सकती है।

दोनों एक बार में

समान सिस्टम के लिए बहुत अधिक मेमोरी ओवरकमिट को प्राप्त करने के साथ बैलूनिंग और समान-पृष्ठ-विलय बहुत अच्छी तरह से मौजूद हो सकते हैं।


अपने प्रश्न का उत्तर देने के लिए - कभी-कभी-पृष्ठ-विलय एक OS स्तर पर सक्षम हो सकता है। यह पृष्ठ साझाकरण के साथ किया जाता है जिसकी व्याख्या की जाती है, और इस तरह एक ही बैकिंग फ़ाइल के बिना समान होने का अंत हो सकता है।

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

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

यह मोबाइल सिस्टम पर अलग है। उदाहरण के लिए, Android, बड़े पैमाने पर विभिन्न अनुप्रयोगों के बीच समान कोड को कम करने के लिए KSM को नियुक्त करता है।

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

https://www.kernel.org/doc/Documentation/vm/ksm.txt


3
समान-पृष्ठ विलय को हाइपरविजर (और इसकी आयु) के आधार पर 'ट्रांससेन्ट मेमोरी' के रूप में भी जाना जाता है।
टिम पोस्ट

धन्यवाद, मैं देखता हूं कि केएसएम को आवेदन के बारे में पता होना चाहिए, और एक (त्वरित) खोज से, क्रोमियम अब तक इसका समर्थन नहीं करता है। मुझे पता है कि बायनेरिज़ काटे जाते हैं, लेकिन मैं ज्यादातर जेआईटी आउटपुट और कच्ची स्क्रिप्ट्स की बात कर रहा हूं, जो मेरी रैम पर भारी दबाव

क्रोमियम में कच्ची लिपियों को भी घटाया जाता है - वे सभी अन्य वेब ऑब्जेक्ट्स की तरह ही डिस्क कैश में लैंड होती हैं, और डिस्क कैश मैप की जाती हैं, पढ़ी नहीं जाती हैं।
19

कच्ची लिपियों की मैपिंग की जाती है, लेकिन यहां तक ​​कि सामान्य लिपियों (जैसे कि jQuery और Angular.js) को भी कैश में दोहराया जाता है और वे एक दूसरे के साथ मेल नहीं खाते हैं क्योंकि विभिन्न सर्वर सर्वर पर CDN का भारी उपयोग और स्क्रिप्ट फ़ाइलों का सटीक प्रतिकृतियां हैं।

यह शायद चैट में समाप्त होना चाहिए, लेकिन मुझे आपके आंकड़े लिनक्स के केएसएम से देखना अच्छा लगेगा।
११
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.