Aracılığıyla paylaş


Performans sorununu yalıtma (C#, Visual Basic, F#)

Bu makalede, performans sorunlarını araştırmak ve sorun alanlarını yalıtmak için profil oluşturma araçlarını nasıl kullanabileceğinizi öğreneceksiniz.

Burada amaç, adım adım yönergeler sağlamak yerine profil oluşturma araçlarını nasıl etkili bir şekilde kullanacağınızı ve verileri nasıl yorumlayabileceğinizi göstermektir. CPU Kullanımı aracı gibi .NET Sayaçları aracı da performans araştırması için iyi bir başlangıç noktasıdır. İlgi çekici verileri tanımladıktan sonra, daha derin araştırma yapmak için diğer profil oluşturma araçlarını kullanabilirsiniz. Araçları karşılaştırmak için bkz. Hangi aracı seçmeliyim?

Örnek uygulama hakkında

Bu makaledeki ekran görüntüleri, simülasyon veritabanına yönelik sorgular çalıştıran bir ASP.NET uygulamasını temel alır. Örnek, Tanılama Örneğini temel alır.

Araştırma başlatma

  • Performans verilerini toplarken .NET sayaç ölçümlerini izleyerek araştırmanıza başlayın.
  • Ardından, sorunları yalıtmaya yardımcı olacak ek içgörüler için CPU Kullanımı aracı, İzleme aracı ve diğerleri gibi diğer profil oluşturma araçlarından birini kullanarak bir izleme toplamayı göz önünde bulundurun.

Veri toplama aşağıdaki adımları gerektirir (bu makalede gösterilmez):

  • Uygulamanızı bir Yayın derlemesi olarak ayarlayın.
  • Performans Profili Oluşturucu'dan .NET Sayaçları aracını seçin (Alt+F2). (Sonraki adımlar İzleme aracını içerir.)
  • Performans Profili Oluşturucu'dan uygulamayı başlatın.

Performans sayaçlarını denetleme

Uygulamayı çalıştırırken sayaçları .NET Sayaçları aracında görüntüleyin. İlk araştırmalarda göz kulak olmak için 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. Örneğin:
    • Yüksek CPU kullanımıyla, kodu iyileştirebileceğiniz alanları belirlemek için CPU Kullanımı aracını kullanın. Bu konuda bir öğretici için bkz . Kodu iyileştirmeye yönelik Başlangıç kılavuzu.
    • 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ı belirlemenize 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 kullanabilirsiniz.
  • Threadpool Thread Count. İstekleri sunan bir web uygulaması için, iş parçacığı sayısının sabit mi yoksa sabit bir hızda mı yükseldiğini görmek için bu sayacı izleyin.

Aşağıda, değerinin görece yüksekken değerinin CPU UsageThreadPool Thread Count ne kadar 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 bir iş parçacığı sayısı, iş parçacığı havuzu yetersizliği göstergesi olabilir. İş parçacığı havuzu, yeni iş parçacıklarını döndürmeye devam etmeye zorlanır. İş parçacığı havuzu açlığı, havuzda yeni iş öğelerini işlemek için kullanılabilir iş parçacığı olmadığında ve genellikle uygulamaların yavaş yanıt vermesine neden olduğunda oluşur.

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 edinip öğrenebileceğimizi görmek için İzleme aracındaki bir ize göz atalım.

Tanılama verileri yüklendiğinde, ilk olarak Top Insights ve Sık Erişimli Yol'un gösterildiği ilk .diagsession rapor sayfasını denetleyin. İzleme izlemesinde Sık Erişimli Yol, uygulamanızda en uzun işlev sürelerine sahip kod yolunu gösterir. Bu bölümler, geliştirebileceğiniz performans sorunlarını hızla belirlemenize yardımcı olacak ipuçları sağlayabilir.

Toplanan izlemede rapordaki Ayrıntıları aç bağlantısını kullanın ve ardından Alev Grafı'nı seçin.

İzleme aracındaki Alev Grafı'nın ekran görüntüsü.

Alev Grafı görselleştirmesi, işlevin QueryCustomerDB uygulamanın çalışma süresinin önemli bir bölümünden sorumlu olduğunu gösterir.

İşleve QueryCustomerDB sağ tıklayın ve Çağrı Ağacında Görüntüle'yi seçin.

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

Çağrı Ağacı görünümünde, Etkin Yol'un (alev simgesi) işlevi içerdiğini QueryCustomerDB ve bu da olası bir performans sorununa işaret ettiğini görürsünüz.

Diğer işlevlerde harcanan zamana göre, işlevin Self ve Avg Self değerleri QueryCustomerDB çok yüksektir. Toplam ve Ort Toplam değerlerinin aksine, Self değerleri diğer işlevlerde harcanan zamanı dışlar, bu nedenle performans sorununa bakmak için iyi bir yerdir.

İpucu

Self değerleri yüksek yerine nispeten düşükse, işlev tarafından QueryCustomerDB çağrılan gerçek sorgulara bakmak isteyebilirsiniz.

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

public ActionResult<string> QueryCustomerDB()
{

    Task dbTask = QueryCustomerFromDbAsync("Dana");
    return "success:tasksleepwait";
}

Biraz araştırma yaparak bu kodun await kullanmadan bir zaman uyumsuz API çağırdığını keşfettik. 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.

public async Task<ActionResult<string>> TaskAsyncWait()
{
    Customer c = await PretendQueryCustomerFromDbAsync("Dana");
    return "success:taskasyncwait";
}

Veritabanı sorguları ile ilgili performans sorunları görürseniz, veritabanı aracını kullanarak belirli çağrıların daha yavaş olup olmadığını araştırabilirsiniz. Bu veriler sorguları iyileştirme fırsatı olduğunu gösterebilir. Bir performans sorununu araştırmak için Veritabanı aracının nasıl kullanılacağını gösteren bir öğretici için bkz . Kodu iyileştirmeye yönelik Başlangıç kılavuzu. Veritabanı aracı, ADO.NET veya Entity Framework Core ile .NET Core'un desteklenmektedir.

Visual Studio'da tek tek iş parçacığı davranışına yönelik görselleştirmeler almak için, hata ayıklama sırasında Paralel Yığınlar penceresini kullanabilirsiniz. Bu pencerede ayrı ayrı iş parçacıklarının yanı sıra bekleyen iş parçacıkları, bekledikleri iş parçacıkları ve kilitlenmeler hakkında bilgiler gösterilir.

İş parçacığı havuzu açlığı hakkında ek bilgi için bkz . İş parçacığı havuzu açlığı 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.