Microsoft Destek Mühendisi, .NET uygulamalarında, bilgisayarlar bir tarama veya çarpışmaya kadar yavaşlayana kadar sistem kaynaklarını yavaş yavaş tüketebilen ince ama önemli bir bellek sızıntısı belirlemiştir.
Öncelikle .NET uygulamalarını çalıştıran Windows Systems’ı etkileyen sorun, geliştiricilerin yanlışlıkla kötüye kullanılabileceği masum bir yapılandırma parametresinden kaynaklanmaktadır.
Bu teknik vahiy, görünüşte küçük kodlama kararlarının zaman içinde nasıl büyük performans sonuçlarına sahip olabileceğine ışık tutar.
.png
)
Sorun, geliştiriciler kullandığında meydana gelir. reloadOnChange: true
.NET uygulamalarındaki yapılandırma dosyalarını yüklerken parametre.
Bu parametre zararsız görünür ve resmi belge örneklerinde bile önerilirken, sık sık yürütülen kod yollarında kullanıldığında ciddi bir bellek sızıntısı oluşturur.
Bu kod her çalıştığında, bellekte sabitlenen 8KB bayt dizi tamponu tahsis ederek .NET çöp toplayıcısının bu bellek alanını geri kazanmasını veya sıkıştırmasını önler.
Mühendis, sorunun Windows’a özgü API’lerin, sabitlenmiş bellek arabellekleri gerektiren ReadDirectoryChangesw işlevi aracılığıyla nasıl işlediğiyle ilgili olduğunu açıklayan “Bu özel sızıntı yalnızca pencerelerde meydana geliyor gibi görünüyor” dedi.
Bellek yönetimi mimarisindeki değişiklikler nedeniyle sorun .NET 7 ve üstü daha belirgindir.
Sorun tezahürleri ve algılama yöntemleri
Bu sorundan etkilenen uygulamalar birkaç karakteristik semptom göstermektedir. Bellek kullanımı, hafif trafik koşullarında bile zaman içinde kademeli olarak artar.
Mevcut bellek kullanılamayan alanın “delikleri” ile parçalandıkça performans giderek azalır.
Bellek analizi sigara tabancasını ortaya çıkarır: 2 nesil yığınında asla geri kazanılmayan büyük miktarlarda serbest bellek, FilesystemWatcher+AsyncreadState örneklerine bağlı çok sayıda sabitlenmiş bayt dizisi ile.
Mühendis, izlenen bir uygulamada, bu nesnelerin iki bellek enstantanesi arasındaki sayımda iki katına çıktığını ve daha fazla sistem kaynağı tükettiğini gösterdi.
Sistem çökmelerini önlemek için geliştiriciler için basit düzeltme
Geliştiriciler sorunu anladıktan sonra çözüm basittir. Mühendis şunları önerir:
- Yapılandırma dosyalarını tekrar tekrar yüklemek yerine bağımlılık enjeksiyonu kullanarak yapılandırmaya erişin.
- Uygulama başlatma sırasında özel yapılandırma dosyalarını bir kez yükleyin.
- Dinamik yükleme kesinlikle gerekliyse, ayarlayın
reloadOnChange: false
.
Mühendis, “Hızlı, kısa süreli bir düzeltme için veya uygulamanızın normal uygulama yürütmesi sırasında bir yapılandırma dosyasını kesinlikle dinamik olarak yüklemesi gerekiyorsa, reloadonChange’i false olarak ayarladığınızdan emin olun” dedi.
Geliştiriciler, .NET uygulamalarını, özellikle de açıklanamayan bellek büyüme modellerine sahip Windows sunucularında veya iş istasyonlarında çalışanları incelemeye teşvik edilir ve yanlış bir şekilde yanlış yapılandırma işleme yoluyla bu kaynak bırakan sızıntıyı oluşturmadıklarını doğrular.
Bu teknik vahiy, görünüşte küçük kod uygulamalarının önemli sistem performans sorunlarına nasıl birikebileceğini göstermektedir.
Bu haberi ilginç bul! Anında güncellemeler almak için bizi Google News, LinkedIn ve X’te takip edin!