2012-10-24 17 views
7

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

मैं प्रवेश के इतिहास में देखा और पाया कि कुछ जावा प्रक्रियाओं थे कि यह क्या मार डाला।

मैं "टॉप" कमांड का इस्तेमाल किया देखने के लिए प्रक्रियाओं सबसे स्मृति को ले रहे थे अभी (के बाद समस्या का समाधान हो गया था) और यह एक जावा प्रक्रिया थी। तो संक्षेप में, मैं बता सकता हूं कि अभी कौन सी प्रक्रियाएं सबसे अधिक मेमोरी ले रही हैं।

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

उत्तर

2

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

+0

Fwiw, आप mlockall() या इसी तरह के एक के दौरान उपयोग कर सकते हैं एक प्रक्रिया अपेक्षाकृत विश्वसनीय बनाने के लिए करने के लिए मेमोरी क्रंच ईजी: http://stromberg.dnsalias.org/~strombrg/fallback-reboot/ – user1277476

+0

यह केवल बहुत सीमित अनुप्रयोगों के लिए सच है। किसी भी सिस्टम कॉल को कर्नेल में आवंटन विफलताओं के कारण असफल होने की संभावना है। बाहरी प्रक्रियाओं को फैलाना सवाल से बाहर है। बफर थकावट के कारण फाइल सिस्टम I/O अनिश्चित काल तक लटका सकता है। यह सच है कि यह असंभव नहीं है, लेकिन यह असाधारण देखभाल के साथ किया जाना चाहिए। –

3

@Andy आपके प्रश्न का उत्तर है। हालांकि, मैं इसे जोड़ना चाहता हूं कि भविष्य के संदर्भ के लिए एक निगरानी उपकरण का उपयोग करें। कुछ these की तरह कुछ। ये आपको दुर्घटना के दौरान क्या हुआ होगा क्योंकि आप स्पष्ट रूप से हर समय अपने सभी सर्वरों की निगरानी नहीं कर सकते हैं। आशा करता हूँ की ये काम करेगा।

0

लिनक्स में स्मृति उपयोग का कोई इतिहास डिफ़ॉल्ट नहीं है, लेकिन आप इसे sar जैसे कुछ सरल कमांड लाइन टूल के साथ प्राप्त कर सकते हैं।

स्मृति के साथ आपकी समस्या के बारे में: यदि यह ओओएम-किलर था जिसने मशीन पर कुछ गड़बड़ की थी, तो आपके पास यह सुनिश्चित करने का एक अच्छा विकल्प होगा कि यह फिर से नहीं होगा (निश्चित रूप से जेवीएम ढेर आकार को कम करने के बाद)।

डिफ़ॉल्ट लिनक्स कर्नेल से अधिक स्मृति की तुलना में यह वास्तव में है आवंटित करता है। कुछ मामलों में, कर्नेल कार्यों के लिए कोई स्मृति नहीं होने पर ओओएम-किलर सबसे स्मृति-उपभोग करने वाली प्रक्रिया को मार सकता है। यह व्यवहार vm.overcommit sysctl पैरामीटर द्वारा नियंत्रित किया जाता है।

तो, आप इसे vm.overcommit = 2 पर सेट करने का प्रयास कर सकते हैं sysctl.conf और फिर sysctl -p चलाएं।

यह अतिसंवेदनशीलता को रोक देगा और ओओएम-हत्यारे को बहुत कम काम करने की संभावना कम करेगा। इसके अलावा आप कुछ हद तक स्वैप स्पेस (यदि आपके पास पहले से नहीं है) जोड़ने और vm.swappiness को कुछ वाकई कम मूल्य (जैसे 5) पर सेट करने के बारे में सोच सकते हैं, उदाहरण के लिए। डिफ़ॉल्ट मान 60 है), इसलिए सामान्य वर्कफ़्लो में आपका एप्लिकेशन स्वैप पर नहीं जाऊंगा, लेकिन अगर आप वास्तव में स्मृति पर कम हो जाएगा, यह अस्थायी रूप से उपयोग कर रहा शुरू कर देंगे और आप इसे भी df

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

  1. कोशिश अनुप्रयोगों द्वारा स्मृति के उपयोग को प्रतिबंधित करने के
  2. उनमें से
  3. ले जाएँ हिस्सा किसी अन्य मशीन
संबंधित मुद्दे