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-gcdump
ve dotnet-trace
gibi dotnet-counters
EventPipe 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 bunu1
olarak ayarlayın. Varsayılan değer şudur:0
.DOTNET_EventPipeOutputPath
: aracılığıylaDOTNET_EnableEventPipe
çalıştırılacak şekilde yapılandırıldığında EventPipe izleme dosyasının çıkış yolu. Varsayılan değer,trace.nettrace
uygulamanı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ığıylaDOTNET_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
==1024
olarak ayarlanan bu ortam değişkenine400
dö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 bunu1
olarak ayarlayın. Varsayılan değer şudur:0
.DOTNET_EventPipeConfig
: ileDOTNET_EnableEventPipe
bir 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_EnableEventPipe
etkinleş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.