vm.min_free_kbytes कैसे काम करता है
सिस्टम के उचित कामकाज को सुनिश्चित करने के लिए सिस्टम द्वारा मेमोरी आवंटन की आवश्यकता हो सकती है। यदि कर्नेल सभी मेमोरी को आवंटित करने की अनुमति देता है तो यह ओएस को सुचारू रूप से चलाने के लिए नियमित संचालन के लिए मेमोरी की आवश्यकता होने पर संघर्ष कर सकता है। यही कारण है कि कर्नेल ट्यून करने योग्य vm.min_free_kbytes प्रदान करता है। ट्यून करने योग्य कर्नेल के मेमोरी मैनेजर को कम से कम X मात्रा में फ्री मेमोरी रखने के लिए बाध्य करेगा। यहाँ से आधिकारिक परिभाषा है लिनक्स कर्नेल प्रलेखन : इसका उपयोग Linux VM को न्यूनतम किलोबाइट मुक्त रखने के लिए बाध्य करने के लिए किया जाता है। VM इस नंबर का उपयोग सिस्टम में प्रत्येक लोमेम ज़ोन के लिए वॉटरमार्क [WMARK_MIN] मान की गणना करने के लिए करता है। प्रत्येक लोमेम ज़ोन को उसके आकार के आधार पर कई आरक्षित मुक्त पृष्ठ मिलते हैं। PF_MEMALLOC आवंटन को संतुष्ट करने के लिए कुछ न्यूनतम मेमोरी की आवश्यकता होती है; यदि आप इसे 1024KB से कम पर सेट करते हैं, तो आपका सिस्टम सूक्ष्म रूप से टूट जाएगा, और उच्च भार के तहत गतिरोध का खतरा होगा। इसे बहुत अधिक सेट करने से आपकी मशीन तुरंत OOM हो जाएगी।
vm.min_free_kbytes वर्क्स को मान्य करना
यह जांचने के लिए कि min_free_kbytes की सेटिंग डिज़ाइन के अनुसार काम कर रही है, मैंने केवल 3.75 GB RAM के साथ एक linux वर्चुअल इंस्टेंस बनाया है। सिस्टम का विश्लेषण करने के लिए नीचे दिए गए फ्री कमांड का उपयोग करें:
#नि: शुल्क -एम
एमबी में मूल्यों को मुद्रित करने के लिए -एम ध्वज का उपयोग करके उपरोक्त मुफ्त मेमोरी उपयोगिता को देखते हुए। कुल मेमोरी 3.5 से 3.75 जीबी मेमोरी है। 121 एमबी मेमोरी का उपयोग किया जाता है, 3.3 जीबी मेमोरी मुफ्त है, 251 एमबी बफर कैश द्वारा उपयोग किया जाता है। और 3.3GB मेमोरी मिलती है.
अब हम vm.min_free_kbytes के मान को बदलने जा रहे हैं और देखते हैं कि सिस्टम मेमोरी पर क्या प्रभाव पड़ता है। हम नीचे दिए गए अनुसार कर्नेल पैरामीटर मान को बदलने के लिए proc वर्चुअल फाइल सिस्टम में नए मान को प्रतिध्वनित करेंगे:
# इको १५००००० > /proc/sys/vm/min_free_kbytes# sysctl vm.min_free_kbytes
आप देख सकते हैं कि पैरामीटर को लगभग 1.5 जीबी में बदल दिया गया था और प्रभावी हो गया है। आइए अब का उपयोग करें नि: शुल्क सिस्टम द्वारा मान्यता प्राप्त किसी भी परिवर्तन को देखने के लिए फिर से कमांड करें।
#नि: शुल्क -एमफ्री मेमोरी और बफर कैश कमांड द्वारा अपरिवर्तित रहते हैं, लेकिन मेमोरी की मात्रा इस प्रकार प्रदर्शित होती है उपलब्ध 3327 से घटाकर 1222 एमबी कर दिया गया है। जो पैरामीटर में 1.5 जीबी मिनट फ्री मेमोरी में बदलाव की अनुमानित कमी है।
अब 2GB डेटा फ़ाइल बनाते हैं और फिर देखते हैं कि उस फ़ाइल को बफर कैश में पढ़ने से मानों का क्या प्रभाव पड़ता है। नीचे बैश स्क्रिप्ट की 2 पंक्तियों में 2GB डेटा फ़ाइल बनाने का तरीका बताया गया है। स्क्रिप्ट dd कमांड का उपयोग करके एक 35MB रैंडम फ़ाइल उत्पन्न करेगी और फिर इसे 70 बार एक नए में कॉपी करेगी डेटा फ़ाइल आउटपुट:
# dd if=/dev/random of=/root/d1.txt count=1000000# के लिए मैं `seq 1 70` में; गूंज $ मैं; कैट /रूट/d1.txt >> /root/data_file; किया हुआ
आइए फ़ाइल को पढ़ें और नीचे दिए गए अनुसार फ़ाइल को /dev/null पर पढ़कर और पुनर्निर्देशित करके सामग्री को अनदेखा करें:
#बिल्लीडेटा फ़ाइल> /देव/शून्यठीक है, युद्धाभ्यास के इस सेट के साथ हमारी सिस्टम मेमोरी का क्या हुआ है, आइए इसे अभी देखें:
#नि: शुल्क -एमउपरोक्त परिणामों का विश्लेषण। हमारे पास अभी भी 1.8 जीबी की मुफ्त मेमोरी है इसलिए कर्नेल ने हमारी min_free_kbytes सेटिंग के कारण मेमोरी के एक बड़े हिस्से को सुरक्षित रखा है। बफर कैश ने 1691 एमबी का उपयोग किया है, जो कि हमारी डेटा फ़ाइल के कुल आकार से कम है जो कि 2.3 जीबी है। जाहिरा तौर पर संपूर्ण डेटा फ़ाइल बफर कैश के लिए उपयोग करने के लिए उपलब्ध स्मृति की कमी के कारण कैश में संग्रहीत नहीं किया जा सका। हम पुष्टि कर सकते हैं कि पूरी फ़ाइल कैश में संग्रहीत नहीं है, लेकिन फ़ाइल को पढ़ने के लिए बार-बार प्रयास करने का समय है। यदि इसे कैश किया गया था, तो फ़ाइल को पढ़ने में कुछ सेकंड का समय लगेगा। चलो यह कोशिश करते हैं।
# समय बिल्ली data_file > /dev/null# समय बिल्ली data_file > /dev/null
फ़ाइल को पढ़ने में लगभग 20 सेकंड का समय लगा, जिसका अर्थ है कि यह लगभग निश्चित रूप से सभी कैश्ड नहीं है।
एक अंतिम सत्यापन के रूप में vm.min_free_kbytes को कम करते हैं ताकि पेज कैश को संचालित करने के लिए अधिक जगह मिल सके और हम कैशे को काम करते हुए देखने की उम्मीद कर सकते हैं और फ़ाइल बहुत तेजी से पढ़ रही है।
# इको ६७५८४ > /proc/sys/vm/min_free_kbytes# समय बिल्ली data_file > /dev/null
# समय बिल्ली data_file > /dev/null
कैशिंग के लिए उपलब्ध अतिरिक्त मेमोरी के साथ, फ़ाइल पढ़ने का समय 20 सेकंड पहले से घटकर .364 सेकंड हो गया है, यह सब कैश में है।
मैं एक और प्रयोग करने के लिए उत्सुक हूं। वास्तव में उच्च vm.min_free_kbytes सेटिंग के सामने एक सी प्रोग्राम से मेमोरी आवंटित करने के लिए मॉलोक कॉल के साथ क्या होता है। क्या यह मॉलोक विफल हो जाएगा? क्या सिस्टम मर जाएगा? हमारे प्रयोगों को फिर से शुरू करने के लिए पहले vm.min_free_kbytes सेटिंग को वास्तव में उच्च मान पर रीसेट करें:
#फेंक दिया 1500000 > /प्रतिशत/sys/वीएम/min_free_kbytesआइए फिर से हमारी मुक्त स्मृति को देखें:
सैद्धांतिक रूप से हमारे पास 1.9 जीबी मुफ्त और 515 एमबी उपलब्ध है। आइए कुछ मेमोरी का उपयोग करने के लिए स्ट्रेस-एनजी नामक एक स्ट्रेस टेस्ट प्रोग्राम का उपयोग करें और देखें कि हम कहाँ विफल होते हैं। हम vm टेस्टर का उपयोग करेंगे और 1 GB मेमोरी आवंटित करने का प्रयास करेंगे। चूंकि हमने 3.75 जीबी सिस्टम पर केवल 1.5 जीबी आरक्षित किया है, मुझे लगता है कि यह काम करना चाहिए।
# स्ट्रेस-एनजी --vm 1 --vm-बाइट्स 1G --टाइमआउट 60sतनाव: जानकारी:[१७५३७]प्रेषण हॉग:1वीएम
तनाव: जानकारी:[१७५३७]कैश आवंटित: डिफ़ॉल्ट कैश आकार: ४६०८०K
तनाव: जानकारी:[१७५३७]सफल रन पूरा हुआमें60.09s(1मिनट,0.09सूखा)
# स्ट्रेस-एनजी --vm 2 --vm-बाइट्स 1G --टाइमआउट 60s
# स्ट्रेस-एनजी --vm 3 --vm-बाइट्स 1G --टाइमआउट 60s
आइए इसे और अधिक श्रमिकों के साथ फिर से प्रयास करें, हम 1, 2, 3, 4 श्रमिकों को आजमा सकते हैं और किसी बिंदु पर इसे विफल होना चाहिए। मेरे परीक्षण में यह 1 और 2 श्रमिकों के साथ उत्तीर्ण हुआ लेकिन 3 श्रमिकों के साथ विफल रहा।
आइए vm.min_free_kbytes को कम संख्या में रीसेट करें और देखें कि क्या यह हमें 3.75GB सिस्टम पर 1GB के साथ 3 मेमोरी स्ट्रेसर्स चलाने में मदद करता है।
# इको ६७५८४ > /proc/sys/vm/min_free_kbytes# स्ट्रेस-एनजी --vm 3 --vm-बाइट्स 1G --टाइमआउट 60s
इस बार यह बिना किसी त्रुटि के सफलतापूर्वक चला, मैंने बिना किसी समस्या के दो बार कोशिश की। इसलिए मैं निष्कर्ष निकाल सकता हूं कि मॉलोक के लिए अधिक मेमोरी उपलब्ध होने का एक व्यवहारिक अंतर है, जब vm.min_free_kbytes मान कम मान पर सेट होता है।
vm.min_free_kbytes के लिए डिफ़ॉल्ट सेटिंग
मेरे सिस्टम पर सेटिंग के लिए डिफ़ॉल्ट मान ६७५८४ है जो सिस्टम पर लगभग १.८% RAM या ६४ एमबी है। भारी थ्रैश्ड सिस्टम पर सुरक्षा कारणों से मैं अधिक आरक्षित मुक्त मेमोरी की अनुमति देने के लिए इसे शायद 128MB तक बढ़ा सकता हूं, हालांकि औसत उपयोग के लिए डिफ़ॉल्ट मान पर्याप्त समझदार लगता है। आधिकारिक दस्तावेज मूल्य को बहुत अधिक बनाने के बारे में चेतावनी देते हैं। इसे सिस्टम रैम के ५ या १०% पर सेट करना शायद सेटिंग का इच्छित उपयोग नहीं है, और यह बहुत अधिक है।
रिबूट से बचने के लिए vm.min_free_kbytes सेट करना
यह सुनिश्चित करने के लिए कि सेटिंग रीबूट से बच सकती है और रीबूट करते समय डिफ़ॉल्ट मानों पर पुनर्स्थापित नहीं होती है, /etc/sysctl.conf फ़ाइल में वांछित नया मान डालकर sysctl सेटिंग को स्थिर बनाना सुनिश्चित करें।
निष्कर्ष
हमने देखा है कि vm.min_free_kbytes linux कर्नेल ट्यूनेबल को संशोधित किया जा सकता है और यह सुनिश्चित करने के लिए सिस्टम पर मेमोरी आरक्षित कर सकता है कि सिस्टम अधिक स्थिर है, विशेष रूप से भारी उपयोग और भारी मेमोरी आवंटन के दौरान। डिफ़ॉल्ट सेटिंग्स थोड़ी बहुत कम हो सकती हैं, विशेष रूप से उच्च मेमोरी सिस्टम पर और इसे सावधानी से बढ़ाने पर विचार किया जाना चाहिए। हमने देखा है कि इस ट्यूनेबल द्वारा आरक्षित मेमोरी ओएस कैश को सभी मेमोरी का उपयोग करने से रोकती है और कुछ मॉलोक ऑपरेशंस को सभी मेमोरी का उपयोग करने से भी रोकती है।