2011-03-28 13 views
14

मुझे meminfo और ps के बीच मेमोरी उपयोग विसंगति मिल रही है। नि: शुल्क पीएस के अनुसार स्पष्ट रूप से उपयोग की जाने वाली प्रक्रियाओं की तुलना में बहुत कम मुफ्त मेमोरी की रिपोर्टिंग कर रहा है।लिनक्स मेमोरी रिपोर्टिंग विसंगति

मुफ्त के अनुसार, मैं केवल 3188mb मुक्त है:

free -m 
      total  used  free  shared buffers  cached 
Mem:   15360  13273  2086   0   79  1022 
-/+ buffers/cache:  12171  3188 
Swap:   0   0   0 

मैं नीचे ट्रैक करने के लिए कोशिश जहां स्मृति ps का उपयोग कर रहा है (गैर 0 आरएसएस मूल्यों नीचे कतरना):

ps -A --sort -rss -o comm,pmem,rss 

COMMAND   %MEM RSS 
mysqld   13.1 2062272 
java    6.2 978072 
ruby    0.7 114248 
ruby    0.7 114144 
squid   0.1 30716 
ruby    0.0 11868 
apache2   0.0 10132 
apache2   0.0 9092 
apache2   0.0 8504 
PassengerHelper 0.0 5784 
sshd    0.0 3008 
apache2   0.0 2420 
apache2   0.0 2228 
bash    0.0 2120 
sshd    0.0 1708 
rsyslogd   0.0 1164 
PassengerLoggin 0.0 880 
ps    0.0 844 
dbus-daemon  0.0 736 
sshd    0.0 736 
ntpd    0.0 664 
squid   0.0 584 
cron    0.0 532 
ntpd    0.0 512 
exim4   0.0 504 
nrpe    0.0 496 
PassengerWatchd 0.0 416 
dhclient3  0.0 344 
mysqld_safe  0.0 316 
unlinkd   0.0 284 
logger   0.0 252 
init    0.0 200 
getty   0.0 120 

हालांकि , आरएसएस कॉलम को जोड़ने के रूप में यह समझ में नहीं आता है कि लगभग 3287mb का कुल मेमोरी उपयोग होता है जो लगभग 12gb मुक्त छोड़ना चाहिए!

मैं अमेज़ॅन एडब्ल्यूएस पर कर्नेल 2.6.16.33-xenU # 2 एसएमपी x86_64 का उपयोग कर रहा हूं।

मेरी याददाश्त कहां जा रही है? क्या कोई इसे ट्रैक करने के तरीके पर कुछ प्रकाश डाल सकता है?

+5

http://www.linuxatemyram.com/ – Erik

+0

यह शायद unix.stackexchange.com के लिए बेहतर अनुकूल होगा। हालांकि अच्छा सवाल है, और एरिक से एक दिलचस्प (अगर संक्षिप्त नहीं है) टिप्पणी।साथ ही, मैंने अभी देखा है कि मेरे फेडोरा सिस्टम पर, जबकि शीर्ष रिपोर्ट केवल 4 जीबी उपलब्ध है, फ्री-एम कमांड (एरिक के लिंक से) लगभग 7 जीबी मुफ्त में रिपोर्ट करता है। gnome-system-monitor डिस्क कैशिंग के लिए भी खाता है। –

+6

यह linuxatemyram.com जैसी ही समस्या नहीं है। नोटिस मैं 3188 एमबी मुक्त उद्धृत कर रहा हूं, जो बफर/कैश मुक्त कॉलम से सही है। –

उत्तर

21

चेक स्लैब कैश (Slab:, SReclaimable: और SUnreclaim:/proc/meminfo में) का उपयोग। यह कर्नेल डेटा संरचनाओं का एक कैश है, और free द्वारा रिपोर्ट किए गए पृष्ठ कैश से अलग है।

यदि आपकी "गायब स्मृति" के बड़े हिस्से के लिए स्लैब कैश आरामदायक है, तो यह देखने के लिए /proc/slabinfo देखें कि यह कहां चला गया है। यदि यह दंत चिकित्सा या इनोड्स है, तो आप उनसे छुटकारा पाने के लिए sync ; echo 2 > /proc/sys/vm/drop_caches का उपयोग कर सकते हैं।

आप एक दोस्ताना प्रारूप में स्लैब कैश के वर्तमान उपयोग को दिखाने के लिए slabtop उपकरण का भी उपयोग कर सकते हैं। c वर्तमान कैश आकार द्वारा सूची को सॉर्ट करेगा।

+0

यह समाधान है। मैं सोच रहा हूं कि कर्नेल को इस कैश के लिए सभी/सबसे मुफ्त मेमोरी का उपयोग करने से सीमित करने का कोई तरीका है या नहीं? मुझे लगता है कि यदि ऐप्स को इसकी आवश्यकता होती है तो यह इस कैश से स्मृति को पुनः प्राप्त कर देगा, हालांकि स्मृति निगरानी उपकरण इसे ध्यान में नहीं लगते हैं, इसलिए वे मुझे मुफ्त मेमोरी छोड़ने के बारे में चिल्लाते हैं। –

+1

@Zoltan: सुनिश्चित नहीं है। यह स्टैक ओवरफ़्लो है, मैं मेमोरी मॉनीटरिंग टूल को ठीक करने का सुझाव देता हूं ताकि यह 'एसईक्लेक्मेबल' जोड़ सके। उपयोग के शेर के हिस्से के लिए कौन सा स्लैब प्रविष्टि ज़िम्मेदार थी? – caf

+0

मैं वास्तव में इस जवाब को ऊपर उठाने के लिए लॉग इन हूं। मेरे पास 1.6 जीबी रैम का इस्तेमाल करने वाला एक सर्वर है (2 जीबी से बाहर, जो चिंताजनक था), जब इसके अनुप्रयोग 300 एमबी में खपत करते थे। 'इको' ने इसे हल किया (1 9 0 * वास्तविक * प्रयुक्त एमबी)। मूल कारण शायद एक गलत कॉन्फ़िगर किया गया लॉग्रोटेट स्क्रिप्ट था जिसने लाखों फाइलें बनाई हैं जैसे /var/log/dovecot/dovecot.log.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.gz.2। जीजे कभी-कभी, लिनक्स में, ऐसा लगता है जैसे हम ट्वाइलाइट जोन और पीछे यात्रा करते हैं। –

3

आप उपयोग की गई स्मृति की मात्रा प्राप्त करने के लिए केवल आरएसएस या वीएसजेड कॉलम को जोड़ नहीं सकते हैं। दुर्भाग्यवश, लिनक्स पर स्मृति उपयोग उससे कहीं अधिक जटिल है। अधिक विस्तृत विवरण के लिए Understanding memory usage on Linux देखें, जो बताता है कि प्रक्रियाओं के बीच साझा पुस्तकालयों को कैसे साझा किया जाता है, लेकिन ps जैसे टूल द्वारा डबल-गिनती की जाती है।

मुझे पता नहीं है कि यह कितनी संख्या प्रदर्शित करता है इसकी गणना करता है लेकिन यदि आपको अधिक जानकारी चाहिए तो आप हमेशा अपना स्रोत कोड खोद सकते हैं।

+0

वह एक बहुत ही जानकारीपूर्ण लिंक था। धन्यवाद – Sk606

1

मुझे विश्वास है कि आप साझा स्मृति मान गुम हैं। मुझे नहीं लगता कि ps आरएसएस क्षेत्र के हिस्से के रूप में साझा रैम की रिपोर्ट करता है। देखने के लिए top RES फ़ील्ड के साथ तुलना करें।

बेशक यदि आप साझा रैम में जोड़ते हैं, तो आप कितना जोड़ते हैं? क्योंकि इसे साझा किया जाता है, वही रैम कई अलग-अलग प्रक्रियाओं में जमा हो सकता है।

आप/proc/[pid]/smaps फ़ाइलों के रचनात्मक पार्सिंग द्वारा उस समस्या को हल करने का प्रयास कर सकते हैं।

लेकिन फिर भी, यह आपको केवल रास्ते का हिस्सा बनता है। कुछ मेमोरी पेज साझा किए जाते हैं लेकिन निवासी के रूप में जिम्मेदार होते हैं। ये पृष्ठ fork() कॉल के बाद साझा किए जाते हैं। वे किसी भी समय unshared बन सकते हैं, लेकिन जब तक वे कुल उपयोग प्रणाली रैम की ओर गिनती नहीं है। Proc smaps फ़ाइल इन्हें भी नहीं दिखाती है।

+0

इनमें से किसी भी मामले में, क्या आरएसएस मेमोरी को जोड़ा जा रहा है जो बहुत कम नहीं है? –

संबंधित मुद्दे