EventPipe

EventPipe, ETW veya perf_events benzer şekilde izleme verilerini toplamak için kullanılabilen bir çalışma zamanı bileşenidir. EventPipe'in amacı, .NET geliştiricilerinin ETW veya perf_events gibi platforma özgü yüksek ayrıcalıklı bileşenlere güvenmek zorunda kalmadan .NET uygulamalarını kolayca izlemesine olanak sağlamaktır.

EventPipe, tanılama araçlarının birçoğunun arkasındaki mekanizmadır ve hem çalışma zamanı tarafından yayılan olayları hem de EventSource ile yazılmış özel olayları kullanmak için kullanılabilir.

Bu makale, EventPipe'e üst düzey bir genel bakıştır. EventPipe'in ne zaman ve nasıl kullanılacağını ve ihtiyaçlarınıza en uygun şekilde nasıl yapılandırıldığı açıklanır.

EventPipe ile ilgili temel bilgiler

EventPipe, çalışma zamanı bileşenleri (örneğin, Tam Zamanında derleyicisi veya çöp toplayıcı) tarafından yayılan olayları ve kitaplıklardaki ve kullanıcı kodundaki EventSource örneklerinden yazılan olayları toplar.

Olaylar daha sonra dosya biçiminde seri hale getirilir .nettrace ve işlem dışı kullanım için doğrudan bir dosyaya yazılabilir veya tanılama bağlantı noktası üzerinden akışla aktarılabilir.

EventPipe serileştirme biçimi hakkında daha fazla bilgi edinmek için EventPipe biçimi belgelerine bakın.

EventPipe ile ETW/perf_events karşılaştırması

EventPipe, .NET çalışma zamanının bir parçasıdır ve .NET Core'un desteklediği tüm platformlarda aynı şekilde çalışacak şekilde tasarlanmıştır. Bu, , dotnet-gcdumpve dotnet-tracegibi dotnet-countersEventPipe tabanlı izleme araçlarının platformlar arasında sorunsuz bir şekilde çalışmasını sağlar.

Ancak EventPipe bir çalışma zamanı yerleşik bileşeni olduğundan kapsamı yönetilen kodla ve çalışma zamanının kendisiyle sınırlıdır. EventPipe olayları yalnızca yönetilen kod çerçevesi bilgilerine sahip stacktraces içerir. Olayların diğer yönetilmeyen kullanıcı modu kitaplıklarından, yerel kod için CPU örneklemesinden veya çekirdek olaylarından oluşturulmasını istiyorsanız ETW veya perf_events gibi işletim sistemine özgü izleme araçlarını kullanmanız gerekir. Linux'ta perfcollect aracı , perf_events ve LTTng kullanarak otomatikleştirmeye yardımcı olur.

EventPipe ile ETW/perf_events arasındaki bir diğer önemli fark yönetici/kök ayrıcalık gereksinimidir. ETW veya perf_events kullanarak bir uygulamayı izlemek için yönetici/kök olmanız gerekir. EventPipe kullanarak, izleyici (örneğin, dotnet-trace) uygulamayı başlatan kullanıcıyla aynı kullanıcı olarak çalıştırıldığı sürece uygulamaları izleyebilirsiniz.

Aşağıdaki tabloda EventPipe ile ETW/perf_events arasındaki farkların bir özeti yer alır.

Özellik EventPipe ETW perf_events
Platformlar arası Yes Hayır (yalnızca Windows'ta) Hayır (yalnızca desteklenen Linux dağıtımlarında)
Yönetici/kök ayrıcalığı gerektir Hayır Evet Yes
İşletim sistemi/çekirdek olayları alabilir Hayır Evet Yes
Yerel çağrı yığınlarını çözümleyebilir Hayır Evet Yes

.NET uygulamanızı izlemek için EventPipe kullanma

.NET uygulamanızı izlemek için EventPipe'i birçok şekilde kullanabilirsiniz:

  • EventPipe üzerinde oluşturulan tanılama araçlarından birini kullanın.

  • EventPipe oturumlarını yapılandırmak ve başlatmak için kendi aracınızı yazmak için Microsoft.Diagnostics.NETCore.Client kitaplığını kullanın.

  • EventPipe'i başlatmak için ortam değişkenlerini kullanın.

EventPipe olaylarınızı içeren bir nettrace dosya ürettikkten sonra, dosyayı PerfView veya Visual Studio'da görüntüleyebilirsiniz. Windows olmayan platformlarda, dotnet-trace convert komutunu kullanarak dosyayı bir speedscope veya Chromium izleme biçimine dönüştürebilir nettrace ve speedscope veya Chrome DevTools ile görüntüleyebilirsiniz.

TraceEvent ile EventPipe izlemelerini program aracılığıyla da analiz edebilirsiniz.

EventPipe kullanan araçlar

Uygulamanızı izlemek için EventPipe kullanmanın en kolay yolu budur. Bu araçların her birini kullanma hakkında daha fazla bilgi edinmek için her aracın belgelerine bakın.

  • dotnet-counters , .NET çalışma zamanı ve çekirdek kitaplıkları tarafından yayılan çeşitli ölçümleri ve yazabileceğiniz özel ölçümleri izlemenize ve toplamanıza olanak tanır.

  • dotnet-gcdump , bir uygulamanın yönetilen yığınını analiz etmek için canlı işlemlerin GC yığın dökümlerini toplamanıza olanak tanır.

  • dotnet-trace , performans analizi için uygulamaların izlemelerini toplamanıza olanak tanır.

Ortam değişkenlerini kullanarak izleme

EventPipe kullanmak için tercih edilen mekanizma dotnet-trace veya Microsoft.Diagnostics.NETCore.Client kitaplığını kullanmaktır.

Ancak, bir uygulamada EventPipe oturumu ayarlamak ve izlemeyi doğrudan bir dosyaya yazmasını sağlamak için aşağıdaki ortam değişkenlerini kullanabilirsiniz. İzlemeyi durdurmak için uygulamadan çıkın.

  • DOTNET_EnableEventPipe: Doğrudan bir dosyaya yazan bir EventPipe oturumu başlatmak için bunu 1 olarak ayarlayın. Varsayılan değer şudur: 0.

  • DOTNET_EventPipeOutputPath: aracılığıyla DOTNET_EnableEventPipeçalıştırılacak şekilde yapılandırıldığında EventPipe izleme dosyasının çıkış yolu. Varsayılan değer, trace.nettraceuygulamanın çalıştığı dizinde oluşturulacak olan değeridir.

    Not

    .NET 6'dan bu yana içindeki dize {pid} DOTNET_EventPipeOutputPath örnekleri, izlenen işlemin işlem kimliğiyle değiştirilir.

  • DOTNET_EventPipeCircularMB: EventPipe iç arabelleğinin boyutunu megabayt cinsinden temsil eden onaltılık değer. Bu yapılandırma değeri yalnızca EventPipe aracılığıyla DOTNET_EnableEventPipeçalışacak şekilde yapılandırıldığında kullanılır. Varsayılan arabellek boyutu 1024 MB'tır ve bu da ayarı 0x400 == 1024olarak ayarlanan bu ortam değişkenine 400dönüşür.

    Not

    Hedef işlem olayları çok sık yazıyorsa, bu arabellek taşabilir ve bazı olaylar bırakılabilir. Çok fazla olay bırakılıyorsa, bırakılan olay sayısının azaltılıp azaltılamadığını görmek için arabellek boyutunu artırın. Bırakılan olayların sayısı daha büyük arabellek boyutuyla azalmazsa, bunun nedeni hedef işlemin arabelleklerinin boşaltılmasını engelleyen yavaş bir okuyucu olabilir.

  • DOTNET_EventPipeProcNumbers: EventPipe olay üst bilgilerinde işlemci numaralarını yakalamayı etkinleştirmek için bunu 1 olarak ayarlayın. Varsayılan değer şudur: 0.

  • DOTNET_EventPipeConfig: ile DOTNET_EnableEventPipebir EventPipe oturumu başlatırken EventPipe oturum yapılandırmasını ayarlar. Söz dizimi şu şekildedir:

    <provider>:<keyword>:<level>

    Birden çok sağlayıcıyı virgülle birleştirerek de belirtebilirsiniz:

    <provider1>:<keyword1>:<level1>,<provider2>:<keyword2>:<level2>

    Bu ortam değişkeni ayarlanmadıysa ancak EventPipe tarafından DOTNET_EnableEventPipeetkinleştirildiyse, aşağıdaki sağlayıcılar aşağıdaki anahtar sözcükler ve düzeylerle etkinleştirilerek izlemeye başlar:

    • Microsoft-Windows-DotNETRuntime:4c14fccbd:5
    • Microsoft-Windows-DotNETRuntimePrivate:4002000b:5
    • Microsoft-DotNETCore-SampleProfiler:0:5

    .NET'teki bazı iyi bilinen sağlayıcılar hakkında daha fazla bilgi edinmek için bkz. İyi bilinen Olay Sağlayıcıları.

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.