Bagaimana cara mendeteksi kebocoran memori?

16

Saya tampaknya memiliki kebocoran memori yang lebih besar pada Sistem ubuntu saya saat ini

Setelah melaporkan kesalahan memori Eclipse yang aneh ( /ubuntu/148998/eclipse-constant-different-out-of-memory-errors ), saya mulai mendapatkan pesan kesalahan 'Tidak cukup Memori' di konsol saya hari ini - sementara melakukan tugas-tugas sederhana seperti mengetik di sudo -s- atau bahkan -free -m

Mengetik 'm bebas' berulang-ulang menunjukkan kepada saya bagaimana RAM saya dengan cepat naik dari 700M ke 900M, tumbuh hingga ukuran 2000M dalam beberapa detik (setelah membebaskan memori dengan echo 3 > /proc/sys/vm/drop_caches)

Eclipse bukan penyebabnya, saya sepenuhnya membunuh proses dan domba jantan itu masih naik. Apakah ada cara untuk mendeteksi dari mana kebocoran itu berasal? Saya bahkan tidak dapat memperbarui sistem saya lagi, karena apt-get updategagal (mungkin karena kehabisan memori)

Menggunakan Ubuntu 11.10

Katai
sumber
Saya SANGAT senang saya tidak gila. Saya memiliki masalah yang sama sejak memutakhirkan ke 13.10, tetapi saya ingat pernah mengalami dengan 11.10. Pertanyaannya adalah: Apakah Anda menggunakan CrashPlan? Sepertinya saya mempersempit itu, saya hanya tidak tahu bagaimana cara memperbaikinya. Saya sudah mencoba memori tweak, tetapi tidak berfungsi. Saya harap ini memberi Anda beberapa petunjuk
semi-newbie
Tidak ada gunanya memaksa kernel untuk menjatuhkan cache. Mereka akan memerah dan ruang mereka tetap akan kembali segera setelah lebih banyak memori fisik diperlukan sebaliknya. Pembilasan paksa mereka kemungkinan besar bahkan merugikan kinerja keseluruhan, karena objek yang tidak ditelusuri perlu diambil dari penyimpanan sekunder yang jauh lebih lambat. Memori utama gratis sama sekali bukan hal yang baik. Ini merupakan pertanda manajemen cache yang buruk atau penggunaan yang sangat ringan.
David Foerster

Jawaban:

9

memprof adalah alat untuk profil penggunaan memori dan menemukan kebocoran memori. Itu dapat menghasilkan profil berapa banyak memori yang dialokasikan oleh masing-masing fungsi dalam program Anda. Selain itu, dapat memindai memori dan menemukan blok yang telah Anda alokasikan tetapi tidak lagi dirujuk di mana pun.

memprof bekerja dengan pra-memuat perpustakaan untuk mengesampingkan fungsi alokasi memori perpustakaan C dan tidak mengharuskan Anda untuk mengkompilasi ulang program Anda.

memprof

Sumber: Manual Ubuntu

Mitch
sumber
11

Pertama, pastikan untuk memiliki folder temp yang tersedia yang memiliki ruang kosong yang cukup. Perintah berikut membuat dump yang ukurannya bisa beberapa GB.

Anda dapat membuat folder tmp baru menggunakan perintah berikut. Anda mungkin ingin mengubah /tmpke sistem file yang berbeda dengan ruang yang cukup

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

Langkah-langkah untuk menemukan Memory Leak

  1. Cari tahu PID dari proses yang menyebabkan kebocoran memori (Anda juga dapat menggunakan misalnya htopjika tersedia) dan menyimpannya dalam variabel yang disebutpid

    ps -aux
    
  2. Mengingat bahwa PID tersedia dalam variabel pid, Anda dapat menangkap konsumsi memori menggunakan /proc/$pid/smapsdan menyimpan ke dalam beberapa file seperti beforeMemInc.txt.

    cat /proc/$pid/smaps > $TMPDIR/beforeMemInc.txt
    
  3. Tunggu beberapa saat hingga konsumsi memori meningkat.
  4. Tangkap /proc/$pid/smapslagi dan simpan sebagaiafterMemInc.txt

    cat /proc/$pid/smaps > $TMPDIR/afterMemInc.txt
    
  5. Temukan perbedaan antara pertama smapsdan kedua smaps, misalnya dengan

    diff -u $TMPDIR/beforeMemInc.txt $TMPDIR/afterMemInc.txt
    
  6. Catat rentang alamat di mana memori bertambah, misalnya:

       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. Gunakan GDB untuk membuang memori pada proses yang sedang berjalan atau menggunakan coredump

    gcore -o $TMPDIR/process $PID
    
  8. Saya menggunakan gdb pada proses yang berjalan untuk membuang memori ke beberapa file.

    cd $TMPDIR
    gdb -p $pid
    dump memory memory.dump 0x2b3289290000 0x2b3289343000
    
  9. Sekarang, gunakan stringsperintah atau hexdump -Cuntuk mencetakmemory.dump

    strings memory.dump
    

    Dari sini Anda mendapatkan informasi yang dapat dibaca yang membantu Anda menemukan string-string itu dalam kode sumber Anda.

  10. Analisis sumber Anda untuk menemukan kebocoran.
Jagannath Pattar
sumber
Saya berada di wadah Docker, mendapatkan izin ditolak kesalahan saat menjalankan cat /proc/2882/smaps > /tmp/before.txtlangkah 2. Apa yang saya lakukan salah?
Devy
8

Trik drop_cache tidak akan mengosongkan memori, itu akan mengatur ulang cache. Menggunakan perintah ps jika Anda ingin mengidentifikasi proses mana yang menggunakan lebih banyak memori.

Misalnya untuk memantau daftar 15 pengguna memori teratas.

$ 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

Anda dapat memeriksa juga reservasi memori bersama tetapi Anda hanya akan tahu siapa pemilik segmen tersebut.

Alokasi pmap:

$ 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

perhatikan bahwa alokasi yang dicadangkan jauh lebih tinggi daripada halaman yang dialokasikan sebenarnya (jika 'digunakan')

Alokasi sistem 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         

Sunting : Perlu dilewati --sort -rssuntuk psmendapatkan proses dengan penggunaan memori terbanyak, jika tidak daftar proses diurutkan meningkat numerik dan memberikan proses dengan penggunaan memori paling sedikit.

Emmanuel
sumber
5

Saya memiliki mesin yang lebih lama yang saya gunakan yang terus-menerus mengeluarkan pesan kebocoran memori:

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

Skrip saya:

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

Bernama itu 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

Anda dapat melihat saya turun ke 374 MB, menjalankan sync; sudo echo 3 > /proc/sys/vm/drop_cachesdan memperoleh 417 MB kembali. Satu dapat cronberjalan setiap 5 menit atau hanya memiliki terminal terbuka dan jalankan ketika Anda melihat kinerja yang lambat. Ya, saya perlu menambahkan memori ke mesin ...

Warpig
sumber
Pemformatan tampaknya menjadi masalah, tidak yakin bagaimana cara memperbaikinya
Warpig
1
Gunakan tautan edit di bawah pos Anda. Ada bilah alat pemformatan dan tanda tanya oranye di atas area teks yang menghubungkan ke bantuan pemformatan Markdown .
David Foerster
Silakan lihat komentar terakhir saya tentang pertanyaan ini . Saya yakin bahwa ide untuk membebaskan memori utama dengan membilas dan menjatuhkan cache adalah salah arah dan saya tahu saya tidak sendirian dengan kesimpulan itu.
David Foerster
Terima kasih banyak, David ... Saya benar-benar setuju untuk membilas / menjatuhkan cache salah arah ... Tapi ada sesuatu yang terhenti dan membuat mesin macet / terkunci ... Hanya bingung apa itu, menganggapnya masalah firefox. ..
Warpig
3

memstat juga merupakan alat yang baik yang akan menunjukkan jumlah memori yang digunakan oleh setiap blok serta berapa banyak memori yang digunakan oleh perpustakaan yang dimuat. Bukan alat terbaik tetapi layak digunakan untuk mengumpulkan detail dan statistik.

memstat -w -p pid adalah perintah yang baik untuk digunakan.

Chef Firaun
sumber
1
Tautan rusak, saya pikir ini bagus
vladkras
1

Saya memiliki masalah yang sama tetapi dengan solusi yang sangat aneh.

Untuk beberapa alasan yang tidak diketahui saya memiliki server mail pada pengaturan laptop saya dan berjalan. Saya tidak tahu mengapa saya memilikinya ... Namun saya mematikan layanannya dan ternyata perangkat lunak pada laptop saya berada di bawah serangan DDoS. Setelah itu semuanya normal.

Mario Kamenjak
sumber