Aracılığıyla paylaş


Örnek olay incelemesi: Performans sorununu yalıtma (C#, Visual Basic, F#)

Bu örnek olay incelemesi, örnek bir ASP.NET uygulamasındaki performans sorunlarını belirlemek ve çözmek için Visual Studio profil oluşturma araçlarının nasıl kullanılacağını göstermektedir. Profil oluşturma araçlarının karşılaştırması için bkz . Hangi aracı seçmeliyim?

Şunları öğreneceksiniz:

  • Uygulama performansını analiz etmek için Visual Studio profil oluşturma araçlarını kullanma.
  • Performans sorunlarını bulmak için profil oluşturma verilerini yorumlama.
  • .NET Sayaçlarını, çağrı sayılarını ve zamanlama verilerini kullanarak kodu iyileştirmeye yönelik pratik stratejiler.

Kendi uygulamalarınızı geliştirmek için bu teknikleri uygulayın.

Performans sorununu yalıtma örnek olay incelemesi

Örnek ASP.NET uygulaması simülasyon veritabanında sorgular çalıştırır ve Tanılama Örneğini temel alır.

Önemli performans belirtileri:

  • Düşük CPU Kullanımı: CPU performans sorunu değildir.
  • Yüksek ThreadPool İş Parçacığı Sayısı: İş parçacığı sayısı sürekli olarak artar ve iş parçacığı havuzundaki açlığı gösterir.
  • Yavaş Uygulama Yanıtı: Uygulama, kullanılabilir iş parçacıklarının olmaması nedeniyle yavaş yanıt verir.

Bu örnek olay incelemesi, bu sorunları saptamak ve çözmek için Visual Studio profil oluşturma araçlarını kullanarak kodunuzu daha hızlı ve daha verimli hale getirmenize yardımcı olur.

Meydan okuma

Bu sorunları çözmek için birkaç zorluk vardır:

  • Performans Sorunlarını Tanılama: Düşük performansa sahip düşük CPU kullanımının birden çok nedeni olabilir. Profil oluşturma araçlarının etkili kullanımı ve çıktılarını yorumlamak çok önemlidir.
  • Bilgi ve Kaynak Kısıtlamaları: Profil oluşturma ve iyileştirme, her zaman kullanılamayabilecek belirli beceriler ve deneyim gerektirir.

Profil oluşturma araçlarını, teknik bilgileri ve dikkatli testleri birleştiren stratejik bir yaklaşım, bu zorlukların üstesinden gelmek için önemlidir.

Strateji

Bu örnek olay incelemesindeki yaklaşımın üst düzey bir görünümü aşağıdadır:

  • Başlangıç olarak performans verilerini toplarken .NET sayacı ölçümlerini izleyin. Visual Studio'nun .NET Sayaçları aracı iyi bir başlangıç noktasıdır.
  • Daha ayrıntılı içgörüler için, çağrı sayıları ve zamanlama verileri toplamak amacıyla Enstrümantasyon aracı gibi ek profil oluşturma araçlarını kullanarak izlemeleri toplayın.

Veri toplama aşağıdaki görevleri gerektirir:

  • Uygulamayı Yayın sürümü olarak ayarlayın.
  • Performans Profili Oluşturucu'da (Alt+F2) .NET Sayaçları aracını seçin.
  • Uygulamayı başlatın ve iz kaydı toplayın.

Performans sayaçlarını denetleme

Uygulamayı çalıştırırken .NET Sayaçları aracındaki sayaçları gözlemliyoruz. İlk araştırmalar için dikkate alınması gereken birkaç önemli ölçüm şunlardır:

  • CPU Usage. Yüksek veya düşük CPU kullanımıyla bir performans sorununun oluşup oluşmadığını görmek için bu sayacı izleyin. Bu, belirli performans sorunları türlerine ilişkin bir ipucu olabilir. Mesela:
    • Yüksek CPU kullanımıyla, kodu iyileştirebileceğimiz alanları belirlemek için CPU Kullanımı aracını kullanın. Bu konu hakkında daha fazla bilgi için Örnek olay incelemesi: Kodu iyileştirmek için başlangıç kılavuzuna bakın.
    • Düşük CPU kullanımıyla, çağrı sayılarını ve duvar saati zamanına göre ortalama işlev süresini belirlemek için İzleme aracını kullanın. Bu, çekişme veya iş parçacığı havuzu açlığı gibi sorunları tanımlamaya yardımcı olabilir.
  • Allocation Rate. İstekleri sunan bir web uygulaması için oran oldukça sabit olmalıdır.
  • GC Heap Size. Bellek kullanımının sürekli artıp artmadığını ve potansiyel olarak sızıntı olup olmadığını görmek için bu sayacı izleyin. Yüksek görünüyorsa bellek kullanım araçlarından birini kullanın.
  • Threadpool Thread Count. İstekleri sunan bir web uygulaması için, thread sayısının sabit mi yoksa sabit bir hızda mı yükseldiğini görmek için bu sayacı takip edin.

Aşağıda, CPU Usage görece yüksekken ThreadPool Thread Count düşük olduğunu gösteren bir örnek verilmiştir.

.NET Sayaçları aracında gösterilen sayaçların ekran görüntüsü.

CPU kullanımı düşük olan ve sürekli artan iş parçacığı sayısı, iş parçacığı havuzu yetersizliğinin bir göstergesi olabilir. İş parçacığı havuzu, yeni iş parçacıklarını döndürmeye devam etmeye zorlanır. İş parçacığı havuzunda açlık, havuzda yeni iş öğelerini işlemek için kullanılabilir iş parçacığı kalmadığında oluşur ve bu durum genellikle uygulamaların yavaş yanıt vermesine neden olur.

Düşük CPU kullanımına ve görece yüksek iş parçacığı sayısına bağlı olarak ve olası bir iş parçacığı havuzu yetersizliği durumu teorisi üzerinde çalışarak İzleme aracını kullanmaya geçin.

Arama sayılarını ve zamanlama verilerini araştırma

İş parçacıklarında neler olduğu hakkında daha fazla bilgi edinmeyi deneyebilir miyiz görmek için İzleme aracındaki bir kaydı inceleyelim.

Visual Studio'ya İzleme aracıyla bir iz yükledikten sonra, önce özetlenmiş verileri gösteren ilk .diagsession .diagsession rapor sayfasını kontrol ederiz. Toplanan izlemede, rapordaki Ayrıntıları aç bağlantısını kullanır ve ardından Alev Grafiğiseçeneğini belirleriz.

İzleme aracındaki Alev Grafiğinin ekran görüntüsü.

Alev Grafiği görselleştirmesi, uygulamanın çalışma süresinin önemli bir bölümünden QueryCustomerDB işlevinin (sarı renkte gösterilir) sorumlu olduğunu gösterir.

QueryCustomerDB işlevine sağ tıklayın ve Arama AğacındaGörünüm'ü seçin.

İzleme aracındaki Çağrı Ağacının ekran görüntüsü.

Uygulamadaki en yüksek CPU kullanımına sahip kod yolu, sık erişimli hat olarak adlandırılır. Kritik yol ateş simgesi (Kritik Yol simgesini gösteren ekran görüntüsü.), iyileştirilebilecek performans sorunlarını hızla belirlemenize yardımcı olabilir.

Çağrı Ağacı görünümünde, sık erişimli yolun olası bir performans sorununa işaret eden QueryCustomerDB işlevini içerdiğini görebilirsiniz.

Diğer işlevlerde harcanan zamana göre, işlevi için Self ve QueryCustomerDB değerleri çok yüksektir. Toplam ve Ortalama Toplam'nin aksine, Kendi değerleri diğer işlevlerde harcanan zamanı dışlar; bu nedenle performans darboğazını aramak için iyi bir yerdir.

Bahşiş

Self değerleri yüksek yerine nispeten düşükse, büyük olasılıkla QueryCustomerDB işlevi tarafından çağrılan gerçek sorgulara bakmak istersiniz.

İşlevin kaynak kodunu göstermek için QueryCustomerDB işlevine çift tıklayın.

public ActionResult<string> QueryCustomerDB()
{
    Customer c = QueryCustomerFromDbAsync("Dana").Result;
    return "success:taskwait";
}

Biraz araştırma yapıyoruz. Alternatif olarak, zaman kazandırabilir ve Copilot'un bizim için araştırma yapmasına izin verebiliriz.

Copilotkullanıyorsak, bağlam menüsünden Ask Copilot seçeneğini seçin ve aşağıdaki soruyu yazın:

Can you identify a performance issue in the QueryCustomerDB method?

Bahşiş

Copilot için iyi sorular oluşturmaya yardımcı olmak amacıyla /optimize gibi slash komutlarını kullanabilirsiniz.

Copilot, bu kodun zaman uyumsuz bir API'yi await kullanmadan çağırdığını söylüyor. Bu, iş parçacığı havuzu açlığı sorununun yaygın bir nedeni olan ve iş parçacıklarını engelleyebilen zaman uyumsuz kod desenidir.

Sorunu çözmek için await komutunu kullanın. Bu örnekte Copilot, açıklamasıyla birlikte aşağıdaki kod önerisini de sunar.

public async Task<ActionResult<string>> QueryCustomerDB()
{
    Customer c = await QueryCustomerFromDbAsync("Dana");
    return "success:taskwait";
}

Veritabanı sorguları ile ilgili performans sorunları görürseniz, belirli çağrıların daha yavaş olup olmadığını araştırmak için Veritabanı aracını kullanabilirsiniz. Bu veriler sorguları iyileştirme fırsatı olduğunu gösterebilir. Performans sorununu araştırmak için Veritabanı aracının nasıl kullanılacağını gösteren bir öğretici için bkz. Örnek olay incelemesi: Kodiyileştirmeye yönelik başlangıç kılavuzu. Veritabanı aracı, ADO.NET veya Entity Framework Core ile .NET Core'u desteklemektedir.

Visual Studio'da tek tek iş parçacığı davranışına yönelik görselleştirmeler almak için hata ayıklarken paralel yığınlar penceresini kullanabilirsiniz. Bu pencere, bekleyen iş parçacıkları, bekledikleri iş parçacıkları ve kilitlenmelerihakkındaki bilgilerle birlikte tek tek iş parçacıklarını gösterir.

İş parçacığı havuzu açlığı hakkında ek bilgi için bkz. İş parçacığı havuzu açlığını algılama.

Sonraki adımlar

Aşağıdaki makaleler ve blog gönderileri, Visual Studio performans araçlarını etkili bir şekilde kullanmayı öğrenmenize yardımcı olacak daha fazla bilgi sağlar.