मेमोरी लीक का पता कैसे लगाएं?


16

मुझे लगता है कि मेरे वर्तमान ubuntu प्रणाली पर एक बड़ा मेमोरी रिसाव है

विचित्र ग्रहण मेमोरी एरर ( /ubuntu/148998/eclipse-constant-different-out-of-memory-errors ) की रिपोर्ट करने के बाद मुझे अपने कंसोल में आज 'पर्याप्त मेमोरी मेमोरी नहीं' संदेश मिलने लगे - जबकि sudo -s- या - जैसे टाइपिंग जैसे सरल कार्यfree -m

'फ्री-एम' में टाइप करने से मुझे पता चला कि कैसे मेरी रैम जल्दी से 700M से 900M तक हो जाती है, कुछ सेकंड में 2000M के आकार तक बढ़ जाती है (मेमोरी खाली करने के बाद echo 3 > /proc/sys/vm/drop_caches)

ग्रहण कारण नहीं है, मैंने पूरी तरह से इस प्रक्रिया को मार दिया और राम अभी भी ऊपर जा रहा था। क्या यह पता लगाने का कोई तरीका है कि रिसाव कहां से आ रहा है? मैं अपने सिस्टम को अब भी अपडेट नहीं कर सकता, क्योंकि apt-get updateविफल रहता है (शायद इसलिए कि यह स्मृति से बाहर है)

का उपयोग करते हुए Ubuntu 11.10


मैं बहुत खुश हूं मैं पागल नहीं हूं। मुझे 13.10 में अपग्रेड करने के बाद से यही समस्या है, लेकिन मुझे याद है कि यह 11.10 के साथ है। सवाल यह है कि क्या आप CrashPlan का उपयोग कर रहे हैं? मुझे लगता है कि यह संकुचित हो गया है, मुझे नहीं पता कि इसे कैसे ठीक किया जाए। मैंने मेमोरी ट्वीक्स की कोशिश की है, लेकिन यह काम नहीं कर रहा है। मुझे आशा है कि यह आपको कुछ सुराग देता है
अर्ध-नौसिखिया

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

जवाबों:


9

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

प्री-लाइब्ररी सी लाइब्रेरी के मेमोरी आवंटन कार्यों को ओवरराइड करने के लिए लाइब्रेरी को प्री-लोड करने के द्वारा काम करता है और आपको अपने प्रोग्राम को फिर से स्थापित करने की आवश्यकता नहीं होती है।

memprof

स्रोत: उबंटू मैनुअल


11

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

आप निम्न कमांड का उपयोग करके एक नया tmp फ़ोल्डर बना सकते हैं। आप /tmpपर्याप्त स्थान के साथ एक अलग फाइल सिस्टम में बदलना चाह सकते हैं

TMPDIR=$(mktemp -d -t -p /tmp)

मेमोरी लीक को खोजने के लिए कदम

  1. उस प्रक्रिया के पीआईडी ​​का पता लगाएं, जिससे मेमोरी लीकेज होती है ( htopयदि आप उपलब्ध हो तो उदाहरण के लिए उपयोग भी कर सकते हैं ) और इसे नामक वैरिएबल में स्टोर करेंpid

    ps -aux
    
  2. यह देखते हुए कि PID वैरिएबल में उपलब्ध है pid, आप मेमोरी की खपत का उपयोग करके कैप्चर कर सकते हैं /proc/$pid/smapsऔर जैसे कुछ फ़ाइल में सेव कर सकते हैं beforeMemInc.txt

    cat /proc/$pid/smaps > $TMPDIR/beforeMemInc.txt
    
  3. मेमोरी की खपत बढ़ने के लिए कुछ समय प्रतीक्षा करें।
  4. /proc/$pid/smapsफिर से कैप्चर करें और इसे के रूप में सहेजेंafterMemInc.txt

    cat /proc/$pid/smaps > $TMPDIR/afterMemInc.txt
    
  5. पहले smapsऔर दूसरे smaps, जैसे के साथ अंतर खोजें

    diff -u $TMPDIR/beforeMemInc.txt $TMPDIR/afterMemInc.txt
    
  6. उदाहरण के लिए, पता सीमा को नोट करें जहां मेमोरी बढ़ गई है:

       beforeMemInc.txt            afterMemInc.txt
    ---------------------------------------------------
    2b3289290000-2b3289343000   2b3289290000-2b3289343000  #ADDRESS
    Shared_Clean:    0 kB       Shared_Clean:    0 kB          
    Shared_Dirty:    0 kB       Shared_Dirty:    0 kB
    Private_Clean:   0 kB       Private_Clean:   0 kB
    Private_Dirty:  28 kB       Private_Dirty:  36 kB  
    Referenced:     28 kB       Referenced:     36 kB
    Anonymous:      28 kB       Anonymous:      36 kB  #INCREASE MEM
    AnonHugePages:   0 kB       AnonHugePages:   0 kB
    Swap:            0 kB       Swap:            0 kB
    KernelPageSize:  4 kB       KernelPageSize:  4 kB
    MMUPageSize:     4 kB       MMUPageSize:     4 kB
    Locked:          0 kB       Locked:          0 kB
    VmFlags: rd wr mr mw me ac  VmFlags: rd wr mr mw me ac
    
  7. मेमोरी को चलाने की प्रक्रिया में डंप करने के लिए जीडीबी का उपयोग करें या कोरडंप का उपयोग करें

    gcore -o $TMPDIR/process $PID
    
  8. मैंने कुछ फ़ाइल में मेमोरी डंप करने के लिए रनिंग प्रक्रिया पर gdb का उपयोग किया।

    cd $TMPDIR
    gdb -p $pid
    dump memory memory.dump 0x2b3289290000 0x2b3289343000
    
  9. अब, stringsकमांड का उपयोग करें या hexdump -Cप्रिंट करने के लिएmemory.dump

    strings memory.dump
    

    इससे आपको पठनीय जानकारी मिलती है जो आपको अपने सोर्स कोड में उन स्ट्रिंग्स का पता लगाने में मदद करती है।

  10. रिसाव को खोजने के लिए अपने स्रोत का विश्लेषण करें।

मैं डॉकटर कंटेनर में हूं, cat /proc/2882/smaps > /tmp/before.txtचरण 2 पर चलने पर अनुमति से इनकार कर दिया गया है। मैंने क्या गलत किया?
देवी

इस विधि ने मेरे लिए चरण 9 तक काम किया। मेरे मामले में लीक में कोई पठनीय या पहचानने योग्य डेटा नहीं था। मुझे उस डेटा के प्रतीक नाम कैसे मिल सकते हैं जो लीक हुआ था?
क्रेग

8

Drop_cache ट्रिक मेमोरी को फ्री नहीं करेगा, यह कैश को रीसेट करेगा। पीएस कमांड का उपयोग करता है यदि आप यह पहचानना चाहते हैं कि कौन सी प्रक्रिया अधिक मेमोरी का उपयोग करती है।

उदाहरण के लिए निवासी मेमोरी उपयोगकर्ताओं के शीर्ष 15 की सूची की निगरानी करना।

$ watch "ps --sort -rss -eo pid,pmem,rss,vsz,comm | head -16"
  PID %MEM   RSS    VSZ COMMAND
 2590 13.4 136892 825000 firefox
 1743 10.7 109020 300780 Xorg
 2067  8.5 86764 1118140 unity-2d-shell
 3307  4.1 42560 627780 unity-2d-spread
 2068  2.9 29904 617644 unity-2d-panel
 2092  2.5 25524 1291204 nautilus
 2457  1.9 20292 530276 gnome-terminal
 2351  1.9 20016 821488 unity-scope-vid
 2161  1.9 19476 531968 unity-panel-ser
 2034  1.7 18256 759716 gnome-settings-
 2074  1.5 16176 518016 nm-applet
 2273  1.5 15452 580416 unity-lens-vide
 2051  1.4 15112 524260 metacity
 2395  1.2 12836 407336 update-notifi

आप साझा किए गए मेमोरी रिज़र्वेशन को भी देख सकते हैं लेकिन आपको केवल यह पता होगा कि सेगमेंट का मालिक कौन है।

पैम्प आवंटन:

$ ls -l /run/shm
total 272
-r-------- 1 ed      ed      67108904 Nov 29 18:17 pulse-shm-1884617860
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-2352897759
-r-------- 1 ed      ed      67108904 Nov 29 18:12 pulse-shm-3444873503
-r-------- 1 ed      ed      67108904 Nov 29 18:12 pulse-shm-3485341848
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-535843976
-r-------- 1 ed      ed      67108904 Nov 29 19:12 pulse-shm-789046959
-r-------- 1 ed      ed      67108904 Nov 29 18:38 pulse-shm-863909656

$ df /run/shm 
Filesystem     1K-blocks  Used Available Use% Mounted on
none              509332   272    509060   1% /run/shm

ध्यान दें कि आरक्षित आवंटन वास्तविक आवंटित पृष्ठ (df 'प्रयुक्त') की तुलना में बहुत अधिक हैं

सिस्टम V आवंटन:

$ ipcs -m 

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 294912     ed         700        122880     2          dest         
0x00000000 327681     ed         700        4823040    2          dest         
0x00000000 491522     ed         600        393216     2          dest         
0x00000000 589827     ed         700        4578120    2          dest         
0x00000000 425988     ed         700        27852      2          dest         
0x00000000 458757     ed         600        393216     2          dest         

संपादित करें : प्रक्रियाओं को सबसे अधिक मेमोरी उपयोग के साथ प्राप्त --sort -rssकरने के लिए पास करने की आवश्यकता होती है ps, अन्यथा प्रक्रिया सूची क्रमबद्ध बढ़ती संख्यात्मक होती है और प्रक्रियाओं को कम से कम मेमोरी उपयोग के साथ देती है।


5

मेरे पास एक पुरानी मशीन है जो मैं उपयोग करता हूं जो लगातार मेमोरी लीक संदेशों को बाहर निकालता है:

root@:~# free -m
             total       used       free     shared    buffers     cached
Mem:          1898       1523        374        131         32        588
-/+ buffers/cache:        902        995
Swap:         1942        480       1462

मेरी स्क्रिप्ट:

sync; sudo echo 3 > /proc/sys/vm/drop_caches

नाम दिया cache.sh

root@~# ./cache.sh
root@~# free -m
             total       used       free     shared    buffers     cached
Mem:          1898       1106        791        126          1        207
-/+ buffers/cache:        897       1000
Swap:         1942        480       1462

आप देख सकते हैं कि मैं 374 एमबी से नीचे था, भाग गया sync; sudo echo 3 > /proc/sys/vm/drop_cachesऔर 417 एमबी वापस आ गया। cronहर 5 मिनट में इसे चलाने के लिए एक या बस एक टर्मिनल खुला होना चाहिए और जब आप धीमी गति से प्रदर्शन देखते हैं तो इसे चला सकते हैं। हां, मुझे मशीन में मेमोरी जोड़ने की आवश्यकता है ...


स्वरूपण एक मुद्दा लगता है, निश्चित नहीं है कि कैसे ठीक किया जाए
वॉरपिग

1
अपनी पोस्ट के नीचे एडिट लिंक का उपयोग करेंमार्कटैड स्वरूपण मदद से जुड़े पाठ क्षेत्र के ऊपर एक प्रारूपण टूलबार और एक नारंगी प्रश्न चिह्न हैं
डेविड फ़ॉर्स्टर

कृपया प्रश्न पर मेरी हाल की टिप्पणी पर एक नज़र डालें । मुझे विश्वास है कि मुख्य स्मृति को निस्तब्धता और कैश छोड़ने के विचार को गलत समझा जाता है और मुझे पता है कि मैं उस निष्कर्ष के साथ अकेला नहीं हूं।
डेविड फ़ॉर्स्टर

बहुत धन्यवाद, डेविड ... मैं पूरी तरह से निस्तब्धता / कैश छोड़ने की बात को गलत मानता हूं ... लेकिन कुछ गड़बड़ हो रहा है और मशीन को फ्रीज / लॉकअप बना रहा है ... बस यह क्या है के रूप में चकित है, यह एक फ़ायरफ़ॉक्स मुद्दा सोच रहा है। ..
वारपिग

3

मेमस्टैट भी एक अच्छा उपकरण है जो प्रत्येक ब्लॉक द्वारा उपयोग की जाने वाली मेमोरी की मात्रा के साथ-साथ लोड किए गए पुस्तकालयों द्वारा कितनी मेमोरी का उपयोग करता है। सबसे अच्छा उपकरण नहीं है, लेकिन विवरण और आंकड़ों को इकट्ठा करने के लिए उपयोग करने योग्य है।

memstat -w -p pid उपयोग करने के लिए एक अच्छा आदेश है।


1
लिंक टूट गया है, मुझे लगता है कि यह एक अच्छा है
vladkras

1

मुझे एक समान समस्या थी लेकिन एक बहुत ही अजीब समाधान के साथ।

किसी अज्ञात कारण से मेरे पास मेरे लैपटॉप सेटअप पर एक मेल सर्वर था और चल रहा था। मुझे नहीं पता कि मेरे पास यह क्यों था ... हालांकि मैंने इसकी सेवा बंद कर दी और यह पता चला कि मेरे लैपटॉप पर वह सॉफ्टवेयर एक ddos ​​हमले के तहत था। उसके बाद सब कुछ सामान्य था।

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