2009-12-22 15 views
5

मैं समझता हूं कि लिनक्स पर एक कर्नेल कार्यक्षमता है जिसे "ओओएम किलर" कहा जाता है। जब ओओएम (आउट ऑफ़ मेमोरी) स्थिति कम हो जाती है, तो "प्रक्रिया पुनर्विक्रेता" जैसी कोई चीज़ है?"ओओएम किलर" के बाद, क्या "पुनर्विक्रेता" है?

मुझे समझ में आता है कि इस कार्यक्षमता को सभी प्रकार के कारणों के लिए कार्यान्वित करना मुश्किल होगा, लेकिन क्या ऐसा कुछ है जो इसके करीब आता है?

संपादित: उदाहरण: "Resurrector" प्रक्रिया जानकारी (जैसे कमांड लाइन, पर्यावरण आदि) (यानी नहीं एक पूरी प्रक्रिया कोड के एक सीमित सेट के भंडारण के लिए यह करने की गारंटी स्मृति का एक ब्लॉक के लिए होता है & डेटा!)। एक बार ओओएम की स्थिति को मंजूरी मिलने के बाद, "पुनर्विक्रेता" सूची के माध्यम से जा सकता है और कुछ प्रक्रियाओं को "पुनरुत्थान" कर सकता है।

जो मैं अभी तक इकट्ठा करता हूं, वहां से जो कुछ भी मैं पूछ रहा हूं उसके समान कार्यक्षमता प्रतीत नहीं होता है।

+0

मुझे समझ नहीं आता क्यों लोगों को इस बंद करना चाहते हैं का उदाहरण सवाल यह है कि यह बहुत प्रोग्रामिंग उन्मुख है: कार्यक्रमों को ओओएम स्थितियों/आउट-ऑफ-ओओएम स्थितियों से कैसे निपटना पड़ता है। – jldupont

उत्तर

5

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

संपादित करें: एक विचार प्रयोग के रूप में, इस बारे में सोचें कि किसी प्रक्रिया के पुनरुत्थान का क्या अर्थ होगा। यहां तक ​​कि यदि आप पूरी प्रक्रिया स्थिति को स्टोर कर सकते हैं, तो आप नहीं चाहते हैं क्योंकि मारे गए प्रक्रिया को स्मृति की स्थिति के लिए कारण हो सकता है।

तो संभवतः आप संभवतः सबसे अच्छा कारण यह स्टार्टअप स्थिति (कमांड लाइन, आदि) को स्टोर करना होगा। लेकिन यह कोई अच्छा नहीं है, क्योंकि फिर से, ऐसा हो सकता है कि क्यों सिस्टम पहली जगह मेमोरी से बाहर चला गया!

इसके अलावा, अगर आप इस तरह से एक प्रक्रिया को पुनर्जीवित करते हैं, तो कोई बात नहीं है कि क्या गलत हो सकता है। क्या होगा यदि प्रक्रिया हार्डवेयर को नियंत्रित करती है? क्या होगा अगर प्रक्रिया नियंत्रण एक से अधिक बार नहीं चलाना चाहिए? क्या होगा यदि यह एक टीटी से जुड़ा हुआ था जो अब और नहीं है (क्योंकि एसएसडीडी प्रक्रियाओं में से एक था)?

ऐसी प्रक्रिया के आसपास एक विशाल मात्रा में संदर्भ है जिस पर सिस्टम संभवतः अवगत नहीं हो सकता है। केवल समझदार चीज वह चीज है जो कर्नेल करता है: चूसने वाले को मारो और आगे बढ़ो।

मुझे लगता है कि आप एक हाइबरनेट-द-प्रोसेस-टू-डिस्क रणनीति की कल्पना कर सकते हैं, लेकिन यह देखते हुए कि हम स्मृति (स्वैप सहित) से बाहर हैं, इसका मतलब है कि या तो डिस्क स्थान को पूर्व-सुरक्षित करना या डिस्क स्थान आवंटित करने का निर्णय लेना फ्लाई पर यह करने के लिए। किसी भी रणनीति में से किसी भी प्रक्रिया में प्रक्रिया के आकार से निपटने में सक्षम नहीं हो सकता है।

संक्षेप में: नहीं, आप ओओएम हत्यारे से वापस नहीं आते हैं। यह एक हत्यारा है, आपको बस इससे निपटना होगा।

+0

मैं एक ही सामान्य निष्कर्ष के लिए आया था यानी पुनर्विक्रेता: समाधान पर एक शॉट प्राप्त करने के लिए अधिक संदर्भ के लिए कठिन और आवश्यकता। आपके योगदान के लिए धन्यवाद। डिस्क पर – jldupont

3

बेशक कोई नहीं है। अन्यथा, अगर इसे स्टोर करने के लिए कोई और स्मृति नहीं है तो एक मारे गए प्रक्रिया को कहां रखा जा सकता है? :-)

बात यह है कि ओओएम हत्यारा केवल खेल में आता है जब सभी उपलब्ध स्मृति, राम और ऑन-डिस्क स्वैप मेमोरी दोनों समाप्त हो जाती है। यदि "प्रक्रिया पुनरुत्पादक" स्थिति कम होने के बाद एक प्रक्रिया को "पुनरुत्थान" कर सकती है, तो उसे उस समय कहीं भी स्टोर करने में सक्षम होना चाहिए जब "हत्यारा" शुरू होता है। लेकिन चूंकि हत्यारा केवल तब शुरू होता है जब कोई स्मृति उपलब्ध नहीं है, यह असंभव है।

बेशक आप "डिस्क पर सहेजें" कह सकते हैं, लेकिन अच्छी तरह से, स्मृति डिस्क को स्वैप करें।यदि आप अपनी प्रक्रिया की स्मृति खपत को सीमित करना चाहते हैं, तो ulimit कार्यक्षमता का उपयोग करें और ps प्रोग्राम या /proc फाइल सिस्टम के माध्यम से मैन्युअल रूप से अपने mem उपयोग को ट्रैक करें। "ओओएम हत्यारा" एक आतंक उपाय है और प्रक्रियाओं के लिए बहुत अच्छा नहीं होना चाहिए।

आप (बिना, और, शायद, लेकिन मैं अपने सिस्टम एटीएम पर OOM हत्या के साथ प्रयोग नहीं कर सकता) ulimit साथ क्या कर सकते

#!/bin/bash 
save_something=$ENV_VARIABLE 
(ulimit -Sv 1000000; 
    perl -e 'print "Taking all RAM!!!\n"; while (1) { $a[$i++] = $i; }' 
) 
echo "killed, resetting" 
(ulimit -Sv 1000000; 
    export ENV_VARIABLE="$save_something" 
    perl -e 'print "Taking all RAM!!!\n"; while (1) { $a[$i++] = $i; }' 
) 
+1

? क्या यह सब "हाइबरनेशन" नहीं है? –

+0

hmmm ... इस उद्देश्य के लिए कुछ स्मृति को छोड़कर शायद ... – jldupont

+2

@Eric - जब हम स्मृति से बाहर निकलते हैं, तो राम और डिस्क (स्वैप) दोनों पर ओओएम हत्यारा निष्पादित होता है। तो इसे स्टोर करने के लिए कहीं भी नहीं है, ओओएम हत्यारा केवल अंतिम उपाय के रूप में चलाया जाता है। –

संबंधित मुद्दे