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:
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.
Jawaban:
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.
sumber
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:
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.
sumber