RAM gratis hilang - Kebocoran memori?

11

Pada sistem yang baru dimulai, freemelaporkan tentang 1,5G RAM yang digunakan (8G RAM secara keseluruhan, Ubuntu 12,04 dengan lightdm dan desktop plasma, satu jendela konsole dimulai). Setelah aplikasi berjalan saya gunakan, masih mengkonsumsi tidak lebih dari 2G. Namun, setelah sistem berjalan selama beberapa hari, semakin banyak RAM gratis saya menghilang - tanpa muncul dalam daftar aplikasi yang digunakan: sementara smem --pie=namelaporan kurang dari 20% digunakan (dan 80% tersedia), semuanya mengatakan berbeda. free -mmisalnya laporan sekitar hari ke 7:

             total       used       free     shared    buffers     cached
Mem:          7459       7013        446          0        178        997
-/+ buffers/cache:       5836       1623
Swap:         9536        296       9240

(jadi Anda bisa lihat, itu bukan buffer atau cache). Hari ini akhirnya berakhir dengan sistem crash sepenuhnya: manajer windows hilang, aplikasi "menggantung di udara" (tanpa bingkai) - dan sembulan memberitahu saya tentang "terlalu banyak file yang terbuka". Laporan Syslog:

kernel: [856738.020829] VFS: file-max limit 752838 reached

Jadi saya menutup aplikasi yang saya bisa tutup, dan membunuh X menggunakan Ctrl-Alt-backspace. X mencoba muncul lagi setelah itu dengan failafeX, tetapi tidak dapat melakukannya karena tidak dapat lagi mendeteksi konfigurasinya. Jadi saya beralih ke konsol menggunakan Ctrl-Alt-F2, menangkap semua informasi yang dapat saya pikirkan (vmstat, gratis, smem proc/meminfo,, lsof, ps aux), dan akhirnya reboot. X kembali dengan failafeX; kali ini saya menyuruhnya untuk "memulihkan dari konfigurasi cadangan saya", kemudian beralih ke konsol dan berhasil digunakan startxuntuk memunculkan lingkungan grafis.

Saya tidak memiliki petunjuk nyata tentang apa yang menyebabkan masalah ini - meskipun itu harus ada hubungannya dengan X itu sendiri, atau dengan beberapa proses pengguna yang berjalan pada X - karena setelah membunuh X, free -moutput tampak seperti ini:

             total       used       free     shared    buffers     cached
Mem:          7459       2677       4781          0         62        419
-/+ buffers/cache:       2195       5263
Swap:         9536         59       9477

(~ 3.5GB dibebaskan) - untuk membandingkan dengan output setelah awal yang baru:

             total       used       free     shared    buffers     cached
Mem:          7459       1483       5975          0         63        730
-/+ buffers/cache:        689       6769
Swap:         9536          0       9536

Dua keluaran bermanfaat lainnya disediakan oleh memstat -u. Sesaat sebelum kecelakaan:

User     Count     Swap      USS      PSS      RSS
mail         1        0      200      207      616
whoopsie     1      764      740      817     2300
colord       1     3200      836      894     2156
root        62    70404   352996   382260   569920
izzy        80   177508  1465416  1519266  1851840

Setelah membunuh X:

User     Count     Swap      USS      PSS      RSS
mail         1        0      184      188      356
izzy         1     1400      708      739     1080
whoopsie     1      848      668      826     1772
colord       1     3204      804      888     1728
root        62    54876   131708   149950   267860

Dan setelah restart, kembali X:

User     Count     Swap      USS      PSS      RSS
mail         1        0      212      217      628
whoopsie     1        0     1536     1880     5096
colord       1        0     3740     4217     7936
root        54        0   148668   180911   345132
izzy        47        0   370928   437562   915056

Penggunaan Sistem File selama satu minggu Penggunaan kernel / CPU selama satu minggu

Sunting: Baru saja menambahkan dua grafik dari sistem pemantauan saya. Menarik untuk dilihat: setiap kali ketika ada "lompatan" dalam konsumsi memori, CPU juga mengalami puncak. Baru saja menemukan ini sekarang - dan itu mengingatkan saya pada indikator lain yang menunjuk ke X itu sendiri: Seringkali ketika kembali ke mesin saya dan membuka kunci layar, saya menemukan sesuatu melakukan pekerjaan berat pada CPU saya. Memeriksa top, ternyata selalu begitu /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none.

Jadi setelah penjelasan yang panjang ini, akhirnya pertanyaan saya:

  1. Apa yang mungkin menjadi penyebabnya?
  2. Bagaimana saya bisa lebih mengidentifikasi proses / aplikasi yang terlibat?
  3. Langkah apa yang bisa diambil untuk menghindari perilaku ini - pendek dari me-reboot mesin semua X hari?

Saya menjalankan 8.04 (Hardy) selama sekitar 5 tahun pada mesin lama saya, tidak pernah mengalami hal yang sama (selalu lebih dari 100 hari uptime, sebelum me-reboot misalnya pembaruan kernel). Ini sekarang adalah mesin baru yang lengkap dengan instalasi baru 12,04 . Dalam hal ini penting, beberapa spesifikasi:

AMD A4-3400 APU dengan Radeon (tm) HD Graphics, menggunakan driver ati / radeon open-source (jadi tidak ada fglrx terpasang), RAM 8GB, WDC WD1002FAEX-0 hdd (1TB), Asus EA F1A75-V mainboard. Ubuntu 12,04 64-bit dengan KDE4 / Plasma. Aplikasi biasanya terbuka kurang lebih secara permanen termasuk Evolution, Firefox, konsole (dengan Midnight Commander berjalan di dalam, sekitar 4 tab), dan LibreOffice - ditambah sesekali Kaliber, Gimp dan Moneyplex (perangkat lunak perbankan yang sudah saya gunakan selama hampir 20 tahun sekarang, dalam versi yang baik-baik saja di Hardy).

Sunting: Hari ini saya menemukan salah satu "orang jahat": plasma-desktop KDE4s. Memori yang digunakan lagi hingga 5GB, ketika saya melakukan killall plasma-desktop && plasma-desktop. Ini membebaskan RAM 1,3GB! psmengatakan:

                             RSS    SIZE   VSZ
plasma usage before restart  120988 526472 1300816
plasma usage after restart   92352  495972 1263632

Jadi di mana 1.3GB itu? Perbedaan antara nilai-nilai itu, jika ditambahkan, berjumlah 96MB - bukan 1,3GB.

Dan ini hanya bisa menjadi satu bagian, karena masih 3.7GB sedang digunakan (harus kurang dari 2GB). Saya memonitor ini selama 6 hari terakhir menggunakan beberapa alat: memori yang digunakan (tidak berbicara tentang cache dan buffer) meningkat perlahan tapi pasti. Bahkan jika saya tidak di meja saya untuk menjalankan apa pun ...

Mengenai proses pemantauan dengan file terbuka, saat ini saya menggunakan 1-liner berikut (Saya suka shell dan terutama bash) untuk mendapatkan top-5:

echo "$(for pid in $(ls -a /proc|egrep '^([0-9])*$'|sort -n 2>/dev/null); do \
if [ -e /proc/$pid/fd ]; then FHC=$(ls -l /proc/$pid/fd|wc -l); \
if [ $FHC -gt 0 ]; then PNAME="$(cat /proc/$pid/comm)"; \
echo "$FHC files opened by $pid ($PNAME)"; fi; fi; done)"|sort -r -n|head -n5

Perintah di sini dalam 4 baris untuk keterbacaan yang lebih baik. Belum ada banyak hal dari sana - kecuali bahwa Skype tidak suka koneksi Internetnya terputus. Setiap pemutusan menyebabkan sedikit peningkatan pada file yang terbuka, tetapi tidak ada yang dramatis. Di sisi lain, sepertinya plasma juga bertanggung jawab untuk itu:

Penggunaan VFS (2 hari)

Lihat setetes pegangan file di akhir? Itu adalah restart plasma.

Izzy
sumber
Apakah sudo bash -c 'sync; echo 3 > /proc/sys/vm/drop_caches'menghapus ram ekstra? Anda dapat melihat file program terbuka menggunakanlsof
Savvas Radevic
Juga, sudahkah Anda mencoba berpindah pengelola desktop? mis. lxde (atau lubuntu-desktop)? Akhirnya, apakah Anda yakin output ke disk baik-baik saja? Sudahkah Anda memeriksa data SMART pada disk dan kecepatan menyalin file dari / ke disk menggunakan live cd?
Savvas Radevic
Periksa ini untuk menguji apakah Anda mengalami kebocoran. Bagaimana mendeteksi kebocoran memori
Mitch
@medigeek: Seperti yang saya tunjukkan, cache dan buffer bukanlah masalahnya. Lihat output dari free. Beralih ke DE yang berbeda sebenarnya sudah saya pertimbangkan; jika KDE3.5 telah tersedia, saya belum berakhir dengan Plasma. Ini hanya bisa sementara untuk melihat apakah Plasma terlibat.
Izzy
@Mitch: Saya mengerti bahwa memprof akan digunakan untuk melawan proses yang diketahui (yang belum saya isolasi). Yakin bisa digunakan di seluruh sistem? Selain itu, seperti yang ditunjukkan oleh kesalahan "terlalu banyak file terbuka", bagi saya sepertinya beberapa proses membuka banyak file, tidak pernah melepaskannya. Tidak yakin apakah itu akan ditangkap oleh memprof. Sekarang saya membuat skrip untuk menangkap proses top-5 dengan membuka file - mudah-mudahan ini muncul yang jahat.
Izzy

Jawaban:

6
  1. Sejumlah besar file terbuka adalah petunjuk bagus bahwa ada sesuatu yang salah. Dugaan saya adalah daemon sistem KDE.

  2. Buka konsol dan jalankan "atas". Kemudian gunakan <dan> untuk mengubah kolom pengurutan ke VIRT atau RES dan melihat program mana yang menggunakan sebagian besar memori. Kebocoran memori akan muncul sebagai penggunaan memori virtual yang digembungkan secara besar-besaran, karena begitu pointer ke memori yang bocor hilang itu tidak akan digunakan dan akan ditukar. Jalankan juga "lsof" dan cari proses dengan banyak file terbuka, karena ini tampaknya benar-benar menjadi kebocoran deskriptor file.

  3. Lacak program dan laporkan bug.

Alistair Buxton
sumber
Saya sudah mencoba memanfaatkan top / htop untuk ini. Masalahnya, itu tidak menunjukkan hasil seperti untuk memori Residen (seperti dijelaskan di atas, hanya sebagian kecil dari memori yang digunakan dapat dihubungkan ke menjalankan aplikasi). Dan untuk memori VIRTual, sulit untuk menginterkret (bahkan setelah startup, memori virtual yang digunakan berjumlah hingga 3TB di sini - ukuran yang bahkan tidak bisa ditangani oleh harddisk saya). Jadi saat ini misalnya Evolution menggunakan 1.9GB VIRT, menurut top, sedangkan keseluruhan memori yang digunakan berjumlah 1.2GB (tidak termasuk cache dan buffer). Dan ya, niat pertama saya adalah untuk melacak program, sehingga saya bisa mengajukan bug ...
Izzy
Baru saja menambahkan 2 imgs dari sistem pemantauan saya. Sepertinya "lompatan" selalu terjadi pada waktu yang sama (1 pengecualian). Sayangnya imgs tidak memberikan stempel waktu untuk memeriksa dengan cron. Btw: apakah ada cara untuk memantau proses yang memiliki berapa banyak file yang terbuka?
Izzy
1
Dugaan Anda bagus. Meskipun bukan daemon, komponen utamanya adalah KDE: plasma-desktop (lihat di atas). Lucunya: Saya baru tahu, dan mempostingnya di sini - dan 10 menit kemudian setiap hari apt-get update && apt-get upgradeada pembaruan untuk plasma-desktop; orang-orang itu cepat X) Sekarang saya hanya menontonnya sebentar untuk melihat apakah masalah telah terpecahkan, sebelum saya menyatakannya demikian. Hingga kini, semuanya terlihat cukup menjanjikan.
Izzy
Masih terlihat stabil. Meskipun tidak satu pun lsofatau tidak topmenunjuk saya ke "proses jahat", dugaan Anda tentang daemon KDE menunjuk saya ke arah pembuat onar. Jadi terima kasih lagi - uptime mesin saya sekarang sekitar 14d, dan semuanya masih terlihat stabil, meskipun saya bahkan menjalankan hal-hal seperti VirtualBox, mengkompilasi dll secara paralel. Jadi saya menganggap ini terpecahkan, dan menandai pertandingan terdekat :)
Izzy
0

Saya pikir itu sistem normal behaivor. Kemungkinan besar semuanya baik-baik saja.

Anda dapat membaca makalah yang brilian ini (linux memakan ram saya) untuk memahami, bagaimana linux mengelola ram Anda dan mengapa tidak perlu khawatir:

http://www.linuxatemyram.com/

gemue2010
sumber
4
Oh - Saya tidak pernah mendengar bahwa "perilaku sistem normal" jika sistem macet setelah 7 hari dengan kesalahan "terlalu banyak file terbuka". Saya menjalankan Linux selama sekitar 15 tahun sekarang, tidak pernah memiliki ini. Dan ya, saya sepenuhnya memahami bagaimana Linux menggunakan "RAM bebas" (menggunakannya untuk caching dll.) Seperti yang ditunjukkan di atas: cache dan buffer bukan masalah di sini. Saya tidak berbicara tentang RAM yang digunakan untuk alasan yang baik - Linux tidak akan pernah menempel cache untuk harga swapping.
Izzy