Ingatan yang tiba-tiba dibebaskan setiap hari pada waktu yang hampir bersamaan

10

Saya memiliki beberapa VM di Windows Azure yang menjalankan situs web e-commerce kami, dan belakangan kami mulai menggunakan Telegraf, InfluxDb, dan Grafana untuk mengawasi mesin-mesin ini. Setelah beberapa minggu mengumpulkan data, saya perhatikan ada pola aneh yang terkait dengan metrik Memori Tersedia :

Setiap hari hampir selalu pada periode yang sama pada hari itu, saya telah memperhatikan bahwa ada jumlah memori yang tiba-tiba dibebaskan, karena keterampilan DevOp saya yang sangat sangat terbatas, saya tidak dapat mencari tahu apa yang menyebabkan ini.

Berikut grafik yang menunjukkan pola ini:

Pola aneh

Pertanyaan saya adalah: Apa yang dapat menyebabkan hal seperti ini? Saya merasa tergoda untuk menduga bahwa Memory Leak yang harus disalahkan tetapi ... Memori bebas tidak pernah turun di bawah 70% dan hanya terjadi pada dua VM dengan lalu lintas terbanyak!

Haruskah saya khawatir ketika melihat sesuatu seperti ini?

PS: Saya telah menatap pengumpulan metrik untuk Private e Virtual byte untuk masing-masing layanan windows yang telah kami jalankan dan untuk proses w3wp ... walaupun saya telah membaca bahwa metrik ini tidak terlalu dapat diandalkan untuk mengetahui apakah Anda memiliki kehabisan memori, tetapi setidaknya saya akan mencoba untuk mendapatkan semacam tren dan melihat apakah itu berkorelasi dengan pola yang ditunjukkan di atas.

António Sérgio Simões
sumber
2
Anda melihat seorang pengumpul sampah atau pembersih IMHO biasa. Dalam bahasa apa situs web Anda selesai? (ini bisa jadi aplikasi Anda, websever Anda, dan bahkan sistem melakukan pembersihan)
Tensibai
Itu adalah sesuatu yang saya curigai juga ... Ini dilakukan di ASP.NET MVC 4, jadi teori pengumpulan sampah masuk akal. Juga, di samping catatan, metrik yang telah saya kumpulkan pada proses w3wp dan layanan windows terlihat sangat normal.
António Sérgio Simões
Saya tahu hampir tidak ada dalam ASP, tapi saya berasumsi ada cara untuk memetakan konsumsi memori dan pengumpulan sampah seperti di java, ini akan membantu memastikan ini adalah penyebab utama.
Tensibai

Jawaban:

7

Saya telah melihat pola "gigi gergaji" yang sama di sistem lain, khususnya alat data berbasis Java. Berdasarkan uraian Anda, saya pikir Anda sedang melihat pengumpulan sampah .NET (dengan asumsi ini adalah aplikasi .NET.) Java dan .NET keduanya bahasa yang dikelola memori dan kerangka kerja yang menggunakan pengumpulan sampah.

Sebuah kebocoran memori biasanya ditemukan dalam kerangka kerja yang kurang manajemen memori, atau program pada kerangka memori dikelola yang override atau membingungkan pengumpul sampah.

Fakta bahwa ini adalah server dengan lalu lintas tertinggi yang masuk akal. Anda melihat .NET framework mengalokasikan memori sesuai kebutuhan, kemudian pengumpul sampah memulai siklus reguler dan mendapatkan kembali memori yang tidak digunakan menggunakan algoritma pengumpulan sampah. Kecuali jika Anda melacak masalah kinerja tertentu, saya rasa pola penggunaan memori ini bukan masalah.

Dave Swersky
sumber
Ini memang aplikasi .NET dan dari penelitian saya dalam beberapa hari terakhir, sangat masuk akal apa yang Anda dan @Tensibai tulis.
António Sérgio Simões
7

Saya pikir telah menemukan mengapa grafik ini terlihat seperti ini.

Saya juga mengumpulkan metrik untuk penghitung kinerja Total Aplikasi ASP.NET / Kesalahan, dan saya perhatikan bahwa pada saat yang bersamaan terjadi lonjakan memori yang tersedia, metrik Kesalahan Total diatur ulang ke 0.

Menurut msdn penghitung ini me-reset ke 0 setiap kali aplikasi restart / shutdown terjadi.

Ini membuat saya percaya bahwa penyebab dari pola gigi gergaji Tersedia Memori ini adalah karena Aplikasi restart terjadi.

Begini tampilannya bagan saya:

Kesalahan Total Aplikasi ASP.NET Lonjakan Memori

MEMPERBARUI

Ini terjadi karena Bytes Pribadi dari proses W3WP mencapai batas untuk daur ulang (Kami memiliki batas byte pribadi yang dikonfigurasi di kumpulan aplikasi). Dan melihat dari dekat ke grafik Private Bytes, kita dapat melihat sesuatu yang abnormal terjadi karena penggunaan memori melompat dari 650MB ke 3.2GB dan beberapa jam kemudian melompat dari 3.6GB ke 16.6GB! Saat inilah daur ulang terjadi.

António Sérgio Simões
sumber
2
Ini adalah penjelasan yang jauh lebih masuk akal. Pembebasan memori tiba-tiba terjadi hampir secara eksklusif dengan proses restart. Mekanisme untuk membebaskan memori dari proses yang sedang berjalan tidak pernah setajam ini dan jarang benar-benar membebaskan memori daripada membebaskan sebagian ruang pada tumpukan yang telah dialokasikan sebelumnya.
Jiri Klouda