nástroj dotnet-trace performance analysis
Tento článek se týká: ✔️ .NET Core 3.0 SDK a novějších verzí
Instalace
Existují dva způsoby, jak stáhnout a nainstalovat dotnet-trace :
dotnet global tool:
K instalaci nejnovější verze balíčku
dotnet-traceNuGet použijtepříkaz dotnet tool install:dotnet tool install --global dotnet-tracePřímé stažení:
Stáhněte si spustitelný soubor nástroje, který odpovídá vaší platformě:
Operační systém Platforma Windows x86 | x64 | arm (arm) | arm-x64 macOS x64 Linux x64 | arm (arm) | arm64 | musl-x64 | musl-arm64
Poznámka
K dotnet-trace použití v aplikaci x86 potřebujete odpovídající verzi nástroje x86.
Synopse
dotnet-trace [-h, --help] [--version] <command>
Description
dotnet-traceNástroj:
- Je nástroj .NET Core pro více platforem.
- Povolí kolekci trasování .NET Core spuštěného procesu bez nativního profileru.
- Je postaven na
EventPipemodulu runtime .NET Core. - Zajišťuje stejné prostředí v Windows, Linuxu nebo macOS.
Možnosti
-h|--helpZobrazí nápovědu k příkazovému řádku.
--versionZobrazí verzi nástroje dotnet-trace.
Příkazy
| Příkaz |
|---|
| dotnet-trace collect |
| dotnet-trace convert |
| dotnet-trace ps |
| dotnet-trace list-profiles |
dotnet-trace collect
Shromažďuje diagnostické trasování ze spuštěného procesu nebo spustí podřízený proces a trasuje ho (pouze .NET 5+). Pokud chcete, aby nástroj spouštěl podřízený proces a trasoval ho od 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]
[-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)
Možnosti
--buffersize <size>Nastaví velikost kruhové vyrovnávací paměti v megabajtech. Výchozí hodnota je 256 MB.
Poznámka
Pokud cílový proces zapisuje události příliš často, může tuto vyrovnávací paměť přetéct a některé události můžou být zahozeny. Pokud dochází k vyřazení příliš velikosti událostí, zvětšete velikost vyrovnávací paměti, abyste viděli, jestli se počet vyřazených událostí sníží. Pokud se počet vyřazených událostí s větší velikostí vyrovnávací paměti nesnítí, může to být způsobeno pomalým čtenářem, který brání vyprázdnění vyrovnávacích pamětí cílového procesu.
--clreventlevel <clreventlevel>Podrobné informace o událostech CLR, které se budou generovat.
--clrevents <clrevents>Seznam klíčových slov zprostředkovatele modulu runtime MODULU CLR, aby bylo možné je oddělit
+znaky. Toto je jednoduché mapování, které umožňuje zadat klíčová slova událostí prostřednictvím aliasů řetězců místo šestnáctových hodnot. Napříkladdotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:3:4vyžádá stejnou sadu událostí jakodotnet-trace collect --clrevents gc+gchandle --clreventlevel informational. Následující tabulka obsahuje seznam dostupných klíčových slov:Alias řetězce klíčového slova Šestnáctková hodnota klíčového slova gc0x1gchandle0x2fusion0x4loader0x8jit0x10ngen0x20startenumeration0x40endenumeration0x80security0x400appdomainresourcemanagement0x800jittracing0x1000interop0x2000contention0x4000exception0x8000threading0x10000jittedmethodiltonativemap0x20000overrideandsuppressngenevents0x40000type0x80000gcheapdump0x100000gcsampledobjectallocationhigh0x200000gcheapsurvivalandmovement0x400000gcheapcollect0x800000gcheapandtypenames0x1000000gcsampledobjectallocationlow0x2000000perftrack0x20000000stack0x40000000threadtransfer0x80000000debugger0x100000000monitoring0x200000000codesymbols0x400000000eventsource0x800000000compilation0x1000000000compilationdiagnostic0x2000000000methoddiagnostic0x4000000000typediagnostic0x8000000000Podrobnější informace o poskytovateli modulu CLR najdete v referenční dokumentaci k poskytovateli modulu runtime .NET.
--format {Chromium|NetTrace|Speedscope}Nastaví výstupní formát pro převod trasovacího souboru. Výchozí formát je
NetTrace.-n, --name <name>Název procesu, ze které se má trasování shromažďovat.
--diagnostic-port <path-to-port>Název portu diagnostiky, který se má vytvořit. Informace o použití této možnosti ke shromažďování trasování ze spuštění aplikace najdete v tématu Použití diagnostického portu ke shromažďování trasování ze spuštění aplikace.
-o|--output <trace-file-path>Výstupní cesta pro shromážděná data trasování. Pokud není zadaný, výchozí hodnota je
trace.nettrace.-p|--process-id <PID>ID procesu, ze které se má trasování shromažďovat.
--profile <profile-name>Pojmenovaná předdefinované sady konfigurací zprostředkovatele, která umožňuje stručné nastavení běžných scénářů trasování. K dispozici jsou následující profily:
| Profil | Description |
|---|---|
cpu-sampling |
Užitečné ke sledování využití procesoru a obecných informací o modulu runtime .NET. Toto je výchozí možnost, pokud není zadaný žádný profil nebo poskytovatelé. |
gc-verbose |
Sleduje kolekce uvolňování paměti a ukázky přidělení objektů. |
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, které implikuje--profile <profile-name>. Pokud u určitého zprostředkovatele dojde k nějaké nekonzistence, má tato konfigurace přednost před implicitní konfigurací z profilu.Tento seznam zprostředkovatelů má následující podobu:
Provider[,Provider]Providermá tvar:KnownProviderName[:Flags[:Level][:KeyValueArgs]].KeyValueArgsmá tvar:[key1=value1][;key2=value2].
Další informace o některých známých poskytovatelích v .NET najdete v tématu Známé zprostředkovatele událostí.
-- <command>(jenom pro cílové aplikace s .NET 5)Po parametrech konfigurace kolekce může uživatel připojit následovaný příkazem, který spustí aplikaci .NET s minimálně
--5.0 runtime. To může být užitečné při diagnostice problémů, ke které dochází v rané fázi procesu, jako je například problém s výkonem při spuštění nebo chyby zavaděče sestavení a vázání.Poznámka
Tato možnost monitoruje první proces rozhraní .NET 5, který komunikuje zpět s nástrojem, což znamená, že pokud příkaz spustí více aplikací .NET, shromáždí pouze první aplikaci. Proto doporučujeme použít tuto možnost u samostatných aplikací nebo pomocí
dotnet exec <app.dll>možnosti .--show-child-ioZobrazuje vstupní a výstupní datové proudy spuštěného podřízeného procesu v aktuální konzole.
Poznámka
Zastavení trasování může u velkých aplikací trvat dlouhou dobu (až minuty). Modul runtime musí odesílat přes mezipaměť typů pro veškerý spravovaný kód, který byl zachycen v trasování.
Poznámka
V Linuxu a macOS tento příkaz očekává cílovou aplikaci a sdílí dotnet-trace stejnou TMPDIR proměnnou prostředí. Jinak příkaz časový limit limitu.
Poznámka
Pokud chcete shromažďovat trasování pomocí , musí se spustit jako stejný uživatel jako uživatel, který spustí cílový dotnet-trace proces, nebo jako uživatel root. Jinak nástroji nepodaří navázat připojení k cílovému procesu.
Poznámka
Pokud se zobrazí chybová zpráva podobná následující zprávě: , pokoušíte se použít , která má neshodu bitnosti s [ERROR] System.ComponentModel.Win32Exception (299): A 32 bit processes cannot access modules of a 64 bit process. dotnet-trace cílovým procesem. Nezapomeňte stáhnout správnou bitovou kopii nástroje na instalačním odkazu.
dotnet-trace convert
Převede trasování nettrace do alternativních formátů pro použití s alternativními nástroji pro analýzu 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ího souboru.
-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 nebo je speedscope nevratný. speedscope Soubory chromium a nemají všechny informace potřebné k rekonstrukci nettrace souborů. Příkaz ale zachová původní soubor, takže pokud ho budete v budoucnu v plánu otevřít, tento soubor convert nettrace neodstraňovat.
dotnet-trace ps
Obsahuje seznam procesů dotnet, ze které je možné shromažďovat trasování.
Synopse
dotnet-trace ps [-h|--help]
dotnet-trace list-profiles
Uvádí předem vytvořené profily trasování s popisem poskytovatelů a filtrů v jednotlivých profilech.
Synopse
dotnet-trace list-profiles [-h|--help]
Shromažďová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í.
- Na Windows můžete použít Správce úloh nebo příkaz
tasklist. - V Linuxu například příkaz
ps. - dotnet-trace ps
- Na Windows můžete použít Správce úloh nebo příkaz
Spusťte následující příkaz:
dotnet-trace collect --process-id <PID>Předchozí příkaz vygeneruje 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)Stisknutím klávesy zastavte
<Enter>shromažďování.dotnet-tracedokončí 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í příkazu dotnet-trace
Důležité
To funguje jenom pro aplikace s .NET 5 nebo novějším.
Někdy může být užitečné shromáždit trasování procesu z jeho spuštění. U aplikací se systémem .NET 5 nebo novějším je možné to provést pomocí příkazu dotnet-trace.
Spustí se s argumenty příkazového řádku hello.exe arg1 a a arg2 shromáždí trasování ze spuštění modulu runtime:
dotnet-trace collect -- hello.exe arg1 arg2
Předchozí příkaz vygeneruje 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...
Shromažďování trasování můžete zastavit stisknutím <Enter> klávesy <Ctrl + C> nebo . Tím také ukončíte hello.exe příkaz .
Poznámka
Spuštění prostřednictvím příkazu dotnet-trace přesměruje jeho vstup/výstup a ve výchozím nastavení s ním nebudete moct v konzole hello.exe pracovat. Pomocí přepínače --show-child-io můžete pracovat s jeho stdin/stdout.
Ukončením nástroje pomocí CTRL+C nebo SIGTERM se nástroj i podřízený proces bezpečně ukončí.
Pokud se podřízený proces ukončí před nástrojem, nástroj se také ukončí a trasování by mělo být bezpečně zobrazitelné.
Použití diagnostického portu ke shromažďování trasování ze spuštění aplikace
Důležité
To funguje jenom pro aplikace s .NET 5 nebo novějším.
Diagnostický port je nová funkce modulu runtime, která byla přidána do rozhraní .NET 5 a umožňuje spustit trasování ze spuštění aplikace. Pokud to chcete provést dotnet-trace pomocí , můžete použít buď , jak je popsáno v dotnet-trace collect -- <command> příkladech výše, nebo použít --diagnostic-port možnost .
Použití ke spuštění aplikace jako podřízeného procesu je nejjednodušší způsob, jak aplikaci rychle dotnet-trace <collect|monitor> -- <command> vysledovat od jejího spuštění.
Pokud ale chcete získat jemnější kontrolu nad životností sledované aplikace (například monitorovat aplikaci pouze po dobu prvních 10 minut a pokračovat v provádění), nebo pokud potřebujete s aplikací pracovat pomocí rozhraní příkazového řádku, pomocí možnosti můžete řídit jak monitorovanou cílovou aplikaci, tak --diagnostic-port dotnet-trace i .
Následující příkaz vytvoří
dotnet-tracediagnostický soket s názvem amyport.sockpočká na připojení.dotnet-trace collect --diagnostic-port myport.sockVýstup:
Waiting for connection on myport.sock Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sockV samostatné konzole spusťte cílovou aplikaci s proměnnou prostředí nastavenou
DOTNET_DiagnosticPortsna hodnotu vedotnet-tracevýstupu.export DOTNET_DiagnosticPorts=/home/user/myport.sock ./my-dotnet-app arg1 arg2Tím by se mělo povolit
dotnet-tracespuštěnímy-dotnet-apptrasování: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 pomocí 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 mohou se připojit k před vaší aplikací a nechat aplikaci pozastavenou
dotnet rundotnet-traceza běhu. Doporučuje se použít přímo samostatnou verzi aplikace nebo použít kedotnet execspuštění aplikace.
Zobrazení trasování zachyceného z dotnet-trace
V Windows nástroje PerfView je možné zobrazit soubory .nettrace pro analýzu: V případě trasování shromážděných na jiných platformách je možné trasovací soubor přesunout na počítač Windows, který chcete zobrazit v nástroji PerfView.
V Linuxu je možné trasování zobrazit změnou výstupního formátu dotnet-trace na speedscope . Formát výstupního souboru lze změnit pomocí -f|--format možnosti – -f speedscope vytvoří dotnet-trace speedscope soubor. Můžete si vybrat mezi nettrace (výchozí možnost) a speedscope . Speedscope Soubory je možné otevřít na adrese https://www.speedscope.app .
Poznámka
Modul runtime .NET Core generuje trasování ve nettrace formátu . Trasování se po dokončení trasování převedou na speedscope (pokud je zadáno). Vzhledem k tomu, že některé převody mohou vést ke ztrátě dat, původní soubor se zachová nettrace vedle převedeného souboru.
Použití dotnet-trace ke shromažďování hodnot čítačů v průběhu času
dotnet-trace Cna:
- Slouží
EventCounterk základnímu monitorování stavu v prostředích citlivých na výkon. Například v produkčním prostředí. - Shromáždí trasování, aby se v reálném čase nemusí prohlížet.
Pokud například chcete shromažďovat hodnoty čítače výkonu modulu runtime, použijte následující příkaz:
dotnet-trace collect --process-id <PID> --providers System.Runtime:0:1:EventCounterIntervalSec=1
Předchozí příkaz říká čítačům modulu runtime, aby každou sekundu hlásit zjednodušené monitorování stavu. Nahrazení EventCounterIntervalSec=1 vyšší hodnotou (například 60) umožňuje shromažďování menšího trasování s menší členitostí v datech čítače.
Následující příkaz snižuje režii a velikost trasování více než předchozí příkaz:
dotnet-trace collect --process-id <PID> --providers System.Runtime:0:1:EventCounterIntervalSec=1,Microsoft-Windows-DotNETRuntime:0:1,Microsoft-DotNETCore-SampleProfiler:0:1
Předchozí příkaz zakáže události modulu runtime a profiler spravovaného zásobníku.
Pokud se chcete vyhnout psaní dlouhých příkazů, použijte soubor .rsp.
Můžete spustit dotnet-trace se .rsp souborem, který obsahuje argumenty, které se mají předat. To může být užitečné při povolování zprostředkovatelů, kteří očekávají dlouhé argumenty, nebo při použití prostředí, které prokládá 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
Kromě toho předchozí příklad obsahuje " jako součást argumentu . Vzhledem k tomu, že uvozovky nejsou zpracovávány stejným způsobem v jednotlivých prostředích, může při použití různých prostředí dojít k různým problémům. Například příkaz pro zadání se zsh liší od příkazu v souboru cmd .
Místo toho, abyste tento text zadávat pokaždé, 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í můžete spustit myprofile.rsp s touto konfigurací pomocí dotnet-trace následujícího příkazu:
dotnet-trace @myprofile.rsp