Bellek sızıntısı nasıl algılanır?


16

Mevcut ubuntu Sistemimde daha büyük bir bellek sızıntısı var gibi görünüyor

Tuhaf Eclipse bellek hatalarını bildirdikten sonra ( /ubuntu/148998/eclipse-constant-different-out-of-memory-errors ) Bugün konsolumda 'Yeterli Bellek' hata mesajı almaya başladım - yazmak, sudo -shatta yazmak gibi basit görevleri yerine getirmekfree -m

'Free -m' yazarak, RAM'imin hızlı bir şekilde 700M'den 900M'ye nasıl yükseldiğini, birkaç saniyede 2000M boyutuna kadar büyüdüğünü gösterdi (ile belleği boşalttıktan sonra echo 3 > /proc/sys/vm/drop_caches)

Tutulma neden değil, süreci tamamen öldürdüm ve koç hala yükseliyordu. Sızıntının nereden geldiğini tespit etmenin bir yolu var mı? Sistemimi artık güncelleyemiyorum, çünkü apt-get updatebaşarısız oluyor (muhtemelen bellek yetersiz olduğu için)

kullanma Ubuntu 11.10


Çılgın olmadığım için çok mutluyum. Ben 13.10 yükseltme beri aynı sorunu yaşadım, ama 11.10 ile sahip hatırlıyorum. Soru şudur: CrashPlan kullanıyor musunuz? Bunu daraltmışım gibi görünüyor, nasıl düzelteceğimi bilmiyorum. Bellek ince ayarlarını denedim, ama çalışmıyor. Umarım size bazı ipuçları verir
semi-newbie

Çekirdeği önbellek bırakmaya zorlamanın bir anlamı yok. Aksi takdirde daha fazla fiziksel bellek gerektiğinde temizlenecekler ve alanlarını geri alacaklar. Önbelleğe alınmayan nesnelerin çok daha yavaş ikincil depodan alınması gerektiğinden, onları genel performans için bile zararlı bir şekilde yıkamak. Boş ana hafıza hiçbir şekilde iyi bir şey değildir. Kötü önbellek yönetiminin ya da çok hafif kullanımın bir işareti.
David Foerster

Yanıtlar:


9

memprof bellek kullanımını profillemek ve bellek sızıntılarını bulmak için bir araçtır. Programınızdaki her işlev tarafından ne kadar bellek ayrıldığını belirten bir profil oluşturabilir. Ayrıca, belleği tarayabilir ve ayırdığınız ancak artık hiçbir yere başvurulmayan blokları bulabilir.

memprof, C kitaplığının bellek ayırma işlevlerini geçersiz kılmak için bir kitaplığı önceden yükleyerek çalışır ve programınızı yeniden derlemenizi gerektirmez.

memprof

Kaynak: Ubuntu Kılavuzu


11

İlk olarak, yeterli boş alana sahip bir geçici klasör bulunduğundan emin olun. Aşağıdaki komutlar, birkaç GB boyutunda dökümler oluşturur.

Aşağıdaki komutu kullanarak yeni bir tmp klasörü oluşturabilirsiniz. /tmpYeterli alana sahip farklı bir dosya sistemine geçmek isteyebilirsiniz

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

Bellek Sızıntısını Bulma Adımları

  1. Bellek sızıntısına neden olan işlemin PID'sini öğrenin (örneğin, htopmümkünse kullanabilirsiniz) vepid

    ps -aux
    
  2. PID'nin değişkente mevcut olduğu göz önüne alındığında pid, bellek tüketimini kullanarak /proc/$pid/smapskaydedebilir ve gibi bir dosyaya kaydedebilirsiniz beforeMemInc.txt.

    cat /proc/$pid/smaps > $TMPDIR/beforeMemInc.txt
    
  3. Bellek tüketiminin artması için biraz bekleyin.
  4. /proc/$pid/smapsTekrar yakalayın ve kaydedinafterMemInc.txt

    cat /proc/$pid/smaps > $TMPDIR/afterMemInc.txt
    
  5. İlk arasındaki farkı bulun smaps ve ikincismaps , örn.

    diff -u $TMPDIR/beforeMemInc.txt $TMPDIR/afterMemInc.txt
    
  6. Belleğin arttığı adres aralığını not edin, örneğin:

       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. Çalışan işlemde belleği boşaltmak için GDB'yi kullanın veya kullanarak coredump'ı kullanın

    gcore -o $TMPDIR/process $PID
    
  8. Hafıza bir dosyaya dökümü için çalışan süreçte gdb kullandım.

    cd $TMPDIR
    gdb -p $pid
    dump memory memory.dump 0x2b3289290000 0x2b3289343000
    
  9. Şimdi, stringskomutunu kullanın veyahexdump -C yazdırmak içinmemory.dump

    strings memory.dump
    

    Bundan kaynak kodunuzda bu dizeleri bulmanıza yardımcı olan okunabilir bilgiler elde edersiniz.

  10. Sızıntıyı bulmak için kaynağınızı analiz edin.

Bir Docker kapsayıcısındayım, cat /proc/2882/smaps > /tmp/before.txt2. adımda çalışırken İzin Verilmedi hatası alıyorum . Ne ​​yanlış yaptım?
Devy

Bu yöntem 9. adıma kadar benim için çalıştı. Benim durumumdaki sızıntı okunabilir veya tanınabilir veri içermiyordu. Sızan verilerin sembol adlarını nasıl alabilirim?
Craig

8

Drop_cache hile hafızayı boşaltmaz, önbelleği sıfırlar. Kullanımları ps komutu daha fazla bellek kullanır işler olduğunu belirlemek istiyorum.

Örneğin, yerleşik hafıza kullanıcılarının ilk 15'inin listesini izlemek.

$ 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

Paylaşılan bellek rezervasyonunu da kontrol edebilirsiniz, ancak yalnızca segmentlerin sahibi kim olduğunu bilirsiniz.

Pmap tahsisi:

$ 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

ayrılmış ayırmaların ayrılan sayfalardan gerçekte çok daha yüksek olduğunu unutmayın (df 'kullanılmış')

Sistem V tahsisleri:

$ 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         

Düzenleme : En çok bellek kullanımı ile işlem almak için geçmek --sort -rssgerekir ps, aksi takdirde işlem listesi artan sayısal sıralanır ve en az bellek kullanımı ile işlemler verir.


5

Bellek sızıntısı mesajlarını sürekli tüküren eski bir makinem var:

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

Senaryom:

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

İsmi 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 MB'a düştüğümü, koştuğumu sync; sudo echo 3 > /proc/sys/vm/drop_cachesve 417 MB geri kazandığımı görebilirsiniz. Bir edebilir cronher 5 dakikada bir çalışacak ya da sadece bir terminal açık var ve yavaş performansı görünce çalıştırmak için. Evet, makineye bellek eklemem gerekiyor ...


Biçimlendirme bir sorun gibi görünüyor, nasıl düzeltileceğinden emin değilim
Warpig

1
Yayınınızın altındaki düzenleme bağlantısını kullanın . Metin alanının üzerinde, Markdown biçimlendirme yardımına bağlantı veren bir biçimlendirme araç çubuğu ve turuncu bir soru işareti vardır .
David Foerster

Lütfen soru hakkındaki son yorumuma bir göz atın . Önbellekleri temizleyip bırakarak ana belleği boşaltma fikrinin yanlış yönlendirildiğine inanıyorum ve bu sonuçta yalnız olmadığımı biliyorum.
David Foerster

Çok teşekkürler David ... Önbelleği temizlemeye / düşürmeye tamamen katılıyorum ... Ama bir şey asılıyor ve makinenin donmasını / kilitlenmesini sağlıyor ... Sadece bir firefox sorunu olduğunu düşünerek şaşırmıştı. ..
Warpig

3

memstat ayrıca her blok tarafından kullanılan bellek miktarını ve yüklü kütüphaneler tarafından ne kadar bellek kullanıldığını gösterecek iyi bir araçtır. En iyi araç değil, ancak ayrıntıları ve istatistikleri toplamak için kullanmaya değer.

memstat -w -p pid kullanmak için iyi bir komuttur.


1
bağlantı bozuk, bence bu iyi
vladkras

1

Benzer bir sorunum vardı ama çok garip bir çözümle.

Bilinmeyen bir nedenden dolayı dizüstü bilgisayarımın kurulumunda bir posta sunucusu vardı ve neden kullandığımı bilmiyorum ... Ancak hizmetini kapattım ve dizüstü bilgisayarımdaki yazılımın bir ddos ​​saldırısı altında olduğu ortaya çıktı. Bundan sonra her şey normaldi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.