जब मेरे पास अभी भी अप्रयुक्त रैम है, तो मेरे कुछ स्वैप स्थान का उपयोग क्यों किया जा रहा है?


9

एक समस्या की तुलना में अधिक जिज्ञासा; और, मैं मानता हूं, एक शर्मनाक बुनियादी सवाल:

मैंने देखा है कि कई मौकों पर, मेरी लिनक्स मशीन पर ~ ~ 500MB स्वैप स्पेस का उपयोग होगा, जबकि मेरे पास ~ 600MB अप्रयुक्त रैम है।

मेरी भोली उच्च-स्तरीय समझ थी, जब तक रैम समाप्त नहीं होती है तब तक स्वैप स्पेस किक नहीं करता है।

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

जिससे सवाल उठता है कि कर्नेल पूर्व स्वैप्ट स्पेस का उपयोग क्यों करेगा? क्या यह कुछ प्रदर्शन ट्यूनिंग एल्गोरिथ्म का हिस्सा है? क्या यह स्मृति के डिस्क भागों को स्वैप कर रहा है कि इसे कम से कम एक्सेस किया जा सकता है (एक LRU स्कीम, शायद)? यदि ऐसा है, तो यह सिर्फ रैम में सब कुछ छोड़ने के लिए समझ में नहीं आता है, और केवल जब थकावट के पास, तब और तब केवल LRU भागों को RAM से स्वैप स्थान पर स्वैप करें?

मुझे स्पष्ट करना चाहिए, मेरे लिनक्स सर्वर में 2GB रैम और 2GB स्वैप स्थान है।


1
इस प्रश्न को बंद करने के लिए 4 वोट क्यों?

2
@ ऐरन: ऐसा नहीं है कि आपके पास एक बुरा सवाल है। आपने सिस्टम प्रबंधन के संदर्भ में इसे केवल इसलिए बनाया है ताकि यह बिजली उपयोगकर्ताओं या सर्वर प्रशासकों के साथ बेहतर रूप से फिट हो। कि आप इसके बारे में आश्चर्यचकित हैं क्योंकि एक जिज्ञासा शक्ति उपयोगकर्ता POV की तरह लगती है।

जवाबों:


11

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


7

यह अग्रिम में चीजों को स्वैप करने के लिए समझ में आता है जब से आपको वास्तव में मेमोरी की आवश्यकता होती है, आपको तब तक इंतजार नहीं करना होगा जब तक कि डिस्क एक्सेस के साथ कर्नेल नहीं किया जाता है।

उदाहरण के लिए, मान लें कि आप एक बड़ी छवि खोलना चाहते हैं। जब छवि लोड होती है, तो यह 300MB रैम लेता है। यदि कर्नेल सभी रैम का उपयोग कर सकता है, तो आपकी छवि को लोड करने के लिए यह आवश्यक है कि कर्नेल रैम से डिस्क में 200MB स्थानांतरित करता है। यदि यह रैम को पहले से खाली कर देता है, तो आप कुछ मिलीसेकंड बचाते हैं।


7

2 कारण:

  1. (@dtrosset) लिनक्स अधिक कैश और बफ़र्स देने के लिए अप्रयुक्त बिट्स प्रोग्रामों की अदला-बदली करेगा।
  2. आपने अतीत में अधिक मेमोरी का उपयोग किया हो सकता है, और कुछ सामानों की अदला-बदली की जा सकती है, और इसकी अदला-बदली नहीं की गई है, क्योंकि इसका उपयोग नहीं किया गया है, भले ही जो कुछ भी इसे बाहर करने के लिए मजबूर हो गया हो।

1

अन्य उत्तरों के अलावा, आप किसी भी आवंटित मेमोरी के लिए बैकिंग की आवश्यकता के लिए लिनक्स को कॉन्फ़िगर कर सकते हैं, भले ही प्रोग्राम इसका उपयोग न करें।

हालाँकि, स्मृति को ओवरकम करना और OOM किलर से डरना लिनक्स अनुभव के आवश्यक अंग नहीं हैं। बस sysctl पैरामीटर vm / overcommit_memory को 2 पर सेट करने से ओवरकॉमी व्यवहार बंद हो जाता है और OOM किलर को हमेशा के लिए बंद कर देता है। अधिकांश स्थितियों के लिए पर्याप्त स्वैप फ़ाइल प्रदान करने के लिए अधिकांश आधुनिक सिस्टम में पर्याप्त डिस्क स्थान होना चाहिए। जब पालतू स्मृति समाप्त हो जाती है तो पालतू प्रक्रियाओं को मारने से रोकने की कोशिश करने के बजाय, यह पूरी तरह से स्थिति से बचने के लिए आसान हो सकता है। [ OOM हत्यारे से छुटकारा ]

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

क्योंकि प्रक्रियाओं को अपने स्वयं के पते के स्थान या "दृश्य" के साथ प्रस्तुत किया जाता है (यह पहली जगह में स्वैप कैसे काम करता है), कर्नेल में बहुत सारे रास्ते हैं जो इसे प्रबंधित करता है। उपरोक्त लिंक किए गए लेख से भी एक कांटा उदाहरण का उपयोग करना, क्योंकि यह स्मृति पृष्ठों को साझा करने की तुलना में बहुत अधिक होने की संभावना है, क्योंकि यह अप्रयुक्त स्मृति की एक बड़ी मात्रा को नए सिरे से आवंटित करने के लिए है, मेमोरी को कॉपी-ऑन-राइट पर आवंटित किया जा सकता है, जिससे स्वैप उपयोग की संख्या बढ़ जाती है। जब इसे वास्तव में लिखा जाता है (जो कि नहीं हो सकता है), तो उस "प्रतिबद्ध स्वैप" को किसी भी अप्रयुक्त रैम (तब रैम का उपयोग बढ़ाना और स्वैप का उपयोग कम करना) से बदला जा सकता है। 500MB आबंटित एक प्रक्रिया की कल्पना करें जो एक मशीन पर सभी या लगभग सभी रैम के उपयोग में है। यदि स्वैप में 500MB उपलब्ध है (और डिस्क स्थान सस्ता है, तो आज की टीबी ड्राइव का 1% कितना बड़ा है ?: पी), किसी भी मेमोरी को कॉपी नहीं करना है (अभी तक)

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

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

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