यह।
लिनक्स में दो अलग-अलग मेमोरी स्थितियां हो सकती हैं। आपका सामना किसके मूल्य पर निर्भर करता है sysctl vm.overcommit_memory
( /proc/sys/vm/overcommit_memory
)
परिचय:
कर्नेल वह कार्य कर सकता है जिसे 'मेमोरी ओवरकमिट' कहा जाता है। यह तब है जब कर्नेल प्रोग्राम को अधिक मेमोरी आवंटित करता है जो वास्तव में सिस्टम में मौजूद है। यह इस उम्मीद में किया जाता है कि कार्यक्रम वास्तव में आवंटित की गई सभी मेमोरी का उपयोग नहीं करेंगे, क्योंकि यह काफी सामान्य घटना है।
overcommit_memory = 2
जब overcommit_memory
सेट किया जाता है 2
, तो कर्नेल किसी भी ओवरकम का प्रदर्शन नहीं करता है। इसके बजाय जब किसी प्रोग्राम को मेमोरी आवंटित की जाती है, तो उस मेमोरी को एक्सेस करने की गारंटी दी जाती है। यदि सिस्टम के पास आवंटन अनुरोध को पूरा करने के लिए पर्याप्त खाली मेमोरी नहीं है, तो कर्नेल अनुरोध के लिए असफलता लौटाएगा। यह स्थिति को इनायत करने के लिए कार्यक्रम पर निर्भर है। यदि यह जांच नहीं करता है कि आवंटन सफल हुआ जब यह वास्तव में विफल हो गया, तो आवेदन अक्सर एक segfault का सामना करेगा।
सेगफॉल्ट के मामले में, आपको इस तरह की आउटपुट में एक लाइन मिलनी चाहिए dmesg
:
[1962.987529] myapp[3303]: segfault at 0 ip 00400559 sp 5bc7b1b0 error 6 in myapp[400000+1000]
इसका at 0
मतलब है कि एप्लिकेशन ने एक अनइंस्टॉल किए गए पॉइंटर को एक्सेस करने की कोशिश की, जो असफल मेमोरी आवंटन कॉल का परिणाम हो सकता है (लेकिन यह एकमात्र तरीका नहीं है)।
overcommit_memory = 0 और 1
जब overcommit_memory
करने के लिए सेट कर दिया जाता 0
या 1
, ओवरकमिट सक्षम किया गया है, और कार्यक्रमों अधिक स्मृति की तुलना में वास्तव में उपलब्ध है आवंटित करने के लिए अनुमति दी जाती है।
हालाँकि, जब कोई प्रोग्राम उस मेमोरी का उपयोग करना चाहता है जिसे वह आवंटित किया गया था, लेकिन कर्नेल पाता है कि वास्तव में उसे संतुष्ट करने के लिए पर्याप्त मेमोरी नहीं है, इसे कुछ मेमोरी वापस पाने की आवश्यकता है। यह पहले विभिन्न मेमोरी क्लीनअप कार्य करने की कोशिश करता है, जैसे कि फ्लशिंग कैश, लेकिन यदि यह पर्याप्त नहीं है तो यह एक प्रक्रिया को समाप्त कर देगा। यह समाप्ति OOM-Killer द्वारा की जाती है। OOM-Killer सिस्टम को यह देखने के लिए देखता है कि कौन से प्रोग्राम किस मेमोरी का उपयोग कर रहे हैं, वे कितने समय से चल रहे हैं, कौन उन्हें चला रहा है, और कई अन्य कारक जो यह निर्धारित करते हैं कि कौन मारा जाता है।
इस प्रक्रिया के मारे जाने के बाद, इसका उपयोग करने वाली मेमोरी को मुक्त कर दिया गया है, और जो प्रोग्राम सिर्फ आउट-ऑफ-मेमोरी स्थिति का कारण बनता है, उसकी स्मृति की आवश्यकता है।
हालांकि, इस मोड में भी, कार्यक्रमों को अभी भी आवंटन अनुरोधों से इनकार किया जा सकता है। जब overcommit_memory
यह है 0
, कर्नेल एक सर्वश्रेष्ठ अनुमान लेने की कोशिश करता है जब उसे आवंटन अनुरोधों को अस्वीकार करना शुरू करना चाहिए। जब इसे सेट किया जाता है 1
, तो मुझे यकीन नहीं है कि यह निर्धारित करने के लिए क्या निर्धारण का उपयोग करता है जब इसे किसी अनुरोध से इनकार करना चाहिए लेकिन यह बहुत बड़े अनुरोधों से इनकार कर सकता है।
आप देख सकते हैं कि क्या OOM-Killer के उत्पादन को देखने dmesg
और एक संदेश खोजने के लिए शामिल है:
[11686.043641] Out of memory: Kill process 2603 (flasherav) score 761 or sacrifice child
[11686.043647] Killed process 2603 (flasherav) total-vm:1498536kB, anon-rss:721784kB, file-rss:4228kB