Aracılığıyla paylaş


PerfCollect ile .NET uygulamalarını izleme

Bu makale şunlar için geçerlidir: ✔️ .NET Core 2.1 SDK ve sonraki sürümleri

Linux'ta performans sorunlarıyla karşılaşıldığında ile bir izleme perfcollect toplamak, performans sorunu sırasında makinede neler olduğu hakkında ayrıntılı bilgi toplamak için kullanılabilir.

perfcollectLinux İzleme Araç Seti'ni kullanan bir bash betiğidir: çalışma zamanından veya herhangi bir EventSource'tan yazılan olayları toplamak için yeni nesil (LTTng) vehedef işlemin CPU örneklerini toplamak için performans.

Makinenizi hazırlama

makinenizi ile perfcollectbir performans izlemesi toplamaya hazırlamak için bu adımları izleyin.

Not

Kapsayıcının içinden yakalama gerçekleştiriyorsanız kapsayıcınızın uygun özelliklere sahip olması gerekir. Gereken en düşük özellikler ve SYS_PTRACE'tirPERFMON. Yakalama işlemi en düşük kümeyle başarısız olursa, kapsayıcıya özelliği ekleyin SYS_ADMIN . PerfCollect kullanarak kapsayıcıların içindeki uygulamaları izleme hakkında daha fazla bilgi için bkz . Kapsayıcılarda tanılamaları toplama.

  1. dosyasını indirin perfcollect.

    curl -OL https://aka.ms/perfcollect
    
  2. Betiği yürütülebilir yapın.

    chmod +x perfcollect
    
  3. İzleme önkoşullarını yükleme - bunlar gerçek izleme kitaplıklarıdır.

    sudo ./perfcollect install
    

    Bu, makinenize aşağıdaki önkoşulları yükler:

    1. perf: Linux Performans Olayları alt sistemi ve yardımcı kullanıcı modu koleksiyonu/görüntüleyici uygulaması. perf Linux çekirdek kaynağının bir parçasıdır, ancak genellikle varsayılan olarak yüklenmez.

    2. LTTng: CoreCLR tarafından çalışma zamanında yayılan olay verilerini yakalamak için kullanılır. Bu veriler daha sonra GC, JIT ve iş parçacığı havuzu gibi çeşitli çalışma zamanı bileşenlerinin davranışını analiz etmek için kullanılır.

.NET Core ve Linux performans aracının son sürümleri, çerçeve kodu için yöntem adlarının otomatik olarak çözülmesini destekler.

Yerel çalışma zamanı DLL'lerinin (libcoreclr.so gibi) perfcollect yöntem adlarını çözümlemek için, verileri dönüştürdüğünde, ancak yalnızca bu ikili dosyalar için simgeler mevcutsa, bunlar için sembolleri çözümler. Ayrıntılar için Yerel Çalışma Zamanı için Sembolleri Alma bölümüne bakın.

İzleme toplama

  1. biri [İzleme] olarak adlandırılan izlemeyi denetlemek için, diğeri de uygulamayı çalıştırmak için [Uygulama] olarak adlandırılan iki kabuk vardır.

  2. [İzleme] Koleksiyonu başlatın.

    sudo ./perfcollect collect sampleTrace
    

    Beklenen Çıktı:

    Collection started.  Press CTRL+C to stop.
    
  3. [Uygulama] Uygulama kabuğunu aşağıdaki ortam değişkenleriyle ayarlayın. Bu, CoreCLR'nin izleme yapılandırmasını etkinleştirir.

    export DOTNET_PerfMapEnabled=1
    export DOTNET_EnableEventLog=1
    

    Not

    Uygulamayı .NET 7 ile yürütürken, önceki ortam değişkenlerine ek olarak da ayarlamanız DOTNET_EnableWriteXorExecute=0 gerekir. Örneğin:

    export DOTNET_EnableWriteXorExecute=0
    

    Not

    .NET 6, .NET çalışma zamanı davranışını yapılandıran ortam değişkenleri yerine COMPlus_ ön eki DOTNET_ standartlaştırır. Ancak ön COMPlus_ ek çalışmaya devam eder. .NET çalışma zamanının önceki bir sürümünü kullanıyorsanız, ortam değişkenleri için ön eki kullanmaya COMPlus_ devam etmelisiniz.

  4. [Uygulama] Uygulamayı çalıştırın; performans sorununu yakalamak için gereken süre boyunca çalışmasına izin verin. Tam uzunluk, araştırmak istediğiniz performans sorununun oluştuğu zaman penceresini yeterince yakaladığı sürece ihtiyacınız olduğu kadar kısa olabilir.

    dotnet run
    
  5. [İzleme] Koleksiyonu durdur - CTRL+C tuşlarına basın.

    ^C
    ...STOPPED.
    
    Starting post-processing. This may take some time.
    
    Generating native image symbol files
    ...SKIPPED
    Saving native symbols
    ...FINISHED
    Exporting perf.data file
    ...FINISHED
    Compressing trace files
    ...FINISHED
    Cleaning up artifacts
    ...FINISHED
    
    Trace saved to sampleTrace.trace.zip
    

    Sıkıştırılmış izleme dosyası artık geçerli çalışma dizininde depolanır.

İzlemeyi görüntüleme

Toplanan izlemenin görüntülenmesi için bir dizi seçenek vardır. İzlemeler windows üzerinde PerfView kullanılarak en iyi şekilde görüntülenebilir, ancak doğrudan Linux üzerinde kendi veya TraceCompasskullanılarak PerfCollect görüntülenebilir.

İzleme dosyasını görüntülemek için PerfCollect kullanma

Topladığınız izlemeyi görüntülemek için perfcollect'in kendisini kullanabilirsiniz. Bunu yapmak için aşağıdaki komutu kullanın:

./perfcollect view sampleTrace.trace.zip

Varsayılan olarak, kullanarak uygulamanın perfCPU izlemesini gösterir.

aracılığıyla LTTngtoplanan olaylara bakmak için bayrağını -viewer lttng geçirerek olayları tek tek görebilirsiniz:

./perfcollect view sampleTrace.trace.zip -viewer lttng

Bu işlem, olay yükünü yazdırmak için görüntüleyiciyi kullanır babeltrace :

# [01:02:18.189217659] (+0.020132603) ubuntu-xenial DotNETRuntime:ExceptionThrown_V1: { cpu_id = 0 }, { ExceptionType = "System.Exception", ExceptionMessage = "An exception happened", ExceptionEIP = 139875671834775, ExceptionHRESULT = 2148734208, ExceptionFlags = 16, ClrInstanceID = 0 }
# [01:02:18.189250227] (+0.020165171) ubuntu-xenial DotNETRuntime:ExceptionCatchStart: { cpu_id = 0 }, { EntryEIP = 139873639728404, MethodID = 139873626968120, MethodName = "void [helloworld] helloworld.Program::Main(string[])", ClrInstanceID = 0 }

İzleme dosyasını açmak için PerfView kullanma

Hem CPU örneğinin hem de olayların toplu görünümünü görmek için bir Windows makinesinde kullanabilirsiniz PerfView .

  1. trace.zip dosyasını Linux'tan bir Windows makinesine kopyalayın.

  2. PerfView'ı adresinden https://aka.ms/perfviewindirin.

  3. PerfView.exe çalıştırma

    PerfView.exe <path to trace.zip file>
    

PerfView, izleme dosyasında bulunan verilere göre desteklenen görünümlerin listesini görüntüler.

  • CPU araştırmaları için CPU yığınları'nı seçin.

  • Ayrıntılı GC bilgileri için GCStats'ı seçin.

  • İşlem başına/modül/yöntem JIT bilgileri için JITStats'ı seçin.

  • İhtiyacınız olan bilgiler için bir görünüm yoksa, ham olaylar görünümünde olayları aramayı deneyebilirsiniz. Olaylar'ı seçin.

PerfView'da görünümleri yorumlama hakkında daha fazla bilgi için, görünümün kendisindeki yardım bağlantılarına bakın veya PerfView'daki ana pencerede Yardım Kullanıcıları> Kılavuzu'nu seçin.

Not

API aracılığıyla System.Diagnostics.Tracing.EventSource yazılan olaylar (Framework'ten gelen olaylar dahil) sağlayıcı adı altında gösterilmez. Bunun yerine, sağlayıcı altında Microsoft-Windows-DotNETRuntime olaylar olarak EventSourceEvent yazılır ve yükleri JSON serileştirilir.

Not

Yöntem adlarında ve çağrı yığınlarında çerçeveler gözlemlerseniz [unknown] /memfd:doublemapper , perfcollect ile takip ettiğiniz uygulamayı çalıştırmadan önce ayarlayın DOTNET_EnableWriteXorExecute=0 .

İzleme dosyasını açmak için TraceCompass kullanma

Eclipse TraceCompass , izlemeleri görüntülemek için kullanabileceğiniz başka bir seçenektir. TraceCompass Linux makinelerinde de çalışır, bu nedenle izlemenizi bir Windows makinesine taşımanız gerekmez. İzleme dosyanızı açmak için kullanmak TraceCompass için dosyanın sıkıştırmasını açmanız gerekir.

unzip myTrace.trace.zip

perfcollect , topladığı LTTng izlemesini içindeki bir alt dizindeki lttngTraceBIR CTF dosya biçiminde kaydeder. Özellikle, CTF dosyası gibi lttngTrace/auto-20201025-101230\ust\uid\1000\64-bit\görünen bir dizinde bulunur.

DOSYAYı seçip seçerek File -> Open Tracemetadata CTF izleme dosyasını içinde TraceCompass açabilirsiniz.

Diğer ayrıntılar için lütfen belgelere TraceCompassbakın.

Yerel çalışma zamanı için sembolleri alma

Çoğu zaman, varsayılan olarak çözümlenen perfcollect kendi kodunuzla ilgilenirsiniz. Bazen .NET DLL'lerinde (son bölümün konusu budur) neler olduğunu görmek yararlıdır, ancak bazen yerel çalışma zamanı dll'lerinde (genellikle libcoreclr.so) neler olup bittiğini görmek ilginçtir. perfcollect , verilerini dönüştürdüğünde, ancak yalnızca bu yerel DLL'lerin simgeleri mevcutsa (ve için oldukları kitaplığın yanındaysa) bunlar için sembolleri çözümleyecektir.

Bunu yapmak için dotnet-symbol adlı genel bir komut vardır. Yerel çalışma zamanı simgelerini almak için dotnet-symbol kullanmak için:

  1. dotnet-symbol yükleme:

    dotnet tool install -g dotnet-symbol
    
  2. Simgeleri indirin. Yüklü .NET Core çalışma zamanı sürümünüz 2.1.0 ise, bunu yapmak için komut şu şekildedir:

    mkdir mySymbols
    dotnet symbol --symbols --output mySymbols  /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0/lib*.so
    
  3. Simgeleri doğru yere kopyalayın.

    sudo cp mySymbols/* /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0
    

    Uygun dizine yazma erişiminiz olmadığından bu yapılamıyorsa, sembolleri eklemek için kullanabilirsiniz perf buildid-cache .

Bundan sonra, komutunu çalıştırdığınızda perfcollectyerel dll'ler için sembolik adlar almalısınız.

Docker kapsayıcısında toplama

Kapsayıcı ortamlarında kullanma perfcollect hakkında daha fazla bilgi için bkz . Kapsayıcılarda tanılamaları toplama.

Koleksiyon seçenekleri hakkında daha fazla bilgi edinin

Tanılama gereksinimlerinize daha uygun olması için aşağıdaki isteğe bağlı bayrakları ile perfcollect belirtebilirsiniz.

Belirli bir süre için toplama

Belirli bir süre için bir izleme toplamak istediğinizde, seçeneğini ve ardından izlemenin toplanması için toplam saniyeyi belirten bir sayı kullanabilirsiniz -collectsec .

İş parçacığı süresi izlemelerini toplama

ile perfcollect belirtmek-threadtime, iş parçacığı başına CPU kullanım verilerini toplamanıza olanak tanır. Bu, her iş parçacığının CPU zamanını nereye harcadığını analiz etmenizi sağlar.

Yönetilen bellek ve çöp toplayıcı performansı için izlemeleri toplama

Aşağıdaki seçenekler, gc olaylarını çalışma zamanından özellikle toplamanıza olanak tanır.

  • perfcollect collect -gccollectonly

Yalnızca en az sayıda GC Koleksiyonu olayı toplayın. Bu, hedef uygulamanın performansı üzerinde en düşük etkiye sahip en az ayrıntılı GC olay koleksiyonu profilidir. Bu komut, PerfView'daki komuta benzer PerfView.exe /GCCollectOnly collect .

  • perfcollect collect -gconly

JIT, Loader ve Exception olaylarıyla daha ayrıntılı GC toplama olayları toplayın. Bu, daha ayrıntılı olaylar (ayırma bilgileri ve GC birleştirme bilgileri gibi) ister ve hedef uygulamanın performansında seçenekten daha -gccollectonly fazla etkiye sahip olur. Bu komut, PerfView'daki komuta benzer PerfView.exe /GCOnly collect .

  • perfcollect collect -gcwithheap

Yığının hayatta kalmasını ve hareketlerini de izleyen en ayrıntılı GC toplama olaylarını toplayın. Bu, GC davranışının ayrıntılı analizini sağlar, ancak her GC iki kat daha uzun süreene kadar yüksek performans maliyetine neden olur. Üretim ortamlarında izleme yaparken bu izleme seçeneğini kullanmanın performans üzerindeki etkilerini anlamanız önerilir.