Sesuatu memakan semua memori (saya menduga ada kebocoran memori pada beberapa aplikasi). Bagaimana cara mendeteksi apa?

16

Saya memiliki server yang menjalankan liquidsoap + bundel icecast dan situs web sederhana (httpd + mysqld). Tidak ada yang spesial. Pengunjung sekitar 2000+ per hari, dengan rata-rata sekitar 50 online secara bersamaan.

Server memiliki RAM 8GB. Seiring berjalannya waktu, jumlah memori bebas terus menurun, meskipun tidak ada yang baru dimulai pada server dan tidak ada pengguna baru. Pada titik tertentu mulai swap, memuat pada server naik dan menjadi tidak responsif. Biasanya yang saya lakukan hanyalah me-restart server ...

Apa yang bisa dilakukan untuk mendeteksi apa yang sebenarnya bocor memori? Saya menggunakan top untuk memantau penggunaan sumber daya, tetapi sejauh yang saya lihat itu tidak ada gunanya:

masukkan deskripsi gambar di sini

Apakah ada cara untuk mengetahui apa yang menggunakan memori sebanyak itu? atau apa yang mulai bertukar ke disk banyak? Adakah cara untuk membebaskan memori tanpa me-reboot server?

jayarjo
sumber
Ada alasan mengapa Anda tidak mencoba me-restart beberapa layanan (apache, liquidsoap) alih-alih server?
jamespo
Saya awalnya merespons untuk penggunaan memori normal. Saya telah memperbarui dengan seperangkat alat yang dapat membantu mengidentifikasi masalah.
BillThor
@ jamespo, sebenarnya saya sudah mencobanya, tetapi tidak berpengaruh, jadi restart adalah satu-satunya hal yang saya tahu bisa membantu.
jayarjo
Cache 4027092k harus menjelaskan penggunaan memori, bukan? Saya sedang bekerja saat ini pada masalah yang sama di tempat lain, dan sejauh ini saya sudah berhasil mengetahui transfer memori dapat diatur dengan params berikut: vfs_cache_pressure vm.dirty_ratio vm.dirty_background_ratio Ini bukan perbaikan lengkap dan umpan balik apa pun selamat datang. Saya harap ini arah yang benar.

Jawaban:

16

Berjalan topdalam mode batch untuk melaporkan ukuran memori secara berkala dapat digunakan untuk melihat siapa yang menggunakan memori ketika ada hal yang terjadi di selatan. Menjalankan sardalam mode batch harus memberikan diagnosa yang baik tentang penggunaan memori, dan I / O terkait. Menjalankan muninuntuk memantau sistem harus memberi Anda grafik dengan detail yang baik pada memori apa yang digunakan. Ini mungkin banyak membantu.

Anda dapat menggunakan limit.conf untuk membatasi ukuran inti maksimum program. Diatur dengan benar, ini akan mematikan semua program yang kehabisan memori. Ini berfungsi dengan modul pam_limits. Batas juga dapat diatur dengan ulimitsperintah.

Anda menjalankan beberapa program yang bisa menggunakan banyak memori. Beberapa hal yang bisa Anda perhatikan antara lain.

  • Aplikasi yang diprogram dengan buruk dan beroperasi di bawah apache2dapat bocor memori. Anda akan melihat peningkatan ukuran memori saat ini terjadi. Anda dapat menyetel apache2 untuk mendaur ulang anak-anak setelah sejumlah penggunaan dengan mengatur MaxRequestsPerChildke 100 atau lebih. Jika ini menyelesaikan masalah, maka Anda harus menyelesaikan kebocoran. Saya akan menonton ini dulu.
  • MySQL dapat mencoba memuat data ke dalam memori. Jika Anda memiliki banyak data dalam memori, ini dapat menyebabkan beberapa kehancuran, tetapi seharusnya tidak sedramatis yang Anda lihat.
  • Jika Anda memiliki tmpfssistem file besar yang terpasang, maka Anda dapat membocorkan memori jika file tidak dihapus saat digunakan. File besar yang berumur panjang juga bisa menjadi masalah.
  • Jika masalah terjadi pada waktu yang hampir bersamaan, Anda mungkin memiliki program terjadwal yang membocorkan memori.
  • Jika Anda memiliki program yang mengalokasikan memori bersama, tetapi tidak melepaskannya sebelum keluar, Anda akan memiliki kebocoran memori yang relatif tidak terlihat. Jika memori bersama dikunci dalam memori, maka itu mungkin memaksa swapping. Jumlah memori bersama yang tersedia biasanya relatif terbatas.
  • Bundel liquidsoap + icecast dapat mengalami masalah buffering yang menggunakan memori. Saya belum pernah menggunakan kombinasi ini, jadi saya tidak yakin bagaimana ini akan muncul.

Penggunaan memori normal: Memori bebas bukan sesuatu yang Anda inginkan banyak. Jika sistem Anda telah menyala untuk waktu yang lama dan memiliki banyak memori bebas, ada sesuatu yang salah. Setiap kali Anda membaca atau menulis file, blok akan masuk ke cache buffer. Ini akan mengurangi memori bebas Anda, dan merupakan hal yang baik. Sistem ini akan menjaga ruang kosong yang cukup untuk memulai beberapa program tanpa mencari tempat lain untuk memori. Karena banyak program berjalan dengan cepat, memori mereka akan dikembalikan ke kolam gratis ketika mereka berhenti berjalan.

Ketika Anda membaca file yang ada di cache buffer, tidak ada akses disk diperlukan dan membaca diselesaikan dari cache buffer. Menulis menggunakan mekanisme serupa. Jika sistem Anda membutuhkan memori, cache buffer adalah salah satu tempat pertama yang digunakan. Sebagian besar buffer dapat segera dirilis.

Jika Anda memiliki kebocoran memori, Anda akan melihat memori bebas dan buffer keduanya mulai menyusut. Ini masih bukan masalah yang parah, karena memori yang bocor pada akhirnya harus dipindahkan ke ruang swap. Sistem Anda masih akan berjalan dengan baik sampai Anda mengisi ruang swap, dan menarik ruang kosong yang tersisa ke titik program tidak dapat dimulai. Ini adalah tipikal bahwa sejumlah kecil ruang swap dapat digunakan.

BillThor
sumber
Masalah dalam kasus saya agak aneh. Bahkan ketika beban sangat besar dan server bertukar, ada banyak memori bebas (seperti yang saya mengerti setelah saya membaca tentang buffer dan cache). atas tidak menunjukkan proses memonopoli memori semakin. Tetapi beban naik dan di beberapa titik server menjadi tidak dapat digunakan: | Terima kasih atas respon yang mendetail.
jayarjo
2
@jayarjo: Munin dan sar harus membantu mendeteksi apa yang sedang terjadi. Jika Anda memiliki banyak memori bebas Anda tidak boleh bertukar. Anda mungkin memiliki masalah I / O yang berbeda. sarakan membantu menentukan dengan tepat partisi mana yang memiliki I / O dan dapat membantu menemukan masalahnya.
BillThor
+1 untuk saran MaxRequestsPerChild
jamespo
11

Anda dapat menggunakan perintah ini untuk melihat 10 aplikasi teratas terkait penggunaan RAM:

ps -A --sort -rss -o comm,pmem | head -n 11

Terkadang perintah ini membantu Anda jika banyak sub proses telah dihasilkan:

ps auxf

Dengan cara ini Anda bisa melihat proses mana yang menjadi satu.

Raffael Luthiger
sumber
Ini adalah perintah praktis, terima kasih saya akan mencatatnya untuk masa depan. Tetapi masalahnya adalah bahwa selalu ada proses yang sama di atas (Anda dapat melihatnya dalam screenshot terlampir) - apache, mysql, liquidsoap, icecast. Dan mereka menggunakan (atau setidaknya ditunjukkan untuk menggunakan) jumlah memori yang sama (benar-benar dapat diabaikan), bahkan ketika server sedang sekarat karena beban: |
jayarjo
@jayarjo: Apakah jumlah proses berubah? Apakah Anda memiliki lebih banyak proses? Dan apakah ini server fisik atau virtual?
Raffael Luthiger
Saya tidak melihat adanya perubahan dalam jumlah proses. Pada dasarnya ketika saya melakukan top, ketika server sedang sekarat karena beban saya melihat gambar yang sangat mirip dengan apa yang saya lampirkan dalam pertanyaan asli, kecuali beban besar: | Server bersifat fisik.
jayarjo
2
Cobalah untuk mendapatkan informasi lebih lanjut dengan "vmstat" (mis. Vmstat -s). Atau dengan alat "sar" yang telah disebutkan. Apakah Anda mungkin memiliki sistem file berbasis RAM? Maka mungkin "iostat" dapat memberikan lebih banyak informasi juga.
Raffael Luthiger
1
Saya ragu apakah bidang "pmem" (% MEM) psatau topkeluaran adalah hal yang tepat untuk dilihat jika mencoba mendeteksi kebocoran memori: Bukankah ini hanya persentase dari memori fisik yang sedang digunakan oleh proses saat ini? Tetapi bagian lain dari proses yang digunakan (termasuk kebocoran) memori dapat ditukar. Mungkin "ukuran" atau "vsize" akan lebih tepat untuk mengukur ukuran suatu proses? Misalnya, ps -A --sort -size -o comm,size | head -n 11ataups -A --sort -vsize -o comm,vsize | head -n 11
imz - Ivan Zakharyaschev
8

Tidak ada yang benar-benar menggunakan memori itu dalam hal aplikasi.

Anda harus mengurangi nilai 'cached' yang mewakili cache halaman untuk mendapatkan ide yang lebih baik tentang apa penggunaan memori Anda yang sebenarnya dalam hal penggunaan program.

Pada dasarnya ini adalah manajemen memori yang baik dan ini idealnya yang Anda inginkan.

Lihat tautan di sini untuk informasi lebih lanjut: http://www.linuxatemyram.com/

Matthew Ife
sumber
ya menemukan tautan itu dan membaca tentang buffer dan cache, tetapi sejauh yang saya dapat dari apa yang saya baca, mereka tidak dapat menyebabkan pertukaran, bukan?
jayarjo
@ jayarjo Saya pikir untuk memahami apa yang terjadi di sana kita perlu statistik yang menunjukkan masalah itu. Angka yang Anda berikan tidak menunjukkan pertukaran atau banyak penggunaan memori nyata.
Matthew Ife
1

Saya bukan ahli dalam hal ini, tapi sabun cair + icecast terkait dengan multimedia. Ketika sistem ini gratis, ia menyimpan dan / atau menempati memori untuk digunakan di masa mendatang. Dan jika lalu lintas meningkat pada waktu tertentu dalam sehari / selama periode waktu tertentu, maka itu akan mulai bertukar. Pada titik ini, jika permintaan (pengguna yang melihat konten) meningkat, maka sumber daya yang dibutuhkan akan lebih dari 8GB ram.

Yash
sumber