क्या आप आउट-ऑफ-मेमोरी स्थितियों को संभालते हैं?


9

malloc0 या नए थ्रो अपवाद को वापस करने पर आप क्या करते हैं ? बस रुकें या OOM स्थिति से बचने की कोशिश करें / उपयोगकर्ता के काम को बचाएं?



11
अरे। मैं इसे "मन से बाहर" के रूप में पढ़ता रहता हूं। मेरे अतीत में बहुत सारे वीडियो गेम, मुझे लगता है। :)
एडम लेअर

जवाबों:


4

मैं एक दुर्घटना से बचने की तरह OOM से बचना चाहता हूँ।

काम का एक बड़ा हिस्सा करने से बचें (और एक ही बार में मेमोरी का बड़ा हिस्सा आवंटित करें)। डेटा को डिस्क पर रखें, OS डिस्क कैश पर भरोसा करें और जितना संभव हो मेमोरी-मैप्ड IO का उपयोग करें, और केवल एक समय में डेटा के एक छोटे हिस्से पर काम करें। यदि बड़ी मात्रा में डेटा को ऑन-लाइन (कम विलंबता के साथ परोसा जाना) चाहिए, तो उन्हें कई मशीनों में मेमोरी में रखें, जैसे सभी बड़ी सर्च इंजन कंपनियां करती हैं। या एक SSD खरीदें।


जाहिर है यह सबसे अधिक समझ में आता है।
mbq

2
OOM को इनायत (RAII, अपवाद सुरक्षा, blah ...) को कैसे संभालना है, इस बारे में एक बड़ी बहस हुई थी, लेकिन एक बार मैंने महसूस किया कि मल्टीथ्रेड सिस्टम में कई डायनेमिक मॉड्यूल (कुछ तृतीय-पक्ष से) के साथ, भले ही आपका धागा नहीं हुआ हो दुर्घटना, दुर्भाग्यपूर्ण समय का एक क्षण है जहां हर धागा एक OOM दिखाई देगा। अगर किसी एक ने भी आगे बढ़ने का फैसला किया, तो आप कुछ भी नहीं कर सकते, लेकिन प्रत्यक्षदर्शी।
रवांग

13

इस सवाल का जवाब देने वाले ज्यादातर लोगों ने शायद एम्बेडेड सिस्टम पर कभी काम नहीं किया है, जहां मॉलोक 0 वापस आना एक बहुत ही वास्तविक संभावना है। वर्तमान में मैं जिस सिस्टम पर काम कर रहा हूं, उस पर कुल 4.25K बाइट्स RAM (कि 4352 बाइट्स) है। मैं स्टैक के लिए 64 बाइट्स आवंटित कर रहा हूं, और वर्तमान में 1600 बाइट ढेर है। कल ही मैं एक हीप वॉक रूटीन पर डिबगिंग कर रहा था ताकि स्मृति के आवंटन और फ्रीजिंग का पालन कर सकूं। हीप वॉक एक सीरियल पोर्ट के आउटपुट के लिए एक छोटी (30 बाइट) स्टैटिकली आवंटित बफर का उपयोग करता है। इसे रिलीज़ संस्करण के लिए बंद कर दिया जाएगा।

चूँकि यह एक उपभोक्ता उत्पाद है, इसलिए यह बेहतर है कि उत्पाद को जारी किए जाने के बाद मेमोरी से बाहर न चलाएं। मुझे यकीन है कि यह विकास के दौरान होगा। किसी भी मामले में, मैं जो कर सकता हूं, वह स्पीकर को एक-दो बार बीप कर सकता है, और रीबूट को बाध्य करता है।


2
एक छोटी सी जगह के अंदर फंक्शनल फंक्शन्स का होना लाजवाब है ... यह बोन्साई जैसी कला का एक रूप है
रवांग

6
एम्बेडेड सिस्टम पर कई परियोजनाएं केवल स्मृति के गतिशील आवंटन से मना करती हैं। OOM का एकमात्र मामला स्टैक ओवरफ्लो रहता है।
मौविसील

आप सही हैं, लेकिन विशेष रूप से अपने पहले वाक्य के साथ: यह ज्यादातर बस ज्यादातर डेवलपर्स सौभाग्य से प्रासंगिक नहीं है।
कोनराड रुडोल्फ

4

पूरी तरह से ईमानदार होने के लिए, सभी परियोजनाओं में मैंने किया है (ध्यान रखें कि मैं अभी तक कहीं भी काम नहीं कर रहा हूं), मैंने कभी नहीं सोचा था कि ऐसा हो सकता है, और इस तरह मुझे लगता है कि मेरे कार्यक्रम बहुत तेजी से मौत मर जाएंगे।

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

मुझे लगता है कि इन दिनों, मूंगफली की तुलना में स्मृति कम है, यह ऐसा कुछ नहीं है जो अक्सर होना चाहिए। संरक्षित स्मृति की सुबह और उससे पहले, शायद यह एक चिंता का विषय था, लेकिन अब? केवल OOM त्रुटियां जो मैंने देखी हैं, वे बग कोड से थीं।


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

2

वैसे भी मॉलॉक रिटर्न कोड की जाँच करना बेकार है।

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

यह तब तक नहीं है जब तक आप स्मृति को नहीं लिखते हैं कि आपकी प्रक्रियाओं के लिए एक भौतिक, अद्वितीय, पृष्ठ आवंटित किया गया है। यदि यह आबंटन विफल रहता है, तो कर्नेल मेमोरी खोजने के प्रयास में एक प्रक्रिया (शायद आपकी!) को समाप्त कर देगा। उस बिंदु पर आप कुछ भी नहीं कर सकते।


मेरे पास लंबे समय तक नींद के साथ लूप में आने का विचार था - और संभवतया पुनर्प्राप्त करने के लिए यदि प्रक्रिया OOM हत्यारा बच जाएगी। मुझे यह आभास हो गया है कि 0 पते का उपयोग करने के प्रयास के कारण प्रक्रियाएँ समाप्त हो गई थीं, लेकिन मैंने कोई ठोस परीक्षण नहीं किया है।
एमसीबी

OOM हत्यारे से निपटने के लिए आपको कुछ विशेष करने की आवश्यकता नहीं है। यदि आपकी प्रक्रिया ने इसे ट्रिगर किया है, लेकिन इसका चयन नहीं किया गया था तो यह कभी पता नहीं चलेगा। सब कुछ ठीक वैसे ही काम करेगा जैसे कि पर्याप्त स्मृति थी। यदि दूसरी ओर आपकी प्रक्रिया का चयन किया जाता है तो इसे समाप्त कर दिया जाएगा और इसके बारे में आप कुछ भी नहीं कर सकते हैं।
क्रिस्टोफ़ प्रोवोस्ट

लेकिन मैं OOM के लिए कुछ मेमोरी खाली करने की प्रतीक्षा करने और फिर से आवंटित करने और जारी रखने का प्रयास कर सकता हूं। मुझे आभास है कि मॉलॉक / नई इसके होने का इंतजार नहीं कर रही है।
mbq

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

2
मुझे पूरा यकीन है कि खिड़कियां कभी भी ओवरकम नहीं करती हैं। यह रैम से अधिक कर सकता है, लेकिन रैम + स्वैपफिल से अधिक नहीं।
कोडइन्चोअस

2

जब तक आप एम्बेडेड सिस्टम, रियल-टाइम सिस्टम या सिस्टम के लिए विकसित नहीं कर रहे हैं, तब तक यह बहुत महत्वपूर्ण है कि विफलताओं में जीवन या अरबों डॉलर खर्च हो सकते हैं ... तब स्मृति स्थितियों से बाहर निकलने के बारे में चिंता करने के लिए यह आर्थिक रूप से लायक नहीं है।

ज्यादातर मामलों में, ऐसा बहुत कम होता है जब आप किसी भी तरह की मेमोरी से बाहर होते हैं, क्योंकि कोई भी नई वस्तु बनाने या कोई भी कार्य करने के लिए कोई मेमोरी नहीं होती है। आपको ओओएम को संभालने वाले ऐप की लागत का वजन करना होगा जो लाभ आपको इसे करने से मिलता है।


रीयल-टाइम सिस्टम को अन्य सिस्टम की तुलना में मॉलोक विफलता के बारे में अधिक जाँच करने की आवश्यकता नहीं है।
22

@zneak - असत्य। जब तक आप इसके लिए विशेष रूप से योजना नहीं बना रहे हों तब तक रीयल-टाइम सिस्टम को पूर्वानुमानित होना चाहिए और मेमोरी से बाहर निकलना अनुमानित नहीं है।
एरिक फनकेनबश

तो ओओएम हिट करने के बाद आप और क्या करने जा रहे हैं?
zneak

नि: शुल्क मेमोरी, प्रक्रियाओं को रद्द करें, आदि। एक वास्तविक समय प्रणाली में आमतौर पर कोई वर्चुअल मेमोरी या स्वैप प्रणाली नहीं होती है क्योंकि इसे नियतात्मक होना पड़ता है। तो, यह बहुत अधिक आसानी से स्मृति से बाहर चला सकता है।
एरिक फनकेनबसच

एक निश्चित कोड पथ को देखते हुए जो अनिवार्य रूप से एक OOM त्रुटि का कारण बनेगा, मैं यह नहीं देखता कि दुर्घटना कैसे मुक्त स्मृति और प्रक्रियाओं को रद्द करने की तुलना में कम निर्धारक दृष्टिकोण है।
जंकट

1

मैं हमेशा त्रुटि के लिए जाँच करूँगा। यदि कुछ त्रुटि स्थिति में लौटता है, तो इसे आपके कार्यक्रम द्वारा नियंत्रित किया जाना चाहिए। यहां तक ​​कि अगर यह एक संदेश है जो कहता है "आउट ऑफ़ मेमोरी, गॉट्टा गो!", यह "एक्सेस उल्लंघन", "कोर डंप", या जो भी हो, से बेहतर है। एक एक त्रुटि स्थिति है जिसे आप संभालते हैं, दूसरा एक बग है। और उपयोगकर्ता इसे ऐसे ही अनुभव करेगा।

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

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