लिनक्स रिस्पांसिबिलिटी, मेमोरी और पेजिंग को कैसे वश में करें


27

पहला सवाल अतिप्रवाह =) ... +100 इनाम। मैं अब तक के बारे में परवाह किए बिना कुछ के बारे में सोच नहीं सकता था:

मैं वास्तव में लिनक्स डेस्कटॉप जवाबदेही की स्थिति से तंग आ गया हूं, उदाहरण के लिए http://brainstorm.ubuntu.com/item/85/ - कम फ्री-रैम के साथ स्थितियों में, या उच्च डिस्क थ्रूपुट के साथ स्थितियों में सिस्टम धीमा हो जाता है एक क्रॉल ; यह उन अनुप्रयोगों के लिए बिल्कुल भयानक है जिनके लिए अच्छे प्रदर्शन की आवश्यकता होती है। इसके अतिरिक्त, UI पूरी तरह से अनुत्तरदायी है। उदाहरण के लिए इसकी तुलना OS X के साथ करें, जहां यदि कोई एप्लिकेशन संसाधनों को हॉग कर रहा है, तो कोई भी हमेशा फोर्स क्विट पर क्लिक कर सकता है, जबकि लिनक्स में मैं अल्ट-टैब या स्विच डेस्कटॉप या यहां तक ​​कि ctrl-alt-f1 भी प्राप्त नहीं कर सकता। टर्मिनल - अच्छी तरह से मैं कर सकता हूँ, यह बस प्रति ऑपरेशन के बारे में 1-2 मिनट लगते हैं।

मैं gkrellm का उपयोग करता हूं, इसलिए मैं स्थिति को देख सकता हूं क्योंकि यह सामने आती है। आमतौर पर मेमोरी का उपयोग बहुत अधिक हो जाता है, या डिस्क थ्रूपुट नाटकीय रूप से कूद जाता है।

यह खराब हार्डवेयर नहीं है, जिसमें 2.6GHz क्वाड-कोर और 4GB 800MHz DDR2 रैम है (इसमें 6GB होगा, लेकिन हार्डवेयर असंगतता के कारण पुराने सेट के साथ मिक्स-एंड-मैच नहीं हो सकता)। जब मैं अपरिहार्य हो जाता है तो यह समस्या दूर हो सकती है, लेकिन मुझे नहीं लगता कि समस्या का दिल है। मैं भी अलग डिस्क पर दो स्वैप विभाजन है।

मुझे लगता है कि समस्या तीन गुना है:

  • भगोड़ा कार्यक्रम जो बड़ी मात्रा में स्मृति को हॉग करते हैं - इन कार्यक्रमों के लिए कानून निर्धारित किया जाना चाहिए, उनकी सीमाओं के साथ
    • (जैसे क्रोम पर टैब, जिनमें से प्रत्येक 20-50MB है, जिनमें से कुछ MB का उपयोग कर सकते हैं)
    • (उदा। अन्य प्रोग्राम जैसे अपडेट-डीबी और इंडेक्सर्स, जिन्हें मुझे क्रोन से अक्षम करना और हटाना पड़ा क्योंकि वे सिस्टम को क्रॉल करने के लिए धीमा कर रहे थे जब भी वे दौड़ते थे, आदि)
  • किसी प्रकार के कर्नेल या बस विवाद में कुछ भयानक हो जाना, जैसे कि हाई-डिस्क-थ्रूपुट परिस्थितियाँ पूरे सिस्टम को क्रॉल में धीमा कर देती हैं (शायद महत्वपूर्ण कार्यक्रमों को पृष्ठांकित करके)
  • कर्नेल यूआई या महत्वपूर्ण कार्यक्रमों को संसाधनों के संदर्भ में प्राथमिकता नहीं दे रहा है, जैसे कि मेमोरी, पेजिंग, यहां तक ​​कि प्रोसेसर का उपयोग

अपवोट्स पर जाएं:

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

विशेष रूप से मैं /etc/security/limits.conf( man limits.conf) द्वारा इंट्रस्टेड हूं , लेकिन चिंतित हूं यह केवल प्रति-उपयोगकर्ता नियंत्रण देता है, और फ़ाइल में टिप्पणी किए गए उदाहरण विवरण के संदर्भ में अपारदर्शी लगते हैं या जहां शुरू करना है। मुझे उम्मीद है कि एक limits.confकाम करता है, लेकिन अगर यह भी काम नहीं किया तो आश्चर्यचकित नहीं होगा, या अगर यह मेरी समस्या का उचित समाधान नहीं था, या जैसा कि मैं प्राप्त करने की कोशिश कर रहा हूं, तो यह दानेदार है। एक प्रति-प्रक्रिया-नाम limits.confआदर्श होगा, फिर से यह मानते हुए कि सीमाएं ।conf काम करती हैं। मुझे खुशी होगी कि अगर कोई काम करता है तो मैं उसे परखने के लिए एक सीमा की कोशिश करता हूं।

यह भी उपयोगी हो सकता है कि इस तरह के अच्छे यूआई जवाबदेही को बनाए रखने के लिए ओएस एक्स कैसे प्रबंधित करता है।

मैंने पहले ही अपने /tmpऔर कैश फ़ोल्डर को चालू कर दिया है tmpfs, और सामान्य डिस्क उपयोग शून्य के पास है।

अस्पष्ट रूप से संबंधित विषय:

  • स्मृति से अधिक

जवाब मुझे नहीं लगता कि काम करेगा:

  • swapoff (यह अभी भी स्मृति हॉग कार्यक्रमों को हत्या के साथ दूर जाने देता है, और सिस्टम स्थायी रूप से ठंड हो जाता है अगर स्मृति वास्तव में खराब है - जो किसी को भी एक सुझाव दे सकता है जो स्वैप करने से पहले ओओएम-हत्यारा को आमंत्रित करता है और विशिष्ट कार्यक्रमों को लक्षित करता है)
  • echo ?? > /sys/.../swappiness (कोई प्रभाव नहीं)
  • nice (कभी काम नहीं किया)
  • ionice (कभी फर्क नहीं देखा)
  • सेलिनक्स (प्रोग्राम असंगति एक बुरा सपना प्रतीत होता है)
  • रीयलटाइम लाइनक्स, यानी कर्नेल को बाधित कर सकता है (कस्टम कर्नेल को संकलित और अपडेट करने से निपटना नहीं चाहता है, यह ठीक हो सकता है यदि यह रिपॉजिटरी में माइग्रेट हो गया है)
  • *

हम्म, मैं एक इनाम देने में असमर्थ प्रतीत होता हूं; मुझे लगता है कि लिंक 48hr के लिए दिखाई नहीं देता है? ... अच्छी तरह से मैं सभी प्रतिष्ठा के साथ इनाम पोस्ट कर रहा हूँ, तो मैं
user76871

1
+1, यह एक सबसे बड़ा मुद्दा है जो मैंने लिनक्स डेस्कटॉप के साथ दिन-प्रतिदिन के आधार पर रखा है। मेरे पास कभी-कभार जमाव होता है, शायद हर दो हफ्ते में एक बार, लेकिन वे अक्सर विशेष रूप से परेशान करने के लिए पर्याप्त नहीं होते हैं। हालाँकि, यह केवल उन अनुप्रयोगों के साथ एक समस्या है जो आपके पास है, जैसा कि आपने कहा, भारी IO उपयोग: जिन अनुप्रयोगों में भारी CPU उपयोग होता है, उनका सामान्य प्रणाली के प्रदर्शन पर कोई प्रभाव नहीं पड़ता है। आयनिस के बारे में नहीं पता था, ऐसा लगता है कि यह इस समस्या का सही समाधान होगा यदि इसे ठीक से काम करना है।
क्रेजी

1
3 साल बाद और यह अभी भी लिनक्स पर एक मुद्दा है। @ crazy2be या user76871, मुझे नहीं लगता कि आपको इस बीच कोई समाधान मिला है?
ग्लूटानाट

@Gutanimate: हाँ, 32 जीबी की शारीरिक रैम और कोई कम (अच्छी तरह से, शायद 16 जीबी ... लेकिन यह जोर दे रहा है), बड़ी मात्रा में वीडियो रैम भी। यह उच्च सीपीयू या इंटरप्ट या व्हाट्सनॉट के कारण गैर-जिम्मेदारता को ठीक नहीं करता है, लेकिन यह कम-मेमोरी स्थितियों में गैर-जवाबदेही को रोकता है।
user76871

जवाबों:


6

लगता है जैसे आपका सिस्टम भारी गमागमन में चला जाता है। उपयोग vmstat 1करने से कुछ विवरण प्रकट हो सकते हैं - बस इसे एक टर्मिनल विंडो में चलने दें और इसमें मंदी होने पर स्विच करें।

Tmpfs में / tmp और "cache" डालने के बजाय, मैं noatimeविकल्प के साथ माउंट की गई एक सामान्य डिस्क फाइलसिस्टम का उपयोग करूँगा । अक्सर उपयोग किए गए डेटा वैसे भी कैश में रहेंगे, और पुराने डेटा को डिस्क पर एप्लिकेशन के लिए कुछ रैम से मुक्त करने के लिए लिखा जा सकता है। यदि / tmp और / या कैश बड़ा होता है, तो इससे बहुत मदद मिल सकती है।


1
उल्लेख करने के लिए +1 noatime
LawrenceC

उल्लेख करने के लिए धन्यवाद noatime, दुर्भाग्य से मैं उस माउंट विकल्प का उपयोग करता था, और मुझे नहीं लगता कि इससे जवाबदेही सुनिश्चित करने में बहुत मदद मिली (हालांकि यह डिस्क को ओवरवर्क नहीं करने के लिए एक टन की मदद करता है); बस यह सुनिश्चित करने के लिए कि मैंने अपने वर्तमान सेटअप पर पुन: सक्षम किया है। नॉनटाइम के साथ एक गैर-tmpfs होने के बाद थोड़ा अजीब लगता है, क्योंकि मैं अभी भी कल्पना करूँगा कि बड़े पैमाने पर लिखना होगा।
user76871

+1, की कोशिश की vmstat 1- निदान में बेहद उपयोगी है कि स्वैपिंग, वास्तव में, इस मुद्दे का एक बड़ा हिस्सा मुख्य मुद्दा है
user76871

2
आउच। कभी भी एक लिनक्स प्रणाली नहीं देखी गई थी जिसे इस तरह के भारी स्वैपिंग की आवश्यकता थी। क्या आपने इस बात की जाँच की है df -mकि tmpfs filesystems में कितनी मेमोरी का उपयोग किया जाता है? कुछ है अपेक्षाकृत तेज अपने रैम खा रहा है।
टर्बो जे

सुझाव के लिए धन्यवाद और मुझे -mविकल्प के बारे में सिखाने । दुर्भाग्य से df -h -mलगता है कि मेरी स्मृति केवल 100 एमबी की है tmpfs, इसलिए मुझे संदेह है कि यह किसी भी तरह से संबंधित है, तो सभी को tmpfs और कैश के लिए मेमोरी का उपयोग करने के लिए। यह भी असामान्य नहीं लगता है; मैंने कई वितरणों पर ऐसा किया है जब उनकी रैम को सीमा के पास धकेल दिया जाता है।
user76871

5

मैं कोई कर्नेल डेवलपर नहीं हूं लेकिन मैंने इस मुद्दे पर दार्शनिक होने में वर्षों बिताए क्योंकि मैं कई बार इस सू में भाग गया। मैं वास्तव में पूरी स्थिति के लिए एक रूपक के साथ आया था इसलिए मुझे आपको बताना चाहिए। मैं अपनी कहानी में मानता हूँ कि "स्वैप" जैसी चीजें मौजूद नहीं हैं। स्वैप इन दिनों 32 जीबी रैम के साथ ज्यादा मायने नहीं रखता है।

अपने आस-पास के क्षेत्र की कल्पना करें जहां पाइप के माध्यम से प्रत्येक भवन से पानी जुड़ा हुआ है और शहरों को क्षमता का प्रबंधन करने की आवश्यकता है। मान लें कि आपके पास प्रति सेकंड केवल 100 यूनिट पानी का उत्पादन है (और सभी अप्रयुक्त क्षमता बेकार चली जाती है क्योंकि आपके पास जलाशय टैंक नहीं हैं)। प्रत्येक घर (घर = एक छोटा ऐप, एक टर्मिनल, घड़ी विजेट, आदि) को प्रति सेकंड 1 यूनिट पानी की आवश्यकता होती है। यह सब अच्छा और अच्छा है क्योंकि आपकी आबादी 90 की तरह है इसलिए सभी को पर्याप्त पानी मिलता है।

अब महापौर (= आप) तय करते हैं कि आप एक बड़ा रेस्तरां (= ब्राउज़र) खोलना चाहते हैं। यह रेस्तरां कई रसोइयों (= ब्राउज़र टैब) का निर्माण करेगा। प्रत्येक कुक को प्रति सेकंड 1 यूनिट पानी की आवश्यकता होती है। आप 10 रसोइयों के साथ शुरू करते हैं, इसलिए पूरे पड़ोस के लिए पानी की कुल खपत 100 यूनिट पानी है जो अभी भी सभी अच्छा है।

अब मज़ेदार सामग्री शुरू होती है: आप अपने रेस्तरां में एक और कुक को किराए पर लेते हैं जो पानी की कुल आवश्यकताओं को 101 बनाता है जो जाहिर है आपके पास नहीं है। आपको कुछ करने की जरूरत है।

जल प्रबंधन (= कर्नेल) में 3 विकल्प हैं।

1. पहला विकल्प सिर्फ उन घरों के लिए सेवा को डिस्कनेक्ट करना है जिन्होंने हाल ही में पानी का उपयोग नहीं किया था। यह ठीक है लेकिन अगर डिस्कनेक्ट किए गए घर फिर से पानी का उपयोग करना चाहते हैं, तो उन्हें फिर से लंबी पंजीकरण प्रक्रिया से गुजरना होगा। अधिक जल संसाधनों को मुक्त करने के लिए प्रबंधन कई घरों को काट सकता है। दरअसल, वे उन सभी घरों को काट देंगे, जिनमें हाल ही में पानी का उपयोग नहीं किया गया था और इस तरह कुछ मात्रा में मुफ्त पानी हमेशा उपलब्ध था।

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

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

यह मेरे लिए सबसे कष्टप्रद व्यवहार है क्योंकि मुझे हिकअप से नफरत है और आपका इस पर कोई नियंत्रण नहीं है। इसे बंद करने में सक्षम होना अच्छा होगा। मैं कुछ की तर्ज पर सोच रहा हूं

sed -i 's/may_unmap = 1/may_unmap = (vm_swappiness >= 0)/' mm/vmscan.c

और फिर आप इसे अक्षम करने के लिए vm_swappiness -1 को सेट कर सकते हैं। यह मेरे छोटे परीक्षणों में काफी अच्छी तरह से काम किया है, लेकिन अफसोस मैं कोई कर्नेल डेवलपर नहीं हूं, इसलिए मैंने इसे किसी को नहीं भेजा (और जाहिर है कि ऊपर थोड़ा संशोधन पूरा नहीं हुआ है)।

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

यह वही है जो जावा की वर्चुअल मशीन करती है: यह स्टार्टअप पर मेमोरी का एक गुच्छा आवंटित करता है और फिर उसी से काम करता है। डिफ़ॉल्ट रूप से कर्नेल केवल मेमोरी आवंटित करेगा जब आपका जावा ऐप वास्तव में इसका उपयोग करना शुरू कर देगा। हालाँकि यदि आप ओवरकॉमिट को अक्षम करते हैं, तो कर्नेल आरक्षण को गंभीरता से लेगा। यह केवल आवंटन को सफल होने की अनुमति देगा यदि इसके पास वास्तव में इसके लिए संसाधन हैं।

हालांकि, इस दृष्टिकोण के साथ एक और गंभीर समस्या है। मान लीजिए कि एक कंपनी हर दिन (10 के चरणों के बजाय) पानी की एक इकाई का अनुरोध करना शुरू करती है। आखिरकार आप एक ऐसी स्थिति में पहुंच जाएंगे जहां आपके पास 0 निःशुल्क इकाइयां हैं। अब यह कंपनी अधिक आवंटन नहीं कर पाएगी। यह ठीक है, जो वैसे भी बड़ी कंपनियों के बारे में परवाह करता है। लेकिन समस्या यह है कि छोटे घर या तो अधिक पानी का अनुरोध नहीं कर पाएंगे! पर्यटकों की अचानक आमद से निपटने के लिए आप छोटे सार्वजनिक बाथरूम का निर्माण नहीं कर पाएंगे। आप पास के जंगल में आग लगने पर आपातकालीन पानी नहीं दे पाएंगे।

कंप्यूटर के संदर्भ में: बहुत कम स्मृति स्थितियों में ओवरकॉमिट के बिना आप एक नया xterm नहीं खोल पाएंगे, आप अपनी मशीन में ssh नहीं कर पाएंगे, आप संभव के लिए खोज करने के लिए एक नया टैब नहीं खोल पाएंगे फिक्स। दूसरे शब्दों में, ओवरकमिट को निष्क्रिय करने से भी मेमोरी कम होने पर आपका डेस्कटॉप बेकार हो जाता है।

3. अब यहां समस्या से निपटने का एक दिलचस्प तरीका है जब कोई कंपनी बहुत अधिक पानी का उपयोग करना शुरू करती है। जल प्रबंधन ने इसे उड़ा दिया! शाब्दिक रूप से: यह रेस्तरां की साइट पर जाता है, इसमें डायनामाइट्स फेंकता है और जब तक यह फट नहीं जाता तब तक इंतजार करता है। यह शहर की पानी की आवश्यकताओं को तुरंत बहुत कम कर देगा ताकि नए लोग आगे बढ़ सकें, आप सार्वजनिक बाथरूम आदि बना सकते हैं। आप, मेयर के रूप में, इस उम्मीद में रेस्तरां का पुनर्निर्माण कर सकते हैं कि इस बार कम पानी की आवश्यकता होगी। उदाहरण के लिए, आप लोगों से कहेंगे कि अगर वे पहले से ही बहुत से लोगों के अंदर हैं (जैसे आप कम ब्राउज़र टैब खोलेंगे) तो रेस्तरां में न जाएं।

यह वास्तव में क्या होता है जब कर्नेल सभी विकल्पों से बाहर निकलता है और उसे मेमोरी की आवश्यकता होती है: इसे OOM किलर कहता है। यह एक बड़ा अनुप्रयोग चुनता है (कई उत्तराधिकारियों के आधार पर) और इसे मारता है, स्मृति के गुच्छा को मुक्त करता है लेकिन एक उत्तरदायी डेस्कटॉप को बनाए रखता है। दरअसल एंड्रॉइड कर्नेल इसे और भी आक्रामक तरीके से करता है: यह कम से कम हाल ही में उपयोग किए गए ऐप को मारता है जब मेमोरी कम होती है (स्टॉक कर्नेल की तुलना में जो इसे केवल अंतिम उपाय के रूप में करता है)। इसे Android में वाइकिंग किलर कहा जाता है।

मुझे लगता है कि यह समस्या का सबसे सरल समाधान है: ऐसा नहीं है कि आपके पास इससे अधिक विकल्प हैं इसलिए इसे बाद में जितनी जल्दी हो सके, ठीक है? समस्या यह है कि कर्नेल कभी-कभी OOM किलर से बचने के लिए काफी काम करता है। इसलिए आप देखते हैं कि आपका डेस्कटॉप बहुत धीमा है और कर्नेल इसके बारे में कुछ नहीं कर रहा है। लेकिन सौभाग्य से ओओएम हत्यारे को खुद को लागू करने का एक विकल्प है! सबसे पहले, सुनिश्चित करें कि जादू sysrq कुंजी सक्षम है (जैसे echo 1 | sudo tee /proc/sys/kernel/sysrq) तब जब भी आपको लगे कि कर्नेल मेमोरी पर कम चल रहा है, तो बस Alt + SysRQ, Alt + f दबाएं।

ठीक है तो यह सब अच्छा है लेकिन आप इसे आज़माना चाहते हैं? कम स्मृति स्थिति प्रजनन के लिए बहुत सरल है। मेरे पास इसके लिए बहुत ही सरल ऐप है। आपको इसे दो बार चलाने की आवश्यकता होगी। पहला रन यह निर्धारित करेगा कि आपके पास कितनी मुफ्त रैम है, दूसरा रन कम मेमोरी की स्थिति पैदा करेगा। ध्यान दें कि यह विधि मानती है कि आपने स्वैप अक्षम किया है (उदाहरण के लिए a sudo swapoff -a)। कोड और उपयोग इस प्रकार है:

// gcc -std=c99 -Wall -Wextra -Werror -g -o eatmem eatmem.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    int limit = 123456789;
    if (argc >= 2) {
        limit = atoi(argv[1]);
    }
    setbuf(stdout, NULL);
    for (int i = 1; i <= limit; i++) {
        memset(malloc(1 << 20), 1, 1 << 20);
        printf("\rAllocated %5d MiB.", i);
    }
    sleep(10000);
    return 0;
}

और यहां बताया गया है कि आप इसका उपयोग कैसे करते हैं:

$ gcc -std=c99 -Wall -Wextra -Werror -g -o eatmem eatmem.c
$ ./eatmem
Allocated 31118 MiB.Killed
$ ./eatmem 31110
Allocated 31110 MiB.Killed

पहले मंगलाचरण से पता चला कि हमारे पास 31,118 MiB मुफ्त रैम है। इसलिए मैंने एप्लिकेशन को 31,110 MiB RAM आवंटित करने के लिए कहा, ताकि कर्नेल इसे मार न दे, लेकिन लगभग मेरी सारी मेमोरी खा जाए। मेरा सिस्टम जम गया: यहां तक ​​कि माउस पॉइंटर भी हिलता नहीं था। मैंने Alt + SysRQ, Alt + f दबाया है और इसने मेरी खाने की प्रक्रिया को मार दिया है और सिस्टम बहाल हो गया है।

भले ही हम अपने विकल्पों को कम स्मृति स्थिति में करते हैं, लेकिन सबसे अच्छा तरीका (किसी भी अन्य खतरनाक स्थिति की तरह) पहली जगह में इससे बचना है। इसे करने के कई तरीके हैं। एक सामान्य तरीका जो मैंने देखा है वह है कि दुर्व्यवहार के अनुप्रयोगों (जैसे ब्राउज़रों) को बाकी सिस्टम की तुलना में अलग-अलग कंटेनरों में डाल दिया जाए। उस स्थिति में ब्राउज़र आपके डेस्कटॉप को प्रभावित नहीं कर पाएगा। लेकिन खुद को रोकना सवाल के दायरे से बाहर है इसलिए मैं इसके बारे में नहीं लिखूंगा।

टीएल; डीआर: हालांकि वर्तमान में पेजिंग से पूरी तरह से बचने का कोई तरीका नहीं है, आप ओवरकमिटी को अक्षम करके पूर्ण प्रणाली-ठहराव को कम कर सकते हैं। लेकिन कम-मेमोरी स्थिति के दौरान लेकिन एक अलग तरीके से आपका सिस्टम अभी भी अनुपयोगी रहेगा। उपरोक्त के बावजूद, कम-मेमोरी स्थिति में कर्नेल के चयन की एक बड़ी प्रक्रिया को मारने के लिए Alt + SysRQ, Alt + f दबाएं। आपके सिस्टम को कुछ सेकंड के बाद अपनी जवाबदेही को बहाल करना चाहिए। यह मानता है कि आपके पास मैजिक sysrq कुंजी सक्षम है (यह डिफ़ॉल्ट रूप से नहीं है)।


मैंने आपको इस संसाधन पर इनाम के रूप में अपनी सारी प्रतिष्ठा दी है, इसलिए मैं एक टिप्पणी भी नहीं छोड़ सकता :) आखिरकार, मैंने इस महान उत्तर के लिए धन्यवाद कहने के लिए कुछ अर्जित किया! मैं इस मुद्दे से हर समय निपट रहा था जब मेरे पास अपना लैपटॉप 8GB था (पागल था, लेकिन मेरा सिस्टम उन दिनों नियमित रूप से मेमोरी से बाहर जा रहा था)। हाल ही में, मुझे यह प्रोजेक्ट मिला: github.com/rfjakob/earlyoom , जो बहुत देर होने से पहले कुछ प्रक्रियाओं को मारकर सिस्टम को रोकने में मदद कर सकता है।
व्लाद फ्रलोव

4

अपने सभी अस्थायी और कैश फ़ाइलों को एक पर tmpfsरखना आपके पास मुफ्त रैम की मात्रा को कम कर रहा है, इसलिए हो सकता है कि आप सिस्टम को जल्द से जल्द स्वैप करने का कारण बन सकते हैं क्योंकि इसके बिना इसकी आवश्यकता होगी।

ऐसा लगता है कि आपके पास कुछ एप्लिकेशन हैं जो किसी प्रकार की कर्नेल सुविधा या ड्राइवर पर निर्भर हैं जो अतिभारित हो रहे हैं। आप ब्राउज़रों और अनुक्रमणिकाओं का उपयोग करने के अलावा और किस प्रकार के अनुप्रयोगों के बारे में बहुत अधिक विस्तार में नहीं जाते हैं, और आपने अनुक्रमणिका को अक्षम कर दिया है।

आप डेस्कटॉप वातावरण या विंडो प्रबंधक पर स्विच करने का प्रयास कर सकते हैं जो कम संसाधनों का उपभोग करता है, जैसे कि LXDE या IceWM। काम पर मैं एक बहुत कम से कम डेस्कटॉप वातावरण के लिए LXDE स्थापित और ROX-Filer के साथ एक लिनक्स प्रणाली का उपयोग करता हूं। इस लिनक्स सिस्टम का उद्देश्य VMWare प्लेयर चलाना है ताकि मैं Windows XP और Windows 7 को एक साथ चला सकूं। यह समान हार्डवेयर चश्मा है जो आप कहते हैं और मेरे पास बहुत अधिक जवाबदेही मुद्दे नहीं हैं इस भारी भार के तहत मैं हार्डवेयर डाल रहा हूं। मेरे पास लिनक्स के साथ कोई जवाबदेही के मुद्दे नहीं हैं (यह आमतौर पर वीएम हैं जो कभी-कभी मुझे एक सेकंड इंतजार करते हैं, और 2 वीएम + 1 ओएस के बीच 1 डिस्क साझा करना अपेक्षित है) और वीएम को हमेशा निलंबित या बंद करने में सक्षम रहे हैं में चाहता हूं।

इसलिए मेरे लिए यह आपके द्वारा चलाए जा रहे विशिष्ट अनुप्रयोगों के साथ कुछ समस्या की ओर इशारा करता है।

क्या DMA आपके डिस्क ड्राइव के लिए सक्षम है? (उपयोग hdparm) यदि आप फुल-डिस्क एन्क्रिप्शन का उपयोग कर रहे हैं, तो सीपीयू के माध्यम से जाने के लिए सभी डिस्क ट्रैफ़िक की आवश्यकता होती है जो डीएमए के लाभ को बहुत अधिक नकार देती है। इसका प्रभाव यह होगा कि उच्च डिस्क ट्रैफ़िक सीपीयू को स्पाइक का कारण बनता है जो तब पूरे सिस्टम को धीमा कर देगा। (संपादित करें: स्पष्ट करने के लिए, DMA अक्षम या dm-cryptउच्च डिस्क ट्रैफ़िक के दौरान उच्च CPU का उपयोग करेगा)


2
सवाल का मुद्दा यह नहीं है कि WM फूला हुआ है और सिस्टम धीमा हो जाता है (यह सामान्य उपयोग के तहत पूरी तरह से उत्तरदायी है), लेकिन यह कि कर्नेल ठीक से अनुप्रयोगों को प्राथमिकता नहीं दे रहा है जब यह मेमोरी से बाहर चला जाता है और इसमें जाना पड़ता है भारी गमागमन। मैं हर डेस्कटॉप लिनक्स मैं कभी इस्तेमाल किया है पर इस मुद्दे था, और हल्के कार्यक्रमों का उपयोग करते समय या अधिक राम जोड़ने से मदद मिल सकती है, यह समस्या की जड़ को संबोधित नहीं करता है।
क्रेजी 2be

अपनी पिछली पोस्ट में मैंने निम्नलिखित कहा है: "ऐसा लगता है कि आपके पास कुछ अनुप्रयोग हैं जो किसी प्रकार की कर्नेल सुविधा या ड्राइवर पर निर्भर हैं जो अतिभारित हो रहे हैं।" तो शायद अड़चन एक विशिष्ट कर्नेल मॉड्यूल में है। मैं कर्नेल विशेषज्ञ नहीं हूं, लेकिन मुझे यकीन है कि कर्नेल की ओर से मेमोरी आवंटन, विशेष रूप से मॉड्यूल पक्ष, उपयोगकर्ता की ओर से अलग तरह से काम कर रहा है। कर्नेल पक्ष में सीपीयू उपयोग को भी अलग तरह से संभाला जाता है (पता नहीं है कि क्या आप "अच्छा" कर्नेल प्रक्रिया कर सकते हैं)। मैं शामिल विशिष्ट अनुप्रयोगों को जानने के बिना आगे टिप्पणी नहीं कर सकता।
LawrenceC

इसके अलावा अगर आप FUSE NTFS का उपयोग कर रहे हैं जो धीमापन पैदा कर सकता है।
LawrenceC

1
मुझे पता है कि रैम-आधारित फाइलसिस्टम जैसे कि tmpfs (जाहिर है) रैम को तेज चलाने का कारण बनता है, और यह कि हल्का WM अंतर्निहित मुद्दे के लक्षणों को कम कर सकता है। मुझे लगा कि डिस्क को लिखने की खराब प्रतिक्रिया के कारण tmpfs का उपयोग करने का दबाव पड़ सकता है। फिर भी आपके सुझाव के लिए धन्यवाद, विशेष रूप से डीएमए के बारे में, जो मैंने संभवतः संबंधित विषयों की सूची में जोड़ा है। रिकॉर्ड के लिए, मेरा मानना ​​है कि डीएमए सक्षम है, और मैं एक क्रिप्टोग्राफिक फाइल सिस्टम का उपयोग नहीं कर रहा हूं।
user76871

1

यह लिनक्स के अनुसूचक के साथ एक आम समस्या है। जब भी IO भारी गतिविधियाँ होती हैं, तो सिस्टम क्रॉल की ओर बढ़ जाता है। जब तक आप कर्नेल हैकिंग में नहीं होते, तब तक हालात को सुधारने के लिए बहुत से काम नहीं हो सकते हैं :)

शायद ये मदद कर सकते हैं:

http://www.phoronix.com/scan.php?page=article&item=linux_2637_video&num=1

http://www.osnews.com/story/24223/Alternative_to_the_200_Lines_Kernel_Patch_that_Does_Wonders_


1
जैसा कि मुझे याद है, उन कर्नेल पैच वास्तव में केवल तभी प्रासंगिक होते हैं यदि आप किसी प्रोग्राम को संकलित कर रहे हैं या कुछ और कर रहे हैं जो बहुत सीपीयू (और आईओ?) एक टर्मिनल में भारी है , जबकि जीयूआई अनुप्रयोगों के साथ बातचीत करने की कोशिश कर रहा है। यह अधिक सामान्य स्थिति में मदद नहीं करता है जहां एक जीयूआई एप्लिकेशन कुछ भारी काम कर रहा है और आप दुर्भाग्य से एक और जीयूआई एप्लिकेशन के साथ काम करने की कोशिश कर रहे हैं।
mad2be

0

भले ही यह सवाल दो साल पुराना है और @ ypsu का जवाब बहुत अच्छा है, लेकिन RAM की कमी के कारण लिनक्स आधारित सिस्टम खराब होने की स्थिति अभी भी यहाँ है।

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

एक परियोजना है जो एक उपयोगकर्ता अंतरिक्ष डेमॉन के रूप में कार्य करती है जो बहुत स्मृति-भूख प्रक्रियाओं को मारने से पहले बहुत देर हो चुकी है: https://github.com/rfjakob/earlyoom

इसके अलावा, मैं मेमोरी-भूखे अनुप्रयोगों (जैसे क्रोम) के लिए साने मेमोरी लिमिट वाले डॉकटर कंटेनरों का उपयोग करता था।

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