Cent OS: मैं मेमोरी ओवरकमिटमेंट को कैसे बंद या कम कर सकता हूं, और क्या यह करना सुरक्षित है?


20

समय-समय पर "मेरा" सर्वर स्टॉल करता है क्योंकि यह मेमोरी और स्वैप स्पेस दोनों से बाहर निकलता है। (यह पिंग का जवाब देता है, लेकिन इससे अधिक कुछ भी नहीं, शश भी नहीं)।

मुझे बताया गया है कि लिनक्स मेमोरी ओवरकमिटमेंट करता है, जहां तक ​​मैं समझता हूं कि बैंक पैसे के साथ ऐसा ही करते हैं: यह वास्तव में उपलब्ध से अधिक मेमोरी प्रोसेस करने के लिए अनुदान देता है, यह मानते हुए कि अधिकांश प्रक्रियाएं वास्तव में उन सभी मेमोरी का उपयोग नहीं करती हैं, जो वे पूछते हैं, कम से कम सभी एक ही समय में नहीं।

कृपया मान लें कि यह वास्तव में यही कारण है कि मेरा सिस्टम कभी-कभी लटका हुआ है, चलो यहां चर्चा नहीं करते हैं कि क्या यह मामला है या नहीं (देखें कि सर्वर पर सभी सेवाओं के कारण क्या हो सकता है, फिर भी पिंग का जवाब दे? और यह पता कैसे करें ) ।

इसलिए,

  1. मैं कैसे अक्षम या CentOS में अत्यधिक मेमोरी ओवरकॉम्पिटेशन को कम कर सकता हूं? मैंने पढ़ा है कि दो सेटिंग्स हैं जिन्हें vm.overcommit_memory (मान 0, 1, या 2) और vm.overcommit_ratiom कहा जाता है, लेकिन मुझे नहीं पता कि मुझे उन्हें कहां खोजना है और उन्हें बदलना है (कुछ कॉन्फ़िगरेशन फ़ाइल उम्मीद से), मुझे किन मूल्यों की कोशिश करनी चाहिए , और क्या मुझे परिवर्तनों को प्रभावी बनाने के लिए सर्वर को रिबूट करने की आवश्यकता है।

  2. और क्या यह सुरक्षित है? मैं किस दुष्प्रभाव की उम्मीद कर सकता था? जब overcommit_memory के लिए गुगली करते हैं तो मुझे डरावनी चीजें मिलती हैं जैसे लोग कहते हैं कि उनका सर्वर अब बूट नहीं हो सकता है ...।

चूँकि स्मृति उपयोग में अचानक वृद्धि का कारण mysql है, जो php द्वारा किए गए प्रश्नों के कारण होता है, जिन्हें http अनुरोधों की सेवा करते समय कहा जाता है, मैं बस कुछ php स्क्रिप्ट को पूरा करने में विफल होने की उम्मीद करूंगा और इसलिए समय-समय पर कुछ 500 प्रतिक्रियाएं जब सर्वर बहुत व्यस्त है, जो एक जोखिम है जो मैं ले सकता हूं (निश्चित रूप से बेहतर है कि पूरे सर्वर दुर्गम हो गया है और इसे मुश्किल से रिबूट करना है)।

या यह वास्तव में मेरे सर्वर को गलत सेटिंग्स चुनने पर रीबूट करने में असमर्थ होने का कारण बन सकता है?


1
जब आप वास्तव में स्मृति से बाहर चल रहे होते हैं, तो ओवरकमिट को अक्षम करने से आपको मदद नहीं मिलेगी । हालाँकि सर्वर में RAM जोड़ने से मदद मिल सकती है।
माइकल हैम्पटन

2
Overcommit को अक्षम करने से अंतिम समाधान नहीं हो सकता है, लेकिन IS बहुत मदद करने जा रहा है, अगर किसी भी समय सर्वर मेमोरी से बाहर चला जाता है (जो कुछ सेकंड के लिए बस एक बार थोड़ी देर में होता है) तो मेरे पास केवल कुछ http अनुरोधों को अस्वीकार कर दिया गया है (या बुरी तरह से सेवा की गई), बजाय मेरे सर्वर DIE पूरी तरह से और हमेशा के लिए (जब तक मैं इसे पुनः आरंभ नहीं करता)
मैट

जवाबों:


30

मेमोरी ओवरकॉमिट द्वारा अक्षम किया जा सकता है vm.overcommit_memory=2

0 डिफॉल्ट मोड है, जहां कर्नेल हेयुरेटिक रूप से किए गए आवंटन अनुरोध की तुलना में मुक्त मेमोरी की गणना करके आवंटन को निर्धारित करता है। और इसे 1 पर सेट करना मैड्रिड मोड को सक्षम करता है, जहां कर्नेल हमेशा विज्ञापित करता है कि इसमें किसी भी आवंटन के लिए पर्याप्त मुक्त मेमोरी है। 2 पर सेट करने का मतलब है कि प्रक्रियाएं केवल overcommit_ratioRAM की एक विन्यास योग्य राशि ( ) तक आवंटित कर सकती हैं और जब यह उस राशि से आगे जाती है तो आवंटन विफलता या OOM संदेश प्राप्त करना शुरू कर देगी।

क्या ऐसा करना सुरक्षित है, नहीं। मैंने कोई उचित उपयोग का मामला नहीं देखा है जहाँ मेमोरी ओवरकॉम्पिट को अक्षम करना वास्तव में मदद करता है, जब तक कि आप कार्यभार और हार्डवेयर क्षमता के 100% निश्चित नहीं हैं। यदि आप रुचि रखते हैं, तो kernel-docsपैकेज स्थापित करें और /Documentation/sysctl/vm.txtअधिक पढ़ने के लिए जाएं, या इसे ऑनलाइन पढ़ें ।

यदि आप सेट करते हैं, vm.overcommit_memory=2तो यह कॉन्फ़िगर की गई भौतिक रैम के प्रतिशत तक पहुंच जाएगा vm.overcommit_ratio(डिफ़ॉल्ट 50% है)।

echo 0/1/2 > /proc/sys/vm/overcommit_memory 

इससे रिबूट नहीं बचेगा। दृढ़ता के लिए, इसे /etc/sysctl.confफ़ाइल में रखें:

vm.overcommit_memory=X

और भागो sysctl -p। रिबूट करने की आवश्यकता नहीं है।


हिस्सा आप नहीं जवाब जो फ़ाइल में मुझे लगता है कि vm.memory_overcommit सेटिंग को बदलने और विशेष रूप से है कि क्या मैं रिबूट (या और क्या) की जरूरत है यह प्रभाव में आ सकें है किया
Matteo

2
इको 0/1/2> / proc / sys / vm / overcommit_memory यह एक रिबूट नहीं बचेगा। दृढ़ता के लिए, इसे /etc/sysctl.conf फ़ाइल vm.overcommit_memory = X में रखें और sysctl -p चलाएँ। रिबूट करने की आवश्यकता नहीं है
सोहम चक्रवर्ती

बहुत बहुत धन्यवाद। कृपया आप इसे उत्तर निकाय में जोड़ दें ताकि मैं इसे औपचारिक रूप से "स्वीकार" कर सकूं।
मत्ती

1
नया हिस्सा जोड़ा।
सोहम चक्रवर्ती

4
Overcommit_memory = 2 का उपयोग करते समय "overcommit_ratio" का एक महत्वपूर्ण प्रभाव है - यह उस भौतिक RAM का प्रतिशत निर्धारित करता है जिसे आवंटित करने की अनुमति है! इसलिए यदि अनुपात <100 है तो आप कुछ रैम को असंबद्ध छोड़ देंगे, शायद डिस्क कैश या इसी तरह के लिए। डिफ़ॉल्ट अनुपात 50% है, इसलिए यदि आप इसे नहीं बदलते हैं तो आप केवल 50% भौतिक RAM का उपयोग करेंगे!
डेविड गार्डनर

6

पूरी तरह से अयोग्य कथन: स्मृति को अक्षम करने को सक्षम करने से निश्चित रूप से "सुरक्षित" है।

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

दूसरी ओर, लोग इसे "सुरक्षित" नहीं मान सकते हैं क्योंकि उनकी प्रक्रियाएं स्मृति से बाहर हो रही हैं जब वे थोड़े से राम को घेरना चाहेंगे और वास्तव में कभी भी इसका उपयोग नहीं करेंगे। (यानी SAP एक बहुत अच्छा उदाहरण होगा)

तो, आप यह देखने के लिए पीछे हैं कि क्या यह आपके लिए चीजों को बेहतर बनाता है। चूंकि आप पहले से ही संबंधित मुद्दों से छुटकारा पाने के लिए इसे देख रहे हैं - मुझे लगता है कि यह आपके लिए मदद कर सकता है।

(मुझे पता है कि मैं कुछ क्रोधी व्यक्ति के जोखिम को कम कर दूंगा)


3

मैं मानता हूं कि कुछ परिस्थितियों में इसे सक्षम करने की तुलना में अधिक अक्षमता को सुरक्षित करना सुरक्षित है। यदि सर्वर केवल कुछ बड़ी मेमोरी जॉब्स चलाता है (जैसे मेरे मामले में सर्किट सिमुलेशन), तो यह OOM ईवेंट के लिए प्रतीक्षा करने के बजाय मेमोरी अनुरोध को अस्वीकार करने के लिए अधिक सुरक्षित है (जो कि शीघ्र ही पालन करने के लिए निश्चित है) बहुत बार हम सर्वर देखते हैं OOM हत्यारे ने अपना काम करने के बाद मुद्दों को रखा।

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