हमारे सर्वर में हमें आधी रात को कैश छोड़ने की आदत है।
sync; echo 3 > /proc/sys/vm/drop_caches
जब मैं कोड को चलाता हूं तो यह बहुत सारी रैम को मुक्त करता है, लेकिन क्या मुझे वास्तव में ऐसा करने की आवश्यकता है। क्या RAM मुफ्त नहीं है?
हमारे सर्वर में हमें आधी रात को कैश छोड़ने की आदत है।
sync; echo 3 > /proc/sys/vm/drop_caches
जब मैं कोड को चलाता हूं तो यह बहुत सारी रैम को मुक्त करता है, लेकिन क्या मुझे वास्तव में ऐसा करने की आवश्यकता है। क्या RAM मुफ्त नहीं है?
जवाबों:
आप 100% सही हैं। यह है नहीं राम को मुक्त करने के एक अच्छा अभ्यास। यह कार्गो पंथ प्रणाली प्रशासन का एक उदाहरण है।
हां, कैश साफ़ करने से RAM मुक्त हो जाएगी, लेकिन यह कर्नेल को कैश की बजाय डिस्क पर फ़ाइलों की तलाश करने का कारण बनता है जो प्रदर्शन के मुद्दों का कारण बन सकता है।
आम तौर पर जब उपलब्ध रैम कम हो जाती है तो कर्नेल कैश को साफ कर देगा। यह अक्सर pdflush का उपयोग करके डिस्क पर डस्टीटेड कंटेंट लिखता है।
इस तरह से कैश छोड़ने का कारण बेंचमार्किंग डिस्क प्रदर्शन के लिए है, और एकमात्र कारण यह मौजूद है।
I / O- गहन बेंचमार्क चलाते समय, आप यह सुनिश्चित करना चाहते हैं कि आपके द्वारा आज़माई गई विभिन्न सेटिंग्स वास्तव में डिस्क I / O कर रही हैं, इसलिए लिनक्स आपको पूर्ण रीबूट करने के बजाय कैश छोड़ने की अनुमति देता है।
प्रलेखन से उद्धृत करने के लिए :
यह फ़ाइल विभिन्न कर्नेल कैश (इनोड, डेंट्री, पेजकेक, आदि ...) के विकास को नियंत्रित करने का साधन नहीं है। ये ऑब्जेक्ट कर्नेल द्वारा स्वचालित रूप से पुनः प्राप्त हो जाते हैं जब सिस्टम पर कहीं और मेमोरी की आवश्यकता होती है।
इस फ़ाइल का उपयोग प्रदर्शन समस्याओं का कारण बन सकता है। चूँकि यह कैश्ड ऑब्जेक्ट्स को डिस्क्राइब करता है, इसलिए इसे गिराए गए ऑब्जेक्ट्स को फिर से बनाने के लिए I / O और CPU की एक महत्वपूर्ण राशि खर्च हो सकती है, खासकर यदि वे भारी उपयोग के अधीन थे। इस वजह से, परीक्षण या डिबगिंग वातावरण के बाहर उपयोग करने की अनुशंसा नहीं की जाती है।
यहां मूल विचार शायद उतना बुरा नहीं है (सिर्फ बहुत भोला और भ्रामक): कैश्ड होने वाली फाइलें हो सकती हैं, जो कि निकट भविष्य में एक्सेस होने की संभावना नहीं है, उदाहरण के लिए लॉगफाइल्स। ये "खाओ" राम, जिसे बाद में ओएस द्वारा एक या दूसरे तरीके से आवश्यक होने पर मुक्त किया जाएगा।
स्वैगनेस, फ़ाइल एक्सेस पैटर्न, मेमोरी एलोकेशन पैटर्न और कई अन्य अप्रत्याशित चीजों की आपकी सेटिंग्स के आधार पर, यह हो सकता है कि जब आप इन कैश को मुक्त नहीं करते हैं, तो उन्हें बाद में पुन: उपयोग करने के लिए मजबूर किया जाएगा, जो थोड़ा अधिक समय लेता है अप्रयुक्त स्मृति के पूल से स्मृति आवंटित करना। सबसे खराब स्थिति में लाइनक्स की स्वैंग्पी सेटिंग प्रोग्राम मेमोरी को स्वैप करने का कारण बनेगी, क्योंकि लिनक्स को लगता है कि प्रोग्राम मेमोरी की तुलना में निकट भविष्य में उन फाइलों का उपयोग करने की अधिक संभावना हो सकती है।
मेरे वातावरण में, लिनक्स बहुत बार गलत अनुमान लगाता है, और अधिकांश यूरोपीय स्टॉक एक्सचेंज (लगभग 0900 स्थानीय समय) सर्वरों की शुरुआत में वे चीजें करना शुरू कर देंगे जो वे प्रति दिन केवल एक बार करते हैं, जो कि पहले से स्वैप की गई मेमोरी में स्वैप करने की आवश्यकता होती है क्योंकि लेखन logfiles, उन्हें संपीड़ित करना, उन्हें कॉपी करना आदि कैश को उस बिंदु तक भर रहे थे जहां चीजों को स्वैप करना था।
लेकिन क्या गिरना इस समस्या का हल है? निश्चित रूप से नहीं। यहाँ समाधान क्या होगा, यह बताने के लिए कि यह क्या पता नहीं है: कि इन फ़ाइलों का अब उपयोग नहीं किया जाएगा। यह लेखन एप्लिकेशन द्वारा किया जा सकता है जैसे posix_fadvise()
कि सीएमडी लाइन टूल जैसी चीजों का उपयोग करके या vmtouch
( जैसे कि चीजों के साथ-साथ कैश फ़ाइलों का उपयोग करने के लिए भी किया जा सकता है)।
इस तरह से आप उन डेटा को हटा सकते हैं जो अब कैश से आवश्यक नहीं हैं, और जो सामान कैश किया जाना चाहिए, उसे रखें, क्योंकि जब आप सभी कैश को छोड़ देते हैं, तो डिस्क से बहुत सारा सामान फिर से भरना पड़ता है। और यह सबसे खराब संभव क्षण में: जब इसकी आवश्यकता होती है; आपके आवेदन में देरी का कारण जो ध्यान देने योग्य है और अक्सर अस्वीकार्य है।
आपके पास जो जगह होनी चाहिए वह एक प्रणाली है जो आपके मेमोरी उपयोग पैटर्न (जैसे कि कुछ स्वैपिंग है) की निगरानी करती है और फिर उसी के अनुसार विश्लेषण करती है, और उसके अनुसार कार्य करती है। समाधान दिन के अंत में vtouch का उपयोग करके कुछ बड़ी फ़ाइलों को बेदखल करने के लिए हो सकता है; यह अधिक राम जोड़ने के लिए भी हो सकता है क्योंकि सर्वर का दैनिक शिखर उपयोग बस यही है।
cat /dev/null > path/nohup.out
हर 15 मिनट में क्रोन जॉब है क्योंकि nohup.out तेजी से बढ़ रहा है। शायद linux
nohup
आपको इसे फिर से निर्देशित करना चाहिए /dev/null
। ऐसा लगता है कि आपके पास कुछ बिंदुओं पर आपके सिस्टम पर काम करने वाले कुछ बहुत ही अनुभवहीन सिस्मिन थे। देखें stackoverflow.com/questions/10408816/... कैसे निर्देशित करने के लिए के लिए nohup
के उत्पादन के लिए/dev/null
मैंने वर्चुअल मशीनों का एक समूह शुरू करते समय ड्रॉप कैश को उपयोगी माना है। या कुछ और जो कुछ डेटाबेस सर्वर जैसे बड़े पृष्ठ का उपयोग करता है।
लिनक्स में बड़े पृष्ठों को अक्सर एक पेज में डालने के लिए 2MB सन्निहित भौतिक रैम खोजने के लिए रैम को डीफ़्रैग करने की आवश्यकता होती है। सभी फ़ाइल कैश को मुक्त करना इस प्रक्रिया को बहुत आसान बनाता है।
लेकिन मैं ज्यादातर अन्य जवाबों से सहमत हूं कि हर रात फ़ाइल कैश को छोड़ने का एक अच्छा कारण नहीं है।
sysctl -w vm.nr_hugepages=...
) तब तक काम करने से मना कर देता है जब तक कि मैं पहली बार कैश (आर्क लिनक्स) नहीं छोड़ता।
यह संभव है कि यह प्रणाली को स्थिर करने के तरीके के रूप में स्थापित किया गया था जब वास्तव में समस्या को खोजने के लिए कौशल या अनुभव के साथ कोई नहीं था।
ड्रॉपिंग कैश अनिवार्य रूप से कुछ संसाधनों को मुक्त कर देगा, लेकिन इस प्रणाली को बनाने का एक साइड इफेक्ट है जो वास्तव में यह करने के लिए कठिन प्रयास कर रहा है। यदि सिस्टम स्वैप कर रहा है (डिस्क स्वैप विभाजन से पढ़ने और लिखने की कोशिश कर रहा है, जो वास्तव में सक्षम है) से तेज है तो समय-समय पर कैश को छोड़ना लक्षण को कम कर सकता है , लेकिन कारण को ठीक करने के लिए कुछ भी नहीं करता है ।
आपको यह निर्धारित करना चाहिए कि बहुत सारे मेमोरी खपत का कारण क्या है जो ड्रॉपिंग कैश को काम करता है। यह खराब कॉन्फ़िगर की गई किसी भी संख्या या केवल गलत तरीके से उपयोग की जाने वाली सर्वर प्रक्रियाओं के कारण हो सकता है। उदाहरण के लिए, एक सर्वर पर मैंने मेमोरी उपयोग को अधिकतम देखा जब एक मैगेंटो वेबसाइट 15 मिनट के अंतराल में एक निश्चित संख्या में आगंतुकों तक पहुंची। यह समाप्त होने के कारण अपाचे को कई प्रक्रियाओं को एक साथ चलाने की अनुमति देने के लिए कॉन्फ़िगर किया गया है। बहुत सारी प्रक्रियाएँ, बहुत सारी मेमोरी का उपयोग करना (Magento एक जानवर है कभी-कभी) = स्वैपिंग।
बस यह मत समझो कि यह कुछ ऐसा है जो आवश्यक है। यह पता लगाने में सक्रिय रहें कि यह क्यों है, अगर इसे गलत है, तो इसे अक्षम करने की हिम्मत रखें और सिस्टम का निरीक्षण करें - जानें कि वास्तविक समस्या क्या है और इसे ठीक करें।
लिनक्स / m68k में वास्तव में एक कर्नेल बग होता है जो किस्वैप्ड पागल हो जाता है और 100% सीपीयू (50% अगर कुछ अन्य सीपीयू-बाउंड कार्य है, जैसे कि डेबियन बाइनरी पैकेज ऑटोबुलेर - वल्गो बिल्डड - पहले से ही चल रहा है) खा सकता है, जो (सबसे अधिक) समय का, हमेशा नहीं) इस विशेष कमांड को हर कुछ घंटों में चलाकर कम किया जाए।
कहा जा रहा है कि ... आपका सर्वर संभवतः एक m68k (अटारी, अमिगा, क्लासिक मैकिंटोश, VME, Q40 / Q60, Sun3) सिस्टम ;-) नहीं है;
इस मामले में, जिस व्यक्ति ने लाइनों में डाल दिया, उसने कुछ संदिग्ध या, सबसे अच्छी, पुरानी सलाह का पालन किया, या इस बारे में विचार प्राप्त किया कि कैसे रैम का गलत इस्तेमाल किया जाना चाहिए (आधुनिक सोच वास्तव में कहती है "फ्री रैम रैम बर्बाद हुई है" और कैशिंग का सुझाव देता है) , या "खोजा" कि यह "सुधार" [sic!] एक और समस्या कहीं और (और एक उचित निर्धारण के लिए खोज करने के लिए बहुत आलसी था)।
एक कारण यह भी हो सकता है कि साइट किसी प्रकार की निगरानी चला रही हो, जो कि मुक्त राम की मात्रा की जांच करती है और प्रशासकों को चेतावनी भेजती है जब मुक्त राम एक निश्चित प्रतिशत से कम हो जाता है। अगर उस निगरानी उपकरण को पर्याप्त मात्रा में मुक्त राम गणना में कैश को शामिल नहीं करना है, तो यह गलत चेतावनी भेज सकता है; नियमित रूप से कैश को खाली करने से इन चेतावनियों को दबाया जा सकता है जबकि "असली" रैम कम होने पर टूल को नोटिस करने की अनुमति देता है।
बेशक, इस तरह की स्थिति में, असली राम गणना में कैश को शामिल करने के लिए निगरानी उपकरण को संशोधित करना असली समाधान है; कैश को साफ करना केवल एक वर्कअराउंड है, और साथ ही एक बुरा भी, क्योंकि डिस्क एक्सेस करने पर कैश जल्दी रिफिल हो जाएगा।
इसलिए, भले ही मेरी धारणा सही हो, कैश-क्लीनिंग कुछ ऐसी चीज नहीं है जो समझ में आती है, बल्कि यह किसी ऐसे व्यक्ति द्वारा किया गया काम है जो प्राथमिक समस्या को ठीक करने के लिए सक्षम नहीं है।
मैं एक रात के क्रोन नौकरी में ऐसा करने का एक प्रशंसनीय कारण सोच सकता हूं।
एक बड़ी प्रणाली पर, यह समय-समय पर कैश छोड़ने के लिए उपयोगी हो सकता है ताकि आप स्मृति विखंडन को हटा सकें।
कर्नेल पारदर्शी विशालपृष्ठ समर्थन छोटे पृष्ठों को विशालपृष्ठों में समेटने के लिए मेमोरी का आवधिक रूप से व्यापक प्रवाह करता है। पतित परिस्थितियों में यह एक या दो मिनट के सिस्टम ठहराव में परिणाम कर सकता है (इसके साथ मेरा अनुभव RHEL6 में था; उम्मीद है कि इसमें सुधार हुआ है)। छोड़ने वाले कैश से विशाल पृष्ठ स्वीपर को काम करने के लिए कुछ जगह मिल सकती है।
आप यह तर्क दे सकते हैं कि पारदर्शी विशालताओं को निष्क्रिय करने का यह एक अच्छा कारण है; OTOH आपको विश्वास हो सकता है कि पारदर्शी विशालता से समग्र प्रदर्शन में सुधार के लायक है, और दिन में एक बार अपने कैश खोने की कीमत का भुगतान करने के लायक है।
मैंने एक और कारण के बारे में सोचा है जो आप इसे करना चाहेंगे, हालांकि क्रॉन जॉब में नहीं। वर्चुअलाइजेशन सिस्टम से ठीक पहले वीएम को नए हार्डवेयर में माइग्रेट करना इसके लिए बहुत अच्छा समय होगा। नए होस्ट पर कॉपी करने के लिए कम मेमोरी कंटेंट। आपको अंततः भंडारण से पढ़ना होगा, इसके बजाय, निश्चित रूप से, लेकिन मैं शायद उस ट्रेडऑफ़ को ले जाऊंगा।
मुझे नहीं पता कि वास्तव में कोई भी साफ्टवेयर ऐसा करता है या नहीं।
बस मेरे दो सेंट जोड़ने के लिए: सिस्टम बहुत अच्छी तरह से जानता है कि ये मेमोरी पेज कैश हैं, और जब कोई एप्लिकेशन मेमोरी के लिए पूछता है तो उतना ही गिर जाएगा।
एक प्रासंगिक सेटिंग है /proc/sys/vm/swappiness
, जो मेमोरी कार्ड को छोड़ने या मेमोरी कार्ड पेज को "निष्क्रिय" करने के लिए पसंद करने के लिए नए मेमोरी आवंटन के दौरान कर्नेल को बताता है।
सवाल 2014 का है, लेकिन जैसा कि आज तक कुछ छिपे हुए सेंटोस 6.8 बैकेंड पर समस्या मौजूद है, यह अभी भी किसी के लिए उपयोगी हो सकता है।
https://github.com/zfsonlinux/zfs/issues/1548 zfs के साथ किसी समस्या का वर्णन करता है। वहां, डिस्क स्थान हटाई गई फ़ाइलों के लिए मुक्त नहीं किया गया है क्योंकि यदि nfs को zfs के शीर्ष पर उपयोग किया जाता है तो फ़ाइल के इनोड कर्नेल के इनोड कैश से नहीं गिराए जाते हैं।
बग थ्रेड से उद्धृत करने के लिए, Behlendorf, Jan 6 2015 ने लिखा:
वर्तमान अटकलें यह है कि किसी कारण से एनएफएस सर्वर फ़ाइल हैंडल का कैश्ड संस्करण रख रहा है। जब तक एनएफएस सर्वर इस फाइल को नहीं संभालता है तब तक जेडएफएस इस फाइल को अनलिंक नहीं कर सकता है। कुछ प्रकाश परीक्षण से पता चला है कि सर्वर पर कैश छोड़ने से यह संदर्भ गिरा दिया जाएगा (जैसे एनएफएस फ़ाइल हैंडल) जिस बिंदु पर स्थान सही ढंग से मुक्त हो गया है। मेमोरी प्रेशर भी इसे गिरा सकता है।
यानी एक रात की गूंज 3> / proc / sys / vm / drop_caches उस बग के लिए सबसे आसान फिक्स है यदि आप अपने zfs को पुनर्गठन के लिए डाउनटाइम नहीं चाहते हैं।
तो शायद कार्गो पंथ प्रशंसा नहीं करते, लेकिन कुछ बहुत अच्छा डिबगिंग का कारण था।
यह NUMA (गैर समरूप मेमोरी एक्सेस) सिस्टम पर समझ में आ सकता है, जहां, आमतौर पर, प्रत्येक CPU (सॉकेट) सभी मेमोरी को पारदर्शी रूप से एक्सेस कर सकता है, लेकिन समानांतर एचपीसी अनुप्रयोगों के साथ इसकी अपनी मेमोरी को अन्य सॉकेट की मेमोरी की तुलना में तेजी से एक्सेस किया जा सकता है।
कई सरल समानांतर अनुप्रयोग एक प्रक्रिया से फ़ाइल I / O करने की प्रवृत्ति रखते हैं, इस प्रकार डिस्क कैश के लिए आवंटित एक एकल NUMA नोड पर मेमोरी के एक बड़े अंश से बाहर निकलते हैं, जबकि अन्य NUMA नोड पर मेमोरी ज्यादातर मुक्त हो सकती है। इन स्थितियों में, चूंकि लिनक्स कर्नेल में कैश रीक्लेमिंग प्रक्रिया, जहां तक मुझे पता है, अभी भी NUMA- अवगत नहीं है, NUMA नोड पर चलने वाली प्रक्रियाएं जिन्हें कैश को मेमोरी आवंटित की गई है, उन्हें अन्य NDA नोड पर मेमोरी आवंटित करने के लिए मजबूर किया जाता है, जब तक अन्य नोड पर मुफ्त रैम है, इस प्रकार प्रदर्शन को मारना।
हालांकि, एचपीसी प्रणाली में, एक नए उपयोगकर्ता की नौकरी शुरू करने से पहले कैश को साफ करना समझदारी होगी, न कि क्रोन के साथ।
गैर समानांतर अनुप्रयोगों के लिए यह समस्या उत्पन्न होने की संभावना नहीं है।
जब आपका पृष्ठ कैश काफी बड़ा होता है (आपके वर्तमान स्वैप उपयोग की तुलना में बहुत बड़ा), और स्वैप और स्वैप आउट होता है, तो यह तब होता है जब आपको कैश छोड़ने की आवश्यकता होती है। मैंने ऐसे मामलों को देखा है जहां उबंटू 16.04LTS पर चलने वाले मेरे एक मारियाडीबी डेटाबेस सर्वर में मेमोरी उपयोग बढ़ जाता है, और लिनक्स ने अप्रयुक्त पृष्ठ कैश को हटाने के बजाय स्वैप उपयोग को बढ़ाने के लिए चुना है। मेरे सिस्टम में पहले से ही बहुत बड़ी ट्रांसपेरेंट अक्षमियां हैं क्योंकि TokuDB को इसे अक्षम करने की आवश्यकता थी। वैसे भी शायद यह बग नहीं है, लेकिन फिर भी इस व्यवहार को करने के लिए लिनक्स मुझे काफी हैरान कर रहा है। विभिन्न स्रोतों ने कहा कि जब आवेदन ने अनुरोध किया तो लिनक्स पेज कैश को हटा देगा:
लेकिन वास्तविकता इतनी सरल नहीं है। वर्कअराउंड या तो है:
उदाहरण dd रन:
dd if=/var/log/apache2/access_log.1 iflag=nocache count=0
उदाहरण अजगर-सनक:
pyadvise -d /var/log/apache2/access_log.1
मेरे पास एक डेस्कटॉप मशीन है जिसमें 16GB RAM PAE कर्नेल पर चलती है। एक या दो घंटे के बाद डिस्क प्रदर्शन नाटकीय रूप से कम हो जाता है जब तक मैं कैश नहीं छोड़ता, इसलिए मैंने इसे क्रोन में डाल दिया। मुझे नहीं पता कि यह पीएई कर्नेल के साथ एक समस्या है या कैश कार्यान्वयन इतना धीमा है अगर बहुत मेमोरी है।