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.
perfcollect
Linux İ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 perfcollect
bir 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.
dosyasını indirin
perfcollect
.curl -OL https://aka.ms/perfcollect
Betiği yürütülebilir yapın.
chmod +x perfcollect
İ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:
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.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
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.
[İzleme] Koleksiyonu başlatın.
sudo ./perfcollect collect sampleTrace
Beklenen Çıktı:
Collection started. Press CTRL+C to stop.
[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 ekiDOTNET_
standartlaştırır. Ancak önCOMPlus_
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 kullanmayaCOMPlus_
devam etmelisiniz.[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
[İ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 TraceCompass
kullanı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 perf
CPU izlemesini gösterir.
aracılığıyla LTTng
toplanan 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
.
trace.zip dosyasını Linux'tan bir Windows makinesine kopyalayın.
PerfView'ı adresinden https://aka.ms/perfviewindirin.
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 lttngTrace
BIR 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 Trace
metadata
CTF izleme dosyasını içinde TraceCompass
açabilirsiniz.
Diğer ayrıntılar için lütfen belgelere TraceCompass
bakı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:
dotnet-symbol
yükleme:dotnet tool install -g dotnet-symbol
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
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 perfcollect
yerel 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.