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 update
gagal (mungkin karena kehabisan memori)
Menggunakan Ubuntu 11.10
sumber
Jawaban:
memprof
Sumber: Manual Ubuntu
sumber
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
/tmp
ke sistem file yang berbeda dengan ruang yang cukupLangkah-langkah untuk menemukan Memory Leak
Cari tahu PID dari proses yang menyebabkan kebocoran memori (Anda juga dapat menggunakan misalnya
htop
jika tersedia) dan menyimpannya dalam variabel yang disebutpid
Mengingat bahwa PID tersedia dalam variabel
pid
, Anda dapat menangkap konsumsi memori menggunakan/proc/$pid/smaps
dan menyimpan ke dalam beberapa file sepertibeforeMemInc.txt
.Tangkap
/proc/$pid/smaps
lagi dan simpan sebagaiafterMemInc.txt
Temukan perbedaan antara pertama
smaps
dan keduasmaps
, misalnya denganCatat rentang alamat di mana memori bertambah, misalnya:
Gunakan GDB untuk membuang memori pada proses yang sedang berjalan atau menggunakan coredump
Saya menggunakan gdb pada proses yang berjalan untuk membuang memori ke beberapa file.
Sekarang, gunakan
strings
perintah atauhexdump -C
untuk mencetakmemory.dump
Dari sini Anda mendapatkan informasi yang dapat dibaca yang membantu Anda menemukan string-string itu dalam kode sumber Anda.
sumber
cat /proc/2882/smaps > /tmp/before.txt
langkah 2. Apa yang saya lakukan salah?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.
Anda dapat memeriksa juga reservasi memori bersama tetapi Anda hanya akan tahu siapa pemilik segmen tersebut.
Alokasi pmap:
perhatikan bahwa alokasi yang dicadangkan jauh lebih tinggi daripada halaman yang dialokasikan sebenarnya (jika 'digunakan')
Alokasi sistem V:
Sunting : Perlu dilewati
--sort -rss
untukps
mendapatkan proses dengan penggunaan memori terbanyak, jika tidak daftar proses diurutkan meningkat numerik dan memberikan proses dengan penggunaan memori paling sedikit.sumber
Saya memiliki mesin yang lebih lama yang saya gunakan yang terus-menerus mengeluarkan pesan kebocoran memori:
Skrip saya:
Bernama itu
cache.sh
Anda dapat melihat saya turun ke 374 MB, menjalankan
sync; sudo echo 3 > /proc/sys/vm/drop_caches
dan memperoleh 417 MB kembali. Satu dapatcron
berjalan setiap 5 menit atau hanya memiliki terminal terbuka dan jalankan ketika Anda melihat kinerja yang lambat. Ya, saya perlu menambahkan memori ke mesin ...sumber
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.sumber
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.
sumber