कुछ सभी मेमोरी खाती है (मुझे कुछ ऐप पर मेमोरी लीक होने का संदेह है)। कैसे पता करें?


16

मेरे पास सर्वर है जो लिक्विडस + आइकॉस्ट बंडल और सरल वेबसाइट (httpd + mysqld) चलाता है। कुछ खास नहीं। लगभग प्रतिदिन एक साथ औसतन, लगभग 2000+ प्रति दिन आगंतुक।

सर्वर में 8GB रैम है। जैसे-जैसे समय बीतता है, मुफ्त मेमोरी की मात्रा लगातार घटती जाती है, हालांकि सर्वर पर कुछ भी नया शुरू नहीं होता है और कोई नया उपयोगकर्ता नहीं होता है। कुछ बिंदु पर यह स्वैप करना शुरू कर देता है, सर्वर पर लोड बढ़ता है और यह अनुत्तरदायी हो जाता है। आमतौर पर मैं क्या करता हूं बस सर्वर को पुनरारंभ करें ...

यह पता लगाने के लिए क्या किया जा सकता है कि वास्तव में स्मृति क्या लीक करती है? मैं संसाधनों के उपयोग की निगरानी के लिए शीर्ष का उपयोग करता हूं, लेकिन जहां तक ​​मुझे लगता है कि यह कुछ भी उपयोगी नहीं दिखाता है:

यहाँ छवि विवरण दर्ज करें

क्या यह पता लगाने का कोई तरीका है कि उस मेमोरी का क्या उपयोग है? या क्या भारी डिस्क को स्वैप करने के लिए शुरू होता है? सर्वर को रिबूट किए बिना मेमोरी को खाली करने का कोई तरीका?


किसी भी कारण से आप सर्वर के बजाय कुछ सेवाओं (अपाचे, लिक्विडसैप) को पुनः आरंभ करने का प्रयास नहीं करते हैं?
jamespo

मैंने मूल रूप से सामान्य मेमोरी उपयोग के लिए जवाब दिया। मैंने उपकरणों के एक सेट के साथ अद्यतन किया है जो समस्या को पहचानने में मदद कर सकता है।
बिलथोर

@ जेम्स, वास्तव में मैंने कोशिश की थी, लेकिन इसका कोई प्रभाव नहीं था, इसलिए पुनः आरंभ केवल एक चीज थी जो मुझे पता था कि इससे मदद मिल सकती है।
जयरजो

4027092k कैश की गई मेमोरी उपयोग की व्याख्या करनी चाहिए, नहीं? मैं इस समय एक समान समस्या पर कहीं और काम कर रहा हूं, और अब तक मैं यह पता लगाने में कामयाब रहा हूं कि मेमोरी ट्रांसफर को निम्न पैरामेट्स के साथ विनियमित किया जा सकता है: vfs_cache_pressure vm.dirty_ratio vm.dirty_background_batio बहुत बहुत स्वागत। मुझे उम्मीद है कि यह एक सही दिशा है।

जवाबों:


16

topमेमोरी साइज की रिपोर्ट करने के लिए बैच मोड में रनिंग समय-समय पर यह देखने के लिए किया जा सकता है कि मेमोरी का उपयोग कौन कर रहा है जब चीजें दक्षिण में जाती हैं। sarबैच मोड में रनिंग को मेमोरी उपयोग और संबंधित I / O पर कुछ अच्छे डायग्नोस्टिक्स देने चाहिए। muninसिस्टम की निगरानी के लिए रनिंग आपको अच्छी जानकारी के साथ एक ग्राफ देना चाहिए कि किस मेमोरी का उपयोग किया जा रहा है। इससे बहुत मदद मिल सकती है।

प्रोग्राम के अधिकतम कोर आकार को सीमित करने के लिए आप limit.conf का उपयोग कर सकते हैं। उचित रूप से सेट, यह किसी भी प्रोग्राम को मारना चाहिए जो मेमोरी लीक कर रहे हैं। यह pam_limits मॉड्यूल के साथ काम करता है। ulimitsकमांड के साथ सीमाएं भी निर्धारित की जा सकती हैं ।

आप कुछ प्रोग्राम चला रहे हैं जो बड़ी मात्रा में मेमोरी का उपयोग कर सकते हैं। कुछ चीजें जिन्हें आप देख सकते हैं उनमें शामिल हैं।

  • खराब प्रोग्राम के तहत चलने वाले एप्लिकेशन apache2मेमोरी को लीक कर सकते हैं। ऐसा होने पर आपको मेमोरी साइज़ बढ़ जाना चाहिए। आप Apache2 को एक निश्चित संख्या में उपयोग के बाद MaxRequestsPerChild100 या तो सेट करके बच्चों को रीसायकल करने के लिए ट्यून कर सकते हैं । यदि यह समस्या को हल करता है, तो आपको रिसाव को हल करने की आवश्यकता है। मैं इसे पहले देखूंगा।
  • MySQL मेमोरी में डेटा लोड करने का प्रयास कर सकता है। यदि आपके पास मेमोरी में बहुत अधिक डेटा है तो यह कुछ थ्रशिंग का कारण बन सकता है, लेकिन उतना नाटकीय नहीं होना चाहिए जितना आप देख रहे हैं।
  • यदि आपके पास एक बड़ा tmpfsफ़ाइल सिस्टम माउंट है, तो आप मेमोरी को लीक कर सकते हैं यदि उपयोग किए जाने पर फ़ाइलें हटा नहीं दी जाती हैं। बड़ी लंबी लाइव फाइलें भी एक समस्या हो सकती हैं।
  • यदि समस्या दिन के लगभग एक ही समय में होती है, तो आपके पास एक निर्धारित कार्यक्रम हो सकता है जो मेमोरी लीक कर रहा है।
  • यदि आपके पास एक प्रोग्राम है जो साझा मेमोरी को आवंटित करता है, लेकिन बाहर निकलने से पहले इसे जारी नहीं करता है, तो आपके पास अपेक्षाकृत अदृश्य मेमोरी लीक होगा। यदि साझा की गई मेमोरी मेमोरी में बंद है, तो यह स्वैपिंग को मजबूर कर सकती है। उपलब्ध साझा मेमोरी की मात्रा आम तौर पर अपेक्षाकृत सीमित होती है।
  • Liquidsoap + icecast बंडल मेमोरी का उपयोग करने वाले बफरिंग मुद्दों में चल सकता है। मैंने इस संयोजन का उपयोग नहीं किया है, इसलिए मुझे यकीन नहीं है कि यह कैसे दिखाई देगा।

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

जब आप किसी फ़ाइल को बफर कैश में पढ़ते हैं, तो कोई डिस्क एक्सेस की आवश्यकता नहीं होती है और बफर बफर से रीड को हल किया जाता है। राइट्स एक समान तंत्र का उपयोग करते हैं। यदि आपके सिस्टम को मेमोरी की आवश्यकता है, तो बफर कैश उन पहले स्थानों में से एक है जिसका उपयोग किया जाता है। अधिकांश बफ़र्स तुरंत जारी किए जा सकते हैं।

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


मेरे मामले में समस्या थोड़े अजीब है। यहां तक ​​कि जब लोड बहुत बड़ा होता है और सर्वर भारी रूप से स्वैप होता है, तो बहुत सारी मुफ्त मेमोरी होती है (जैसा कि मुझे समझ में आने के बाद मैंने बफ़र्स और कैश के बारे में पढ़ा)। शीर्ष मेमोरी को हॉगिंग करने की किसी भी प्रक्रिया को प्रदर्शित नहीं करता है। लेकिन लोड बढ़ जाता है और कुछ बिंदु पर सर्वर बेकार हो जाता है: | विस्तृत प्रतिक्रिया के लिए धन्यवाद।
जरजो

2
@ यारजो: मुनिन और सर को यह पता लगाने में मदद करनी चाहिए कि क्या चल रहा है। यदि आपके पास बहुत सारी मुफ्त मेमोरी है तो आपको स्वैप नहीं करना चाहिए। आपको एक अलग I / O समस्या हो सकती है। sarमदद करेगा कि किस विभाजन में I / O है और समस्या का पता लगाने में मदद कर सकता है।
बिलथोर

MaxRequestsPerChild सलाह के लिए +1
jamespo

11

RAM के उपयोग के बारे में शीर्ष 10 एप्लिकेशन देखने के लिए आप इस कमांड का उपयोग कर सकते हैं:

ps -A --sort -rss -o comm,pmem | head -n 11

कभी-कभी कई उप-प्रक्रियाएँ उत्पन्न होने पर यह कमांड आपकी मदद करती है:

ps auxf

इस तरह आप देख सकते हैं कि कौन-सी प्रक्रियाएँ एक साथ हैं।


ये आसान आदेश हैं, धन्यवाद मैं उन्हें भविष्य के लिए नोट करूंगा। लेकिन समस्या यह है कि शीर्ष पर हमेशा एक ही प्रक्रिया होती है (आप उन्हें संलग्न स्क्रीनशॉट में देख सकते हैं) - अपाचे, मायस्कल, लिक्विडसैप, आईसीकास्ट। और वे उपयोग करते हैं (या कम से कम उपयोग करने के लिए दिखाए गए हैं) स्मृति की समान मात्रा (नगण्य वास्तव में), तब भी जब सर्वर लोड से मर रहा है: |
जयरोज़ो

@ यारजो: क्या प्रक्रियाओं की संख्या बदल जाती है? क्या आपके पास बहुत अधिक प्रक्रियाएं हैं? और क्या यह एक भौतिक सर्वर या एक आभासी है?
राफेल लुथिगर

मैंने प्रक्रियाओं की संख्या में कोई बदलाव नहीं देखा है। मूल रूप से जब मैं शीर्ष करता हूं, जबकि सर्वर लोड से मर रहा होता है तो मुझे एक बहुत ही समान तस्वीर दिखाई देती है जो मैंने मूल प्रश्न में संलग्न की है, भारी लोड को छोड़कर: | सर्वर फिजिकल है।
जयरजो

2
"Vmstat" (जैसे vmstat -s) के साथ अधिक जानकारी प्राप्त करने का प्रयास करें। या पहले से ही वर्णित उपकरण "सर" के साथ। क्या आपके पास रैम आधारित फाइल सिस्टम है? फिर शायद "आईओस्टाट" अधिक जानकारी भी दे सकता है।
राफेल लूथिगर

1
मुझे संदेह है कि क्या "पीएमईएम" (% एमईएम) क्षेत्र psया topआउटपुट एक मेमोरी लीक का पता लगाने की कोशिश करने के लिए देखने के लिए सही चीज है: क्या यह केवल वर्तमान में उपयोग की जाने वाली भौतिक मेमोरी का प्रतिशत नहीं है? लेकिन इस प्रक्रिया के अन्य भागों का उपयोग (incl। लीक) मेमोरी को स्वैप किया जा सकता है। शायद "आकार" या "बनाम" एक प्रक्रिया के आकार को मापने के लिए अधिक उपयुक्त होगा? जैसे, ps -A --sort -size -o comm,size | head -n 11याps -A --sort -vsize -o comm,vsize | head -n 11
इम्ज़ - इवान ज़खरीशेव जुले

8

कुछ भी वास्तव में अनुप्रयोगों के संदर्भ में उस मेमोरी का उपयोग नहीं कर रहा है।

आपको 'कैश्ड' मूल्य में कटौती करने की आवश्यकता है जो कार्यक्रम के उपयोग के संदर्भ में आपके वास्तविक स्मृति उपयोग के रूप में एक बेहतर विचार प्राप्त करने के लिए पेज कैश का प्रतिनिधित्व करता है।

मूल रूप से यह अच्छा मेमोरी प्रबंधन है और यह आदर्श रूप से आप क्या चाहते हैं।

अधिक जानकारी के लिए यहां लिंक देखें: http://www.linuxatemyram.com/


हाँ उस लिंक को पाया और बफ़र्स और कैश के बारे में पढ़ा, लेकिन जहाँ तक मैं जो कुछ भी पढ़ पाया, उससे वे स्वैपिंग का कारण नहीं बन सकते, क्या वे कर सकते हैं?
जयरजो

@ Ajarjo मुझे लगता है कि वहाँ क्या होता है समझने के लिए हमें समस्या का प्रदर्शन करने वाले आँकड़ों की आवश्यकता होगी। आपके द्वारा दिए गए नंबर स्वैपिंग या बहुत सारे वास्तविक मेमोरी उपयोग नहीं दिखाते हैं।
मैथ्यू इफ

1

मैं वास्तव में एक समर्थक नहीं हूँ, लेकिन तरल साबुन + icecast मल्टीमीडिया से संबंधित है। जब सिस्टम मुक्त होता है, तो यह भविष्य में उपयोग के लिए मेमोरी को कैश और / या रखता है। और यदि दिन के एक निश्चित समय पर / समय की अवधि में ट्रैफ़िक बढ़ता है, तो यह स्वैप करना शुरू कर देगा। इस बिंदु पर, यदि अनुरोध (सामग्री देखने वाले उपयोगकर्ता) बढ़ जाते हैं, तो आवश्यक संसाधन 8GB से अधिक RAM के होंगे।

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