मैं जो समझता हूं, जब सिस्टम के पास कोई मुफ्त मेमोरी नहीं है, तो कर्नेल को कुछ मेमोरी फिर से प्राप्त करने के लिए प्रक्रियाओं को मारना शुरू करना चाहिए। लेकिन मेरे सिस्टम में ऐसा बिल्कुल नहीं होता है।
मान लीजिए कि एक साधारण स्क्रिप्ट जो सिस्टम में उपलब्ध की तुलना में बहुत अधिक मेमोरी आवंटित करती है (उदाहरण के लिए लाखों स्ट्रिंग्स के साथ एक सरणी)। यदि मैं इस तरह से एक स्क्रिप्ट चलाता हूं (एक सामान्य उपयोगकर्ता के रूप में), यह पूरी तरह से सभी मेमोरी प्राप्त करता है जब तक कि सिस्टम पूरी तरह से जमा नहीं हो जाता है (केवल SysRQ REISUB काम करता है)।
यहां अजीब बात यह है कि जब कंप्यूटर फ्रीज होता है, तो हार्ड ड्राइव का नेतृत्व चालू हो जाता है और उस तरह से रहता है जब तक कि कंप्यूटर को रिबूट नहीं किया जाता है, या तो मेरे पास एक स्वैप विभाजन घुड़सवार है या नहीं!
तो मेरे सवाल हैं:
- क्या यह व्यवहार सामान्य है? यह अजीब है कि एक सामान्य उपयोगकर्ता के रूप में निष्पादित एक एप्लिकेशन इस तरह से सिस्टम को क्रैश कर सकता है ...
- क्या कोई तरीका है जब मैं उबंटू बना सकता हूं बस स्वचालित रूप से उन अनुप्रयोगों को मार सकता हूं जब वे बहुत अधिक (या सबसे) मेमोरी प्राप्त करते हैं?
अतिरिक्त जानकारी
- उबुन्टु 12.04.3
- कर्नेल 3.5.0-44
रैम: 4GB से ~ 3.7GB (ग्राफिक्स कार्ड के साथ साझा)। *
$ tail -n+1 /proc/sys/vm/overcommit_* ==> /proc/sys/vm/overcommit_memory <== 0 ==> /proc/sys/vm/overcommit_ratio <== 50 $ cat /proc/swaps Filename Type Size Used Priority /dev/dm-1 partition 4194300 344696 -1
Allocation failed
)। लेकिन स्वैप के बिना यह सिर्फ कंप्यूटर को जमा देता है। यह इस तरह से काम करना चाहिए (केवल स्वैप का उपयोग करते समय मारना)?
tail -n+1 /proc/sys/vm/overcommit_*
और आउटपुट जोड़ें। यहाँ भी देखें: मैं ओओम-किलर को कैसे कॉन्फ़िगर करूं