स्मृति से बाहर होने पर मैं लिनक्स को ठंड से कैसे रोक सकता हूं?


25

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

मैं भविष्य में इसे कैसे रोक सकता हूं? यह कम से कम एक उत्तरदायी कोर या कुछ चल रहा नहीं रख सकते हैं?


जवाबों:


15

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

आप अदला-बदली बंद कर सकते हैं, लेकिन यह सिर्फ OOM- मारे गए प्रक्रियाओं (और सभी मज़ेदार कारणों) के खराब प्रदर्शन से समस्या को बदल देता है, साथ ही कम उपलब्ध डिस्क कैश के कारण प्रदर्शन में कमी आई है।

वैकल्पिक रूप से, आप प्रति-प्रक्रिया संसाधन सीमा (आमतौर पर के रूप में rlimitऔर / या के लिए संदर्भित ulimit) का उपयोग कर सकते हैं एक एकल प्रक्रिया की संभावना को हटाने के लिए स्मृति की एक हास्यास्पद राशि ले रही है और स्वैपिंग का कारण बनती है, लेकिन यह आपको प्रक्रियाओं के साथ मनोरंजक क्षेत्र में धकेलता है जो मर जाते हैं असुविधाजनक क्षण क्योंकि वे चाहते थे कि प्रणाली उन्हें देने के लिए तैयार थी।

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

व्यक्तिगत रूप से, मैं संसाधन नियंत्रण के "मूर्खतापूर्ण कार्य नहीं करता" विधि की सदस्यता लेता हूं। यदि आपको रूट मिल गया है, तो आप एक सिस्टम को सभी प्रकार के नुकसान कर सकते हैं, और ऐसा कुछ भी करना जो आपको पता नहीं है कि संभावित परिणाम एक जोखिम भरा व्यवसाय है।


2
दुर्भाग्य से, "बेवकूफ चीजें न करें" उन उपयोगकर्ताओं की मदद नहीं करता है जो क्रोम जैसे मेमोरी- हॉगिंग एप्लिकेशन चलाते हैं ( 134612 , 393395 मुद्दे देखें )।
डैन डैस्केल्स्कु

1
@DanDascalescu और यह हमेशा स्पष्ट नहीं है कि आप कुछ बेवकूफी कर रहे हैं। मेरी मशीन ने दूसरे दिन लटका दिया क्योंकि मैंने "UNION" को एक (जटिल) SQLite क्वेरी में "UNION ALL" में बदल दिया।
माइकल

ज्ञात-छोटी गाड़ी के कार्यक्रम (और) एक संसाधन-विवश विन्यास में चलाए जा सकते हैं - ulimitया इन दिनों भी cgroups, यदि आप एक हिप नौजवान हैं, तो काम काफी अच्छी तरह से करता है। यदि आप गैर-महत्वपूर्ण वातावरण में उनके प्रभावों को मान्य किए बिना उत्पादन में प्रश्नों में बदलाव कर रहे हैं, तो यह आपकी मूल समस्या है।
Womble

8

ट्रोनिक द्वारा टिप्पणी में ऊपर कहा गया है, यह कॉल OOM-हत्यारा के लिए संभव है (स्मृति हत्यारा में से) सीधे कुंजीपटल संयोजन द्वारा SysRq- F

SysRqकुंजी आमतौर PrtScपर कीबोर्ड पर कुंजी के भीतर संयुक्त होती है ।

OOM- किलर कुछ प्रक्रिया (-es) को मारता है और सिस्टम फिर से उत्तरदायी हो जाता है। OOM- किलर के लिए प्रत्यक्ष लहजे को डिफ़ॉल्ट रूप से सक्षम नहीं किया जा सकता है, plz इस स्थिति की जाँच करें कि इसकी स्थिति की जाँच कैसे करें और / या इसे सक्षम करें।

PS: इससे मुझे बहुत मदद मिली। मैं राय से सहमत हूं कि यह उस समस्या के बारे में सबसे उपयोगी सलाह है यदि यह क्रोम या जो कुछ भी स्मृति लालची सॉफ़्टवेयर के कारण होता है। लेकिन आपको यह ध्यान रखने की आवश्यकता है कि ओओएम-हत्यारा कुछ वास्तव में महत्वपूर्ण प्रक्रिया को मार सकता है, इसका सावधानी से उपयोग करें।


1

यह एक बग है जिसे 2007 से जाना जाता है - उच्च मेमोरी उपयोग पर सिस्टम फ्रीज देखें ।

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


0

यदि आप कर्नेल को फिर से शुरू करने की तरह महसूस करते हैं, तो आप इस प्रश्न के अनुभाग से पैच आज़मा सकते हैं EDIT: /programming//q/52067753/10239615
यह Active(file)उच्च मेमोरी दबाव के दौरान पृष्ठों को बेदखल नहीं करता है और इस प्रकार यह OOM- किलर की अनुमति देता है लगभग तुरंत ट्रिगर करने के लिए क्योंकि कर्नेल को अब हर प्रक्रिया के निष्पादन योग्य डिस्क के रीड-रीडिंग के लगातार मिनटों को खर्च करने की आवश्यकता नहीं है जो एक जमे हुए ओएस का कारण बनता है।


-1

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

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


4
किसी भी सिस्टम पर स्वैप को बंद करना एक बुरा विचार है, क्योंकि यह अप्रयुक्त पृष्ठों को स्वैप करने और डिस्क कैश के लिए उपयोग किए जाने वाले खाली स्थान की अनुमति नहीं देता है। मेमोरी लीक होने पर यह विशेष रूप से सच है।
Womble

2
और स्वैप के साथ, पेजिंग के कारण सिस्टम अभी भी धीमा हो सकता है। यह सिर्फ गंदे लोगों के बजाय पागल पृष्ठों को साफ करेगा। (चूंकि, स्वैप के बिना, यह कभी भी एक गंदे पृष्ठ को बाहर नहीं निकाल सकता है, इसे हमेशा स्वच्छ लोगों को बेदखल करना होगा।)
डेविड श्वार्ट्ज

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

@AntonisChristofides: मुझे यकीन नहीं है कि आप उस से takeaway सबक क्या सोचते हैं। आपका समाधान निश्चित रूप से एक बुरा है क्योंकि यह भौतिक मेमोरी से शायद ही कभी-गंदे पन्नों को निकालने में असमर्थता के कारण प्रदर्शन को बाधित करता है, यह अंतर्निहित समस्या को हल नहीं करता है, और आप जोखिम को चलाते हैं कि ओओएम हत्यारा एक महत्वपूर्ण प्रक्रिया को मार सकता है। आप उस विशेष खतरे का सामना नहीं कर रहे हैं जिसके बारे में मैं चेतावनी दे रहा था, लेकिन आप इसके लिए जोखिम में हैं क्योंकि आपके पास कोई स्वैप नहीं है।
डेविड श्वार्ट्ज

8
स्वैप के साथ या बिना यह अभी भी जमा देता है इससे पहले कि OOM हत्यारा स्वचालित रूप से चलता है। यह वास्तव में एक कर्नेल बग है जिसे ठीक किया जाना चाहिए (यानी सभी डिस्क कैश को छोड़ने से पहले OOM हत्यारा चलाएं)। दुर्भाग्य से कर्नेल डेवलपर्स और बहुत से अन्य लोग समस्या को देखने में विफल रहते हैं। सामान्य सुझाव जैसे कि निष्क्रिय / सक्षम स्वैप, अधिक रैम खरीदें, कम प्रक्रियाएं, सीमाएं निर्धारित करें आदि अंतर्निहित समस्या को संबोधित नहीं करते हैं कि कर्नेल की कम मेमोरी हैंडलिंग ऊंट की गेंदों को चूसती है। इस बीच, मैं सुझाव देता हूं कि OOM किलर को मैन्युअल रूप से चलाना (SysRq-F) जब सिस्टम फ्रीज हो जाता है तो यह तेजी से ठीक हो जाएगा।
चिरकालिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.