nástroj pro analýzu výkonu dotnet-trace
Tento článek se vztahuje na: ✔️ dotnet-trace
3.0.47001 a novější verze
Instalace
Existují dva způsoby, jak stáhnout a nainstalovat dotnet-trace
:
dotnet global tool:
Pokud chcete nainstalovat nejnovější verzi
dotnet-trace
balíčku NuGet, použijte příkaz dotnet tool install :dotnet tool install --global dotnet-trace
Přímé stahování:
Stáhněte spustitelný soubor nástroje, který odpovídá vaší platformě:
Operační systém Platforma Windows x86 | x64 | Arm | arm-x64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
Synopse
dotnet-trace [-h, --help] [--version] <command>
Popis
Nástroj dotnet-trace
:
- Je multiplatformní nástroj .NET Core.
- Umožňuje kolekci trasování .NET Core spuštěného procesu bez nativního profileru.
- Je postaven na
EventPipe
modulu runtime .NET Core. - Poskytuje stejné prostředí ve Windows, Linuxu nebo macOS.
Možnosti
-h|--help
Zobrazuje nápovědu k příkazovému řádku.
--version
Zobrazí verzi nástroje dotnet-trace.
--duration
Jak dlouho se má trasování spustit.
--duration 00:00:00:05
spustí ho po dobu 5 sekund.
Příkazy
Příkaz |
---|
dotnet-trace collect |
dotnet-trace convert |
dotnet-trace ps |
dotnet-trace list-profiles |
dotnet-trace report |
dotnet-trace collect
Shromažďuje diagnostické trasování ze spuštěného procesu nebo spouští podřízený proces a trasuje ho (.NET 5 nebo novější). Pokud chcete, aby nástroj spustil podřízený proces a trasování z jeho spuštění, připojte --
ho k příkazu collect.
Synopse
dotnet-trace collect [--buffersize <size>] [--clreventlevel <clreventlevel>] [--clrevents <clrevents>]
[--format <Chromium|NetTrace|Speedscope>] [-h|--help] [--duration dd:hh:mm:ss]
[-n, --name <name>] [--diagnostic-port] [-o|--output <trace-file-path>] [-p|--process-id <pid>]
[--profile <profile-name>] [--providers <list-of-comma-separated-providers>]
[-- <command>] (for target applications running .NET 5 or later)
[--show-child-io] [--resume-runtime]
[--stopping-event-provider-name <stoppingEventProviderName>]
[--stopping-event-event-name <stoppingEventEventName>]
[--stopping-event-payload-filter <stoppingEventPayloadFilter>]
Možnosti
--buffersize <size>
Nastaví velikost vyrovnávací paměti v megabajtech. Výchozí 256 MB.
Poznámka:
Pokud cílový proces generuje události rychleji, než je možné zapisovat na disk, může tato vyrovnávací paměť přetékat a některé události se zahodí. Tento problém můžete zmírnit zvýšením velikosti vyrovnávací paměti nebo snížením počtu zaznamenaných událostí.
--clreventlevel <clreventlevel>
Úroveň podrobností událostí CLR, které se mají vygenerovat. V následující tabulce jsou uvedeny dostupné úrovně událostí.
Řetězcová hodnota Číselná hodnota logalways
0
critical
1
error
2
warning
3
informational
4
verbose
5
--clrevents <clrevents>
Seznam klíčových slov zprostředkovatele modulu runtime CLR, která povolí oddělení znaménkami
+
. Toto je jednoduché mapování, které umožňuje zadat klíčová slova událostí prostřednictvím řetězcových aliasů místo jejich šestnáctkových hodnot. Napříkladdotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:3:4
vyžaduje stejnou sadu událostí jakodotnet-trace collect --clrevents gc+gchandle --clreventlevel informational
. Následující tabulka ukazuje seznam dostupných klíčových slov:Alias řetězce klíčového slova Hexní hodnota klíčového slova 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
O poskytovateli CLR si můžete přečíst podrobněji v referenční dokumentaci k zprostředkovateli modulu runtime .NET.
--format {Chromium|NetTrace|Speedscope}
Nastaví výstupní formát pro převod trasovacích souborů. Výchozí hodnota je
NetTrace
.-n, --name <name>
Název procesu pro shromáždění trasování.
--diagnostic-port <path-to-port>
Název diagnostického portu, který se má vytvořit. Informace o použití této možnosti ke shromažďování trasování od spuštění aplikace najdete v tématu Použití diagnostického portu ke shromažďování trasování od spuštění aplikace.
--duration <time-to-run>
Čas spuštění trasování.
dd:hh:mm:ss
Použijte formát. Například00:00:00:05
se spustí po dobu 5 sekund.-o|--output <trace-file-path>
Výstupní cesta pro shromážděná data trasování. Pokud není zadána výchozí hodnota
<appname>_<yyyyMMdd>_<HHmmss>.nettrace
, například "myapp_20210315_111514.nettrace".-p|--process-id <PID>
ID procesu, ze které se má trasování shromáždit.
--profile <profile-name>
Pojmenovaná předem definovaná sada konfigurací zprostředkovatele, která umožňuje stručné zadání běžných scénářů trasování. K dispozici jsou následující profily:
Profil | Popis |
---|---|
cpu-sampling |
Užitečné pro sledování využití procesoru a obecné informace o modulu runtime .NET. Toto je výchozí možnost, pokud nejsou zadány žádné profily nebo zprostředkovatelé. |
gc-verbose |
Sleduje přidělení objektů a kolekcí uvolňování paměti. |
gc-collect |
Sleduje kolekce uvolňování paměti pouze při velmi nízké režii. |
--providers <list-of-comma-separated-providers>
Seznam poskytovatelů oddělených
EventPipe
čárkami, které se mají povolit. Tito poskytovatelé doplňují všechny poskytovatele odvozené .--profile <profile-name>
Pokud je pro konkrétního poskytovatele nějaká nekonzistence, má tato konfigurace přednost před implicitní konfigurací z profilu.Tento seznam poskytovatelů je ve formátu:
Provider[,Provider]
Provider
je ve formě:KnownProviderName[:Flags[:Level][:KeyValueArgs]]
.KeyValueArgs
je ve formě:[key1=value1][;key2=value2]
.
Další informace o některých známých poskytovatelích v .NET najdete v části Známé zprostředkovatele událostí.
-- <command>
(pro cílové aplikace se systémem .NET 5 nebo novějším)Po parametrech konfigurace kolekce může uživatel připojit
--
následovaný příkazem pro spuštění aplikace .NET s alespoň modulem runtime 5.0. To může být užitečné při diagnostice problémů, ke kterým dochází v rané fázi procesu, jako jsou problémy s výkonem při spuštění nebo zavaděč sestavení a chyby pořadače.Poznámka:
Tato možnost monitoruje první proces .NET, který komunikuje zpět s nástrojem, což znamená, že pokud váš příkaz spustí více aplikací .NET, bude shromažďovat pouze první aplikaci. Proto se doporučuje tuto možnost použít u samostatných aplikací nebo použití této
dotnet exec <app.dll>
možnosti.--show-child-io
Zobrazuje vstupní a výstupní datové proudy spuštěného podřízeného procesu v aktuální konzole.
--resume-runtime
Obnovení modulu runtime po inicializaci relace je výchozí hodnota true. Zakažte obnovení modulu runtime pomocí parametru --resume-runtime:false.
--stopping-event-provider-name
Řetězec, parsovaný tak, že zastaví trasování po dosažení události s odpovídajícím názvem zprostředkovatele. Pokud chcete konkrétnější událost zastavení, uveďte
--stopping-event-event-name
a/nebo--stopping-event-payload-filter
. Například--stopping-event-provider-name Microsoft-Windows-DotNETRuntime
zastavení trasování při dosažení první události, kterouMicrosoft-Windows-DotNETRuntime
vygeneruje poskytovatel události.--stopping-event-event-name
Řetězec, parsovaný tak, že zastaví trasování po dosažení události s odpovídajícím názvem události. Vyžaduje
--stopping-event-provider-name
nastavení. Pro konkrétnější událost zastavení navíc uveďte--stopping-event-payload-filter
. Například--stopping-event-provider-name Microsoft-Windows-DotNETRuntime --stopping-event-event-name Method/JittingStarted
zastavení trasování při dosažení prvníMethod/JittingStarted
události, kterouMicrosoft-Windows-DotNETRuntime
vygeneruje poskytovatel události.--stopping-event-payload-filter
Řetězec parsovaný jako [payload_field_name]:[payload_field_value] oddělené čárkami, který zastaví trasování při dosažení události obsahující všechny zadané páry datové části. Vyžaduje
--stopping-event-provider-name
a--stopping-event-event-name
musí být nastaven. Například--stopping-event-provider-name Microsoft-Windows-DotNETRuntime --stopping-event-event-name Method/JittingStarted --stopping-event-payload-filter MethodNameSpace:Program,MethodName:OnButtonClick
zastavení trasování při prvníMethod/JittingStarted
události pro metoduOnButtonClick
vProgram
oboru názvů generovaném poskytovatelemMicrosoft-Windows-DotNETRuntime
události.
Poznámka:
- Zastavení trasování může u velkých aplikací trvat delší dobu (až minuty). Modul runtime musí odesílat přes mezipaměť typů pro veškerý spravovaný kód zachycený v trasování.
- V Linuxu a macOS tento příkaz očekává cílovou aplikaci a
dotnet-trace
bude sdílet stejnou proměnnouTMPDIR
prostředí. Jinak vyprší časový limit příkazu.
- Pokud chcete shromáždit trasování pomocí
dotnet-trace
, musí být spuštěn jako stejný uživatel jako uživatel, který spouští cílový proces nebo jako kořen. Jinak se nástroj nepodaří navázat spojení s cílovým procesem.
- Pokud při spuštění
dotnet-trace collect
dojde k neošetřené výjimce, výsledkem je neúplné trasování. Pokud je vaší prioritou zjištění původní příčiny výjimky, přejděte do části Shromáždit výpisy stavu systému v případě chybového ukončení. V důsledku neošetřené výjimky se trasování zkrátí, když se modul runtime vypne, aby se zabránilo dalšímu nežádoucímu chování, jako je zablokování nebo poškození dat. I když je trasování neúplné, můžete ho přesto otevřít, abyste zjistili, co se stalo, což vedlo k selhání. Na konci trasování ale chybí informace o rundownu (k tomu dochází na konci trasování), takže zásobníky můžou být nevyřešeny (v závislosti na tom, jaké poskytovatele byly zapnuté). Spuštěním perfView s/ContinueOnError
příznakem na příkazovém řádku otevřete trasování. Protokoly budou obsahovat také umístění, ve které byla výjimka aktivována.
- Při zadávání události zastavení prostřednictvím
--stopping-event-*
možností, protože EventStream probíhá asynchronně, budou existovat některé události, které procházejí mezi časem, kdy se událost trasování odpovídající zadaným možnostem zastavení události parsuje a eventPipeSession se zastaví.
dotnet-trace convert
nettrace
Převede trasování na alternativní formáty pro použití s nástroji pro analýzu alternativních trasování.
Synopse
dotnet-trace convert [<input-filename>] [--format <Chromium|NetTrace|Speedscope>] [-h|--help] [-o|--output <output-filename>]
Argumenty
<input-filename>
Vstupní trasovací soubor, který se má převést. Výchozí hodnota je trace.nettrace.
Možnosti
--format <Chromium|NetTrace|Speedscope>
Nastaví výstupní formát pro převod trasovacích souborů.
-o|--output <output-filename>
Výstupní název souboru Přidá se rozšíření cílového formátu.
Poznámka:
Převod nettrace
souborů na chromium
soubory nebo speedscope
soubory je nevratný. speedscope
a chromium
soubory nemají všechny informace potřebné k rekonstrukci nettrace
souborů. convert
Příkaz však zachová původní nettrace
soubor, takže ho neodstraňovat, pokud ho budete chtít otevřít v budoucnu.
dotnet-trace ps
Obsahuje seznam procesů dotnet, ze které lze shromažďovat trasování.
dotnet-trace
6.0.320703 a novější zobrazte také argumenty příkazového řádku, se kterými byly jednotlivé procesy spuštěny, pokud jsou k dispozici.
Poznámka:
Pokud chcete získat úplné informace pro výčet 64bitových procesů, musíte použít 64bitovou verzi dotnet-trace
nástroje.
Synopse
dotnet-trace ps [-h|--help]
Příklad
Předpokládejme, že spustíte dlouhotrvající aplikaci pomocí příkazu dotnet run --configuration Release
. V jiném okně spustíte dotnet-trace ps
příkaz. Výstup, který uvidíte, je následující. Argumenty příkazového řádku, pokud jsou k dispozici, se zobrazují ve dotnet-trace
verzi 6.0.320703 a novější.
> dotnet-trace ps
21932 dotnet C:\Program Files\dotnet\dotnet.exe run --configuration Release
36656 dotnet C:\Program Files\dotnet\dotnet.exe
dotnet-trace list-profiles
Uvádí předem vytvořené profily trasování s popisem, jaké zprostředkovatele a filtry jsou v jednotlivých profilech.
Synopse
dotnet-trace list-profiles [-h|--help]
dotnet-trace report
Vytvoří sestavu do stdoutu z dříve vygenerovaného trasování.
Synopse
dotnet-trace report [-h|--help] <tracefile> [command]
Argumenty
<tracefile>
Cesta k souboru analyzovaného trasování.
Příkazy
dotnet-trace report topN
Vyhledá horní N metody, které byly v náznamku volání nejdelší.
Synopse
dotnet-trace report <tracefile> topN [-n|--number <n>] [--inclusive] [-v|--verbose] [-h|--help]
Možnosti
-n|--number <n>
Dává horní N metody na volání.
--inclusive
Výstup hlavních N metod založených na inkluzivním čase Pokud nezadáte, použije se ve výchozím nastavení výhradní čas.
-v|--verbose
Vypište parametry každé metody v plném rozsahu. Pokud není zadáno, parametry budou zkráceny.
Shromáždění trasování pomocí dotnet-trace
Shromažďování trasování pomocí dotnet-trace
:
Získejte identifikátor procesu (PID) aplikace .NET Core, ze které se shromažďují trasování.
- Ve Windows můžete například použít Správce úloh nebo
tasklist
příkaz. - Například v Linuxu příkaz
ps
. - dotnet-trace ps
- Ve Windows můžete například použít Správce úloh nebo
Spusťte následující příkaz:
dotnet-trace collect --process-id <PID>
Předchozí příkaz generuje výstup podobný následujícímu:
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)
Zastavte shromažďování stisknutím klávesy
<Enter>
.dotnet-trace
dokončí protokolování událostí do souboru trace.nettrace .
Spuštění podřízené aplikace a shromáždění trasování ze spuštění pomocí dotnet-trace
Někdy může být užitečné shromáždit trasování procesu od jeho spuštění. U aplikací, na kterých běží .NET 5 nebo novější, je to možné provést pomocí dotnet-trace.
Tím se spustí hello.exe
arg1
argumenty příkazového řádku a arg2
shromáždí se trasování z spuštění modulu runtime:
dotnet-trace collect -- hello.exe arg1 arg2
Předchozí příkaz generuje výstup podobný následujícímu:
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...
Trasování můžete zastavit stisknutím nebo <Ctrl + C>
klávesou<Enter>
. Tím dojde také k ukončení hello.exe
.
Poznámka:
hello.exe
Spuštění přes dotnet-trace přesměruje jeho vstup/výstup a ve výchozím nastavení s ním nebudete moct pracovat v konzole. --show-child-io
Pomocí přepínače můžete pracovat s jeho stdin/stdout.
Ukončení nástroje pomocí kombinace kláves CTRL+C nebo SIGTERM bezpečně ukončí nástroj i podřízený proces.
Pokud se podřízený proces ukončí před nástrojem, nástroj se ukončí a trasování by mělo být bezpečně zobrazitelné.
Shromažďování trasování ze spuštění aplikace pomocí diagnostického portu
Diagnostický port je funkce modulu runtime přidaná v .NET 5, která umožňuje spustit trasování od spuštění aplikace. K tomu dotnet-trace
můžete použít buď použití dotnet-trace collect -- <command>
, jak je popsáno v příkladech výše, nebo použít --diagnostic-port
možnost.
Použití dotnet-trace <collect|monitor> -- <command>
ke spuštění aplikace jako podřízeného procesu je nejjednodušší způsob, jak rychle trasovat aplikaci od jejího spuštění.
Pokud ale chcete získat přehlednější kontrolu nad životností aplikace, která se sleduje (například monitorujte aplikaci pouze po dobu prvních 10 minut a pokračujte v provádění), nebo pokud potřebujete pracovat s aplikací pomocí rozhraní příkazového řádku, můžete pomocí --diagnostic-port
možnosti řídit jak monitorovanou dotnet-trace
cílovou aplikaci, tak i .
Následující příkaz vytvoří
dotnet-trace
diagnostický soket s názvemmyport.sock
a počká na připojení.dotnet-trace collect --diagnostic-port myport.sock
Výstup:
Waiting for connection on myport.sock Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sock
V samostatné konzole spusťte cílovou aplikaci s proměnnou
DOTNET_DiagnosticPorts
prostředí nastavenou na hodnotu ve výstupudotnet-trace
.export DOTNET_DiagnosticPorts=/home/user/myport.sock ./my-dotnet-app arg1 arg2
To by pak mělo umožnit
dotnet-trace
spuštění trasovánímy-dotnet-app
: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.
Důležité
Spuštění aplikace
dotnet run
pomocí aplikace může být problematické, protože rozhraní příkazového řádku dotnet může vytvořit mnoho podřízených procesů, které nejsou vaší aplikací, a můžou se připojitdotnet-trace
před aplikací a nechat aplikaci pozastavenou za běhu. Doporučujeme přímo použít samostatnou verzi aplikace nebo ji spustitdotnet exec
.
Zobrazení trasování zachyceného z dotnet-trace
Ve Windows můžete zobrazit soubory .nettrace v sadě Visual Studio nebo PerfView pro účely analýzy.
V Linuxu můžete trasování zobrazit změnou výstupního dotnet-trace
formátu na speedscope
. Pomocí této možnosti změňte formát výstupního -f|--format
souboru. Můžete si vybrat mezi nettrace
(výchozí možností) a speedscope
. Tato možnost -f speedscope
vytvoří dotnet-trace
speedscope
soubor. Speedscope
soubory lze otevřít na adrese https://www.speedscope.app.
U trasování shromážděných na platformách jiných než Windows můžete trasovací soubor přesunout do počítače s Windows a zobrazit ho v sadě Visual Studio nebo PerfView.
Poznámka:
Modul runtime .NET Core generuje trasování ve nettrace
formátu. Trasování se po dokončení trasování převede na speedscope (pokud je zadáno). Vzhledem k tomu, že některé převody můžou vést ke ztrátě dat, původní nettrace
soubor se zachová vedle převedeného souboru.
Použití souboru .rsp k tomu, abyste se vyhnuli psaní dlouhých příkazů
Můžete spustit dotnet-trace
soubor .rsp
, který obsahuje argumenty, které se mají předat. To může být užitečné při povolování poskytovatelů, kteří očekávají dlouhé argumenty, nebo při použití prostředí prostředí, které odstraní znaky.
Například následující poskytovatel může být těžkopádný k zadání pokaždé, když chcete trasovat:
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
Předchozí příklad navíc obsahuje "
jako součást argumentu. Vzhledem k tomu, že uvozovky se nezpracují rovnoměrně v jednotlivých prostředích, můžete při používání různých prostředí zaznamenat různé problémy. Například příkaz, který zsh
se má zadat, se liší od příkazu v cmd
.
Místo toho, abyste tento text pokaždé zapisovat, můžete uložit následující text do souboru s názvem myprofile.rsp
.
--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
Po uložení myprofile.rsp
můžete s touto konfigurací spustit dotnet-trace
pomocí následujícího příkazu:
dotnet-trace @myprofile.rsp