dotnet-trace performans analizi yardımcı programı

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

Yükleme

indirip yüklemenin iki yolu dotnet-trace vardır:

Not

Bir dotnet-trace x86 uygulamasında kullanmak için aracın ilgili x86 sürümüne ihtiyacınız vardır.

Özet

dotnet-trace [-h, --help] [--version] <command>

Description

dotnet-traceAraç:

  • Platformlar arası bir .NET Core aracıdır.
  • Yerel profil oluşturma olmadan çalışan bir işlem için .NET Core izlemelerinin toplanmasına olanak sağlar.
  • EventPipe.NET Core çalışma zamanı üzerinde yerleşiktir.
  • Aynı deneyimi Windows, Linux veya macOS'ta sunar.

Seçenekler

  • -h|--help

    Komut satırı yardımlarını gösterir.

  • --version

    dotnet-trace yardımcı programı sürümünü görüntüler.

Komutlar

Komut
dotnet-trace collect
dotnet-trace convert
dotnet-trace ps
dotnet-trace list-profiles
dotnet-trace report

dotnet-trace collect

Çalışan bir işlemden tanılama izlemesi toplar veya bir alt işlemi başlatarak izler (yalnızca.NET 5+ ). Aracın bir alt işlemi çalıştırmasını ve başlangıçtan izlemesini yapmak için -- collect komutunun sonuna ekleme.

Özet

dotnet-trace collect [--buffersize <size>] [--clreventlevel <clreventlevel>] [--clrevents <clrevents>]
    [--format <Chromium|NetTrace|Speedscope>] [-h|--help]
    [-n, --name <name>] [--diagnostic-port] [-o|--output <trace-file-path>] [-p|--process-id <pid>]
    [--profile <profile-name>] [--providers <list-of-comma-separated-providers>]
    [--show-child-io]
    [-- <command>] (for target applications running .NET 5 or later)

Seçenekler

  • --buffersize <size>

    Bellek içinde döngüsel arabelleğin boyutunu megabayt cinsinden ayarlar. Varsayılan 256 MB.

    Not

    Hedef işlem olayları çok sık yazarsa, bu arabellekte taşma olabilir ve bazı olaylar bırakılır. Çok fazla olay bırakılırsa, bırakılan olay sayısının azaldığna bakarak arabellek boyutunu artır. Bırakılan olayların sayısı daha büyük bir arabellek boyutuyla azalmazsa, bunun nedeni hedef işlem arabelleklerinin boşaltan yavaş bir okuyucu olması olabilir.

  • --clreventlevel <clreventlevel>

    Yayma CLR olaylarının ayrıntılılığı.

  • --clrevents <clrevents>

    İşaretlerle ayırarak etkinleştirilen CLR çalışma zamanı sağlayıcısı anahtar + sözcüklerinin listesi. Bu, olay anahtar sözcüklerini, bunların hex değerleri yerine dize diğer adları aracılığıyla belirtmenize olanak sağlayan basit bir eşlemedir. Örneğin, dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:3:4 ile aynı olay kümesine istekte dotnet-trace collect --clrevents gc+gchandle --clreventlevel informational lar. Aşağıdaki tabloda kullanılabilir anahtar sözcüklerin listesi gösterilmiştir:

    Anahtar Sözcük Dizesi Diğer Adı Anahtar Sözcük Altılık Değer
    gc 0x1
    gchandle 0x2
    fusion 0x4
    loader 0x8
    jit 0x10
    ngen 0x20
    startenumeration 0x40
    endenumeration 0x80
    security 0x400
    appdomainresourcemanagement 0x800
    jittracing 0x1000
    interop 0x2000
    contention 0x4000
    exception 0x8000
    threading 0x10000
    jittedmethodiltonativemap 0x20000
    overrideandsuppressngenevents 0x40000
    type 0x80000
    gcheapdump 0x100000
    gcsampledobjectallocationhigh 0x200000
    gcheapsurvivalandmovement 0x400000
    gcheapcollect 0x800000
    gcheapandtypenames 0x1000000
    gcsampledobjectallocationlow 0x2000000
    perftrack 0x20000000
    stack 0x40000000
    threadtransfer 0x80000000
    debugger 0x100000000
    monitoring 0x200000000
    codesymbols 0x400000000
    eventsource 0x800000000
    compilation 0x1000000000
    compilationdiagnostic 0x2000000000
    methoddiagnostic 0x4000000000
    typediagnostic 0x8000000000

    CLR sağlayıcısı hakkında daha fazla bilgi için bkz. .NETçalışma zamanı sağlayıcısı başvuru belgeleri.

  • --format {Chromium|NetTrace|Speedscope}

    İzleme dosyası dönüştürme için çıkış biçimini ayarlar. Varsayılan değer: NetTrace.

  • -n, --name <name>

    İzlemeyi toplama işleminin adı.

  • --diagnostic-port <path-to-port>

    Oluşturulan tanılama bağlantı noktasının adı. Bu seçeneği kullanarak uygulama başlangıcından izleme toplama hakkında bilgi edinmek için bkz. Uygulama başlangıcından izleme toplamak için tanılama bağlantı noktasını kullanma.

  • -o|--output <trace-file-path>

    Toplanan izleme verileri için çıkış yolu. Belirtilmezse, varsayılan olarak trace.nettrace kullanılır.

  • -p|--process-id <PID>

    İzlemeyi toplamak için işlem kimliği.

  • --profile <profile-name>

    Yaygın izleme senaryolarının kısa ve öz bir şekilde belirtilebilir olması için önceden tanımlanmış adlandırılmış sağlayıcı yapılandırmaları kümesi. Aşağıdaki profiller kullanılabilir:

Profil Description
cpu-sampling CPU kullanımını ve genel .NET çalışma zamanı bilgilerini izlemek için kullanışlıdır. Profil veya sağlayıcı belirtilmezse bu varsayılan seçenektir.
gc-verbose GC koleksiyonlarını ve örnekleri nesne ayırmalarını izler.
gc-collect GC koleksiyonlarını yalnızca çok düşük ek yükte izler.
  • --providers <list-of-comma-separated-providers>

    Etkinleştirilen sağlayıcıların EventPipe virgülle ayrılmış listesi. Bu sağlayıcılar, tarafından yapılan tüm sağlayıcıları --profile <profile-name> tamamlar. Belirli bir sağlayıcı için tutarsızlık varsa, bu yapılandırma profilden örtülü yapılandırmaya göre önceliklidir.

    Bu sağlayıcı listesi şu şekildedir:

    • Provider[,Provider]
    • Provider şu formdadır: KnownProviderName[:Flags[:Level][:KeyValueArgs]] .
    • KeyValueArgs şu formdadır: [key1=value1][;key2=value2] .

    .NET'te bilinen sağlayıcılardan bazıları hakkında daha fazla bilgi edinmek için Bkz. İyi Bilinen Olay Sağlayıcıları.

  • -- <command> (yalnızca .NET 5 çalıştıran hedef uygulamalar için)

    Koleksiyon yapılandırma parametrelerinin ardından kullanıcı, en az 5.0 çalışma zamanı ile bir .NET uygulaması başlatmak için bir komut -- ek olarak ekleme yapar. Bu, başlatma performansı sorunu veya derleme yükleyicisi ve bağlayıcı hataları gibi sürecin başlarında oluşan sorunları tanılarken yararlı olabilir.

    Not

    Bu seçeneğin kullanımı, araçla yeniden iletişim kuran ilk .NET 5 işlemini izler. Bu, komutunuz birden çok .NET uygulaması başlatıyorsa yalnızca ilk uygulamayı toplayan anlamına gelir. Bu nedenle, kendi içinde uygulamalar veya seçeneğini kullanarak bu seçeneğin kullanılması dotnet exec <app.dll> önerilir.

  • --show-child-io

    Geçerli konsolda başlatılan bir alt işlem giriş ve çıkış akışlarını gösterir.

Not

büyük uygulamalar için izlemenin durdurulması uzun sürebilir (en fazla dakika). Çalışma zamanının, izlemede yakalanan tüm yönetilen kodlar için tür önbelleği üzerinden göndermesi gerekir.

Not

Linux ve macOS'ta bu komut, hedef uygulamayı bekler ve dotnet-trace aynı ortam TMPDIR değişkenini paylaşır. Aksi takdirde komut zaman akçesi olur.

Not

kullanarak bir izleme toplamak için, hedef işlemi çalıştıran kullanıcıyla aynı kullanıcı veya dotnet-trace kök olarak çalıştırılır. Aksi takdirde, araç hedef işlemle bağlantı kuramayacaktır.

Not

Aşağıdakine benzer bir hata iletisi görüyorsanız: , hedef işlemde eşleşmeyen bitlik olan [ERROR] System.ComponentModel.Win32Exception (299): A 32 bit processes cannot access modules of a 64 bit process. bir hata iletisi kullanmaya dotnet-trace çalışıyorsanız. Yükleme bağlantısında aracın doğru bitliğini indirmiş olduğundan emin olun.

dotnet-trace convert

İzlemeleri nettrace alternatif izleme analizi araçlarıyla kullanmak üzere alternatif biçimlere dönüştürür.

Özet

dotnet-trace convert [<input-filename>] [--format <Chromium|NetTrace|Speedscope>] [-h|--help] [-o|--output <output-filename>]

Bağımsız değişkenler

  • <input-filename>

    Dönüştürülecek izleme dosyasını girdi. Varsayılan olarak trace.nettrace kullanılır.

Seçenekler

  • --format <Chromium|NetTrace|Speedscope>

    İzleme dosyası dönüştürme için çıkış biçimini ayarlar.

  • -o|--output <output-filename>

    Çıktı dosya adı. Hedef biçimin uzantısı eklenecektir.

Not

Dosyaları nettrace veya chromium speedscope dosyalarına dönüştürmek geri alınamaz. speedscope ve chromium dosyalarında dosyaları yeniden oluştur için gereken tüm bilgiler nettrace yoktur. Ancak, komut özgün dosyayı korur, bu nedenle gelecekte açmayı planlıyorsanız convert nettrace bu dosyayı silmeyin.

dotnet-trace ps

İzlemelerin toplanabilir olduğu dotnet işlemlerini listeler.

Özet

dotnet-trace ps [-h|--help]

dotnet-trace list-profiles

Önceden yerleşik izleme profillerini listeler ve her profilde hangi sağlayıcıların ve filtrelerin olduğunu belirtir.

Özet

dotnet-trace list-profiles [-h|--help]

dotnet-trace report

Daha önce oluşturulan bir izlemeden stdout'a bir rapor oluşturur.

Özet

dotnet-trace report [-h|--help] <tracefile> [command]

Bağımsız değişkenler

  • <tracefile>

    Analiz olan izlemenin dosya yolu.

Komutlar

dotnet-trace report topN

Çağrı yığınında en uzun olan ilk N yöntemi bulur.

Özet
dotnet-trace report <tracefile> topN [-n|--number <n>] [--inclusive] [-v|--verbose] [-h|--help]
Seçenekler
  • -n|--number <n>

Çağrı yığınında ilk N yöntemi verir.

  • --inclusive

Kapsayıcı saati temel alarak ilk N yöntemin çıkışını verir. Belirtilmezse, varsayılan olarak özel zaman kullanılır.

  • -v|--verbose

Her yöntemin parametrelerini tam olarak çıktı olarak girin. Belirtilmezse parametreler kesilir.

dotnet-trace ile izleme toplama

kullanarak izlemeleri toplamak dotnet-trace için:

  • İzlemeleri toplamak için .NET Core uygulamasının işlem tanımlayıcısını (PID) alma.

    • Bu Windows, Görev Yöneticisi'ni veya tasklist komutunu kullanabilirsiniz, örneğin.
    • Örneğin Linux'ta ps komutu.
    • dotnet-trace ps
  • Şu komutu çalıştırın:

    dotnet-trace collect --process-id <PID>
    

    Yukarıdaki komut aşağıdakine benzer bir çıktı oluşturur:

    Press <Enter> to exit...
    Connecting to process: <Full-Path-To-Process-Being-Profiled>/dotnet.exe
    Collecting to file: <Full-Path-To-Trace>/trace.nettrace
    Session Id: <SessionId>
    Recording trace 721.025 (KB)
    
  • tuşuna basarak koleksiyonu <Enter> durdurun. dotnet-traceolayları trace.nettrace dosyasına kaydetmeyi tamamlar.

Bir alt uygulamayı başlatma ve dotnet-trace kullanarak başlangıçtan bir izleme toplama

Önemli

Bu, yalnızca .NET 5 veya sonraki bir çalıştıran uygulamalar için çalışır.

Bazen başlangıçtan bir sürecin izlemesini toplamak yararlı olabilir. .NET 5 veya sonraki bir çalıştıran uygulamalarda bunu dotnet-trace kullanarak yapmak mümkündür.

Komut satırı hello.exe bağımsız değişkenleri olarak ve ile arg1 arg2 başlatılır ve çalışma zamanı başlangıcından bir izleme toplar:

dotnet-trace collect -- hello.exe arg1 arg2

Yukarıdaki komut aşağıdakine benzer bir çıktı oluşturur:

No profile or providers specified, defaulting to trace profile 'cpu-sampling'

Provider Name                           Keywords            Level               Enabled By
Microsoft-DotNETCore-SampleProfiler     0x0000F00000000000  Informational(4)    --profile
Microsoft-Windows-DotNETRuntime         0x00000014C14FCCBD  Informational(4)    --profile

Process        : E:\temp\gcperfsim\bin\Debug\net5.0\gcperfsim.exe
Output File    : E:\temp\gcperfsim\trace.nettrace


[00:00:00:05]   Recording trace 122.244  (KB)
Press <Enter> or <Ctrl+C> to exit...

veya tuşuna basarak izleme toplamayı <Enter> <Ctrl + C> durdur. Bunu yapmak da çıkışından hello.exe çıkar.

Not

dotnet-trace aracılığıyla başlatma, giriş/çıkışını yeniden yönlendirecek ve varsayılan olarak konsolda bu bağlantıyla hello.exe etkileşim kuramayacaksınız. --show-child-iostdin/stdout ile etkileşim kurmak için anahtarını kullanın. CTRL+C veya SIGTERM aracılığıyla araçtan çıkmak hem aracı hem de alt işlemi güvenli bir şekilde sonlar. Alt işlem araçtan önce çıkarsa, araç da çıkış olur ve izleme güvenli bir şekilde değiştirilebilir.

Uygulama başlangıcından izleme toplamak için tanılama bağlantı noktasını kullanma

Önemli

Bu, yalnızca .NET 5 veya sonraki bir çalıştıran uygulamalar için çalışır.

Tanılama bağlantı noktası, .NET 5'e eklenen ve uygulama başlangıcından izlemeyi başlatmaya olanak sağlayan yeni bir çalışma zamanı özelliğidir. Bunu kullanarak yapmak dotnet-trace için, yukarıdaki dotnet-trace collect -- <command> örneklerde açıklandığı gibi kullanabilir veya seçeneğini --diagnostic-port kullanabilirsiniz.

Uygulamayı dotnet-trace <collect|monitor> -- <command> alt işlem olarak başlatmak için kullanmak, uygulamayı başlangıçtan hızla izlemenin en kolay yolu olur.

Ancak, izlenen uygulamanın ömrü üzerinde daha iyi bir denetim elde etmek (örneğin, uygulamayı yalnızca ilk 10 dakika boyunca izlemek ve yürütmeye devam etmek) ya da CLI kullanarak uygulamayla etkileşime geçmeniz gerekirse, seçeneği kullanarak hem izlenen hedef uygulamayı hem de 'i denetlemenizi --diagnostic-port dotnet-trace sağlar.

  1. Aşağıdaki komut, dotnet-trace adlı bir tanılama yuvası oluşturmanızı ve bağlantı myport.sock beklemeyi sağlar.

    dotnet-trace collect --diagnostic-port myport.sock
    

    Çıkış:

    Waiting for connection on myport.sock
    Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sock
    
  2. Ayrı bir konsolda, çıkışta değerine ayarlanmış ortam DOTNET_DiagnosticPorts değişkeniyle hedef uygulamayı dotnet-trace başlatın.

    export DOTNET_DiagnosticPorts=/home/user/myport.sock
    ./my-dotnet-app arg1 arg2
    

    Bunun ardından izlemeyi dotnet-trace başlatmayı etkinleştirmesi my-dotnet-app gerekir:

    Waiting for connection on myport.sock
    Start an application with the following environment variable: DOTNET_DiagnosticPorts=myport.sock
    Starting a counter session. Press Q to quit.
    

    Önemli

    dotnet CLI, uygulamanıza bağlanmadan önce bağlanarak çalışma zamanında askıya alınarak askıya dotnet run dotnet-trace alınabilir. Doğrudan uygulamanın kendi içinde bir sürümünü veya uygulamayı başlatmak için dotnet exec kullanma önerilir.

dotnet-trace'den yakalanan izlemeyi görüntüleme

Bu Windows.nettrace dosyaları analiz için PerfView'da görüntülenebiliyor: Diğer platformlarda toplanan izlemeler için izleme dosyası, PerfView'da Windows bir Windows makinesine taşınabiliyor.

Linux'ta izleme, çıkış biçimi olarak değiştirerek dotnet-trace speedscope biçimlendirilmiş. Çıkış dosyası biçimi seçeneği kullanılarak -f|--format değiştirilebilir; -f speedscope bu, bir dotnet-trace dosya üretmeye neden speedscope olur. ile arasında nettrace seçim (varsayılan seçenek) seçeneğini speedscope belirleyin. Speedscope dosyaları, 'de https://www.speedscope.app açılabilir.

Not

.NET Core çalışma zamanı biçiminde izlemeler nettrace üretir. İzleme tamamlandıktan sonra izlemeler speedscope'a dönüştürülür (belirtilmişse). Bazı dönüştürmeler veri kaybına neden olduğu için özgün nettrace dosya dönüştürülen dosyanın yanında korunur.

Zaman içinde sayaç değerlerini toplamak için dotnet-trace kullanma

dotnet-trace -bilirsiniz:

  • Performansa EventCounter duyarlı ortamlarda temel sistem durumu izlemesi için kullanın. Örneğin, üretimde.
  • İzlemeleri toplayın, böylece gerçek zamanlı olarak görüntülemeleri gereksin.

Örneğin, çalışma zamanı performans sayacı değerlerini toplamak için aşağıdaki komutu kullanın:

dotnet-trace collect --process-id <PID> --providers System.Runtime:0:1:EventCounterIntervalSec=1

Yukarıdaki komut, basit sistem durumu izlemesi için çalışma zamanı sayaçlarına her saniye bir rapor bildirmesini söyler. değerinin EventCounterIntervalSec=1 daha yüksek bir değerle (örneğin, 60) değiştirilmesi, sayaç verisinde daha az ayrıntıyla daha küçük bir izlemenin toplanmasına olanak sağlar.

Aşağıdaki komut ek yükü ve izleme boyutunu öncekinden daha fazla azaltır:

dotnet-trace collect --process-id <PID> --providers System.Runtime:0:1:EventCounterIntervalSec=1,Microsoft-Windows-DotNETRuntime:0:1,Microsoft-DotNETCore-SampleProfiler:0:1

Yukarıdaki komut çalışma zamanı olaylarını ve yönetilen yığın profilleyicisini devre dışı bırakıyor.

Uzun komutlar yazmaktan kaçınmak için .rsp dosyası kullanma

Geçiş için dotnet-trace bağımsız değişkenleri içeren bir .rsp dosyayla başlatabilirsiniz. Bu, uzun bağımsız değişkenler beklenen sağlayıcılar etkinleştirildi veya karakterleri şeritle alan bir kabuk ortamı kullanılırken yararlı olabilir.

Örneğin, aşağıdaki sağlayıcı her izleme istediğiniz zaman yazma zahmetli olabilir:

dotnet-trace collect --providers Microsoft-Diagnostics-DiagnosticSource:0x3:5:FilterAndPayloadSpecs="SqlClientDiagnosticListener/System.Data.SqlClient.WriteCommandBefore@Activity1Start:-Command;Command.CommandText;ConnectionId;Operation;Command.Connection.ServerVersion;Command.CommandTimeout;Command.CommandType;Command.Connection.ConnectionString;Command.Connection.Database;Command.Connection.DataSource;Command.Connection.PacketSize\r\nSqlClientDiagnosticListener/System.Data.SqlClient.WriteCommandAfter@Activity1Stop:\r\nMicrosoft.EntityFrameworkCore/Microsoft.EntityFrameworkCore.Database.Command.CommandExecuting@Activity2Start:-Command;Command.CommandText;ConnectionId;IsAsync;Command.Connection.ClientConnectionId;Command.Connection.ServerVersion;Command.CommandTimeout;Command.CommandType;Command.Connection.ConnectionString;Command.Connection.Database;Command.Connection.DataSource;Command.Connection.PacketSize\r\nMicrosoft.EntityFrameworkCore/Microsoft.EntityFrameworkCore.Database.Command.CommandExecuted@Activity2Stop:",OtherProvider,AnotherProvider

Ayrıca, önceki örnek bağımsız " değişkeninin bir parçası olarak içerir. Tırnaklar her kabuk tarafından eşit şekilde işlenemeyce, farklı kabuklar kullanırken çeşitli sorunlar yaşanabilirsiniz. Örneğin, içine girilen zsh komut, içinde komutuyla cmd farklıdır.

Bunu her zaman yazmak yerine aşağıdaki metni adlı bir dosyaya myprofile.rsp kaydedebilirsiniz.

--providers
Microsoft-Diagnostics-DiagnosticSource:0x3:5:FilterAndPayloadSpecs="SqlClientDiagnosticListener/System.Data.SqlClient.WriteCommandBefore@Activity1Start:-Command;Command.CommandText;ConnectionId;Operation;Command.Connection.ServerVersion;Command.CommandTimeout;Command.CommandType;Command.Connection.ConnectionString;Command.Connection.Database;Command.Connection.DataSource;Command.Connection.PacketSize\r\nSqlClientDiagnosticListener/System.Data.SqlClient.WriteCommandAfter@Activity1Stop:\r\nMicrosoft.EntityFrameworkCore/Microsoft.EntityFrameworkCore.Database.Command.CommandExecuting@Activity2Start:-Command;Command.CommandText;ConnectionId;IsAsync;Command.Connection.ClientConnectionId;Command.Connection.ServerVersion;Command.CommandTimeout;Command.CommandType;Command.Connection.ConnectionString;Command.Connection.Database;Command.Connection.DataSource;Command.Connection.PacketSize\r\nMicrosoft.EntityFrameworkCore/Microsoft.EntityFrameworkCore.Database.Command.CommandExecuted@Activity2Stop:",OtherProvider,AnotherProvider

kaydettiktan myprofile.rsp sonra, aşağıdaki komutu dotnet-trace kullanarak bu yapılandırmayla başlatabilirsiniz:

dotnet-trace @myprofile.rsp

Ayrıca bkz.