स्मृति से बाहर चलने पर सिस्टम लटका हुआ


34

मुझे एक eeePC 900a मिली है: इसमें डिस्क के रूप में 8GB फ्लैश है और केवल 1GB RAM है। इस पर स्थापित लिनक्स वितरण आर्कलिनक्स है।

जब सिस्टम मेमोरी से बाहर निकल जाता है तो यह बहुत अधिक गैर-जिम्मेदार हो जाता है: TTY1 पर स्विच करने या माउस पॉइंटर को हिलाने जैसी चीजों को करने में कई सेकंड / मिनट लगते हैं। कभी-कभी ऐसा लगता है कि सिस्टम सिर्फ जमा देता है: तीन हमारे पहले मैंने इसे अकेले रहने दिया और अब तक कुछ भी नहीं बदला है।

मैं इस eeePC पर एक स्वैप विभाजन / फ़ाइल बनाने से बचना चाहूंगा क्योंकि डिस्क पहले से ही छोटी है, और इसलिए भी कि कई स्वैप स्थान पर लिखते हैं कि फ्लैश कार्ड जीवन को बहुत कम कर देगा। इसके अलावा मुझे लगता है कि एक स्वैप फ़ाइल / विभाजन सिर्फ समस्या को हल करेगा, बजाय निश्चित रूप से इसे ठीक करने के।

स्मृति से बाहर चलने पर कर्नेल कुछ यादृच्छिक अनुप्रयोगों को मारने वाला नहीं है? ऐसा करने में यह विफल (या उम्र क्यों लेता है) होता है?

कुछ महीने / साल पहले मैं पहले से ही इस में आगे देखने की कोशिश की, लेकिन वास्तव में काम करेंगे कुछ भी नहीं मिला ...


1
आप अपने सेटअप में कौन से DE / WM का उपयोग कर रहे हैं, आप कौन सी सेवाएँ / डेमॉन चला रहे हैं? उदाहरण के लिए क्रोमलेट या फ़ायरफ़ॉक्स के साथ एक पूर्ण fletched डेस्कटॉप वातावरण का उपयोग करना और ब्रंच के लिए आपकी रैम खाती है। आर्क लिनक्स को चलाने के लिए 1 जीबी की रैम पर्याप्त होनी चाहिए, लेकिन वास्तव में जो मायने रखता है वही आप इसके शीर्ष पर रखते हैं।

1
मैं LXDE का उपयोग कर रहा हूं। क्रोमियम वह प्रोग्राम है जो आमतौर पर ज्यादातर रैम में होता है। वैसे भी यह बात नहीं है। यह मुझे नहीं है जो इस बात की परवाह करता है कि मेरी प्रणाली कितनी मेमोरी का उपयोग कर रही है, यह मेरी प्रणाली है जिसकी वजह से मुझे मरना नहीं चाहिए। यदि मेरा सिस्टम मेमोरी पर कम चल रहा है, तो यह किसी भी एप्लिकेशन को उसकी इच्छा को मारने के लिए स्वतंत्र है, मैं बस चाहता हूं कि यह फ्रीज न हो !
पीरो

6
मेरा मतलब है, मैं गंभीरता से इस तरह एक स्क्रिप्ट चलाने के बारे में सोच रहा हूं (छद्मकोश में) while(true){ if( $FREE_MEMORY<10MB ){ kill -9 $RANDOM_PID; } }:। यह निश्चित रूप से मेरी समस्या को ठीक करेगा। लेकिन रुकिए, क्या कर्नेल को ऐसा नहीं करना चाहिए (और मेरी स्क्रिप्ट से बेहतर तरीके से)? यह अपना काम क्यों नहीं कर रहा है?
peoro

2
@ मार्सिन, जो केवल समस्या को हल करेगा, इसे ठीक नहीं करेगा। यहां तक ​​कि अगर मेरे पास 4GB मेमोरी थी (कुछ स्वैप के लिए धन्यवाद), तो मेरा सिस्टम मेमोरी से बाहर चला सकता है (इस तरह लटका हुआ)। जब मैं रैम से बाहर होता हूं तो मैं अपने सिस्टम को फ्रीज करना चाहता हूं। यदि मेरा कर्नेल बस अचानक क्रोमियम को मार देगा, जैसे ही मेरी रैम खत्म हो जाती है, मुझे अब मिलने वाले 1 जीबी के साथ भी खुशी होगी।
peoro

4
@Lee "मैजिक sysrq" एक प्रमुख कॉम्बो है जो सीधे कर्नेल पर जाता है। यह अक्सर काम करेगा भले ही कीबोर्ड और माउस अनुत्तरदायी हों। En.wikipedia.org/wiki/Magic_SysRq_key
रमन

जवाबों:


14

कीबोर्ड संयोजन द्वारा सीधे OOM- किलर (मेमोरी किलर से बाहर) को कॉल करना संभव है:

SysRq-F

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

OOM- किलर कुछ प्रक्रिया (-es) को मारता है और सिस्टम फिर से उत्तरदायी हो जाता है।

ऊपर टिप्पणी में इस सुविधा पर सलाह के लिए Thx रमन।

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


2
मेरे पास चाबी है PrtScn|SysRq। लेकिन SysRq - Fकेवल दबाने पर स्क्रीनशॉट मिलता है
ली

2
चूँकि आपने मूल रूप से मेरी टिप्पणी को ऊपर ले लिया था और इसका उत्तर दिया था, इसलिए एक छोटा सा अटेंशन अच्छा रहा होगा। मैंने तुम्हें वैसे भी उखाड़ फेंका। :-)
रमन

3
@ आपको इसे सक्षम करना होगा। कुछ डिस्ट्रोस में डिफ़ॉल्ट रूप से सक्षम जादू sysrq नहीं है। यह मदद करनी चाहिए: google.ca/search?q=sysrq+enable
रमन

2
@Raman मैं 99% की शर्त लगाता हूं जो यह पाते हैं कि यह "डिफ़ॉल्ट रूप से सक्षम नहीं कर सकता है" क्योंकि उनकी मशीन पहले से ही जमी हुई है ... यह डिफ़ॉल्ट रूप से सक्षम क्यों नहीं है?
थेमीहाई

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

12

चीजों की प्राकृतिक स्थिति यह है कि एप्लिकेशन डेटा रैम में है, और फाइलें डिस्क पर हैं।
चीजों की आदर्श स्थिति, प्रदर्शन वार, यह है कि लगातार उपयोग में डेटा रैम में है, और जिस डेटा की फिलहाल आवश्यकता नहीं है वह डिस्क पर है।
एक सामान्य प्रणाली पर, कर्नेल इस आदर्श तक पहुंचने के लिए दो चीजें करता है:

  • कुछ समय के लिए उपयोग नहीं किए गए एप्लिकेशन डेटा को डिस्क पर ले जाया जा सकता है: यह स्वैप है।
  • हाल ही में उपयोग की गई फ़ाइलों के डेटा को RAM में रखा गया है: यह डिस्क कैश (डिस्क से पढ़े गए डेटा के लिए) और डिस्क बफ़र्स (डेटा के बारे में जो डिस्क पर लिखा जाना है) के लिए है।

एक विशिष्ट प्रणाली पर, रैम का एक महत्वपूर्ण हिस्सा कैश और बफ़र्स के लिए समर्पित है (50% एक विशिष्ट आंकड़ा है)। चूंकि रैम एक परिमित संसाधन है, इसलिए इसमें स्वैप करने के लिए कुछ एप्लिकेशन डेटा को विस्थापित करने की आवश्यकता हो सकती है (यदि केवल रैम का उपयोग करने का एक बेहतर तरीका है तो स्वैप आवश्यक है)।

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

इस मुद्दे पर अधिक जानकारी के लिए, इस lkml चर्चा और इस ब्लॉग पोस्ट को देखें

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


1
स्पष्टीकरण और लिंक के लिए धन्यवाद, उन्होंने स्वैप के बारे में कुछ संदेह को दूर करने में मदद की। मेरे सवाल के @Marcin जवाब के बाद, मैंने अपने रैम में 256MB का कंप्रेस्ड वर्चुअल स्वैप (कॉम्पैक) सेट किया। हालांकि यह पूरी तरह से मेरे सवाल का जवाब नहीं देता है: मैं समझता हूं कि मेरा सिस्टम धीमा हो जाएगा जब पूरे रैम का उपयोग केवल एप्लिकेशन द्वारा किया जाता है और कुछ भी कैश नहीं किया जाता है; फिर भी मैं समझ नहीं पा रहा हूं कि जब मैं पूरी तरह से रैम से बाहर हो जाता हूं तो यह सिस्टम मिनटों / घंटों (शायद हमेशा के लिए) कैसे लटका रहता है। मुझे लगता है कि स्मृति से बाहर होने पर अनुप्रयोगों को मारने में मेरा कर्नेल अपना काम नहीं कर रहा है, अगर 3 घंटे TTY1 पर स्विच करने के लिए पर्याप्त नहीं हैं।
पीरो

मैंने 32GB की भौतिक मेमोरी के साथ स्वैप को अक्षम कर दिया है और जब खराब सॉफ़्टवेयर मेमोरी एलोकेशन (हेलो ld, आप कचरे का टुकड़ा) के साथ भाग जाता है, तो यह अभी भी लगभग एक मिनट के लिए लटका रहता है, बस जागने से मुझे एक सेकंड के लिए अविश्वसनीय रूप से सुस्त माउस को स्थानांतरित करने के लिए पर्याप्त है। या दो हर कई सेकंड। लिनक्स की OOM हैंडलिंग पूरी तरह से बकवास है। अगर मैं भाग्यशाली हूं, तो OOM हत्यारा डेस्कटॉप वातावरण को पूरी तरह से खराब किए बिना सही प्रक्रिया को मारता है। और मैं लिनक्स का बहुत बड़ा प्रशंसक हूं। यह पेजिंग सक्षम के साथ बहुत बुरा है। लिनक्स पेजिंग एक मजाक है।
doug65536

6

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

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


2
उबंटू में "अनअसाइन्ड" होने लगता है। शायद डीई को उपयोगकर्ता को चेतावनी देनी चाहिए या स्मृति-गहन एप्लिकेशन को भी फ्रीज करना चाहिए?
nkkollaw

1
@nbrogi - कुछ भी लेकिन चुपचाप फ्रीज। लेकिन सौभाग्य से उबंटू देवों को ऐसा करने का सौभाग्य मिला।
डैन डस्केल्सस्क्यू

6

हाल ही में मुझे अपनी समस्या का हल मिला।

चूंकि लिनक्स ओओएम हत्यारा अपना काम ठीक से करने में सक्षम नहीं है, इसलिए मैंने एक यूज़रस्पेस ओओएम किलर: अर्लीओम का उपयोग करना शुरू कर दिया । यह सी में लिखा है, काफी विन्यास योग्य है और यह मेरे लिए एक आकर्षण की तरह काम कर रहा है।

मैंने कुछ विकल्पों के बारे में भी सुना है, जैसे फेसबुक का OOMD , उनके सर्वर पर चलने के लिए विकसित किया गया है, लेकिन मैंने यह कोशिश नहीं की है

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