Sdílet prostřednictvím


EventPipe

EventPipe je komponenta modulu runtime, kterou lze použít ke shromažďování dat trasování, podobně jako ETW nebo perf_events. Cílem eventPipe je umožnit vývojářům platformy .NET snadné trasování aplikací .NET, aniž by museli spoléhat na komponenty s vysokou úrovní oprávnění specifické pro platformu, jako jsou ETW nebo perf_events.

EventPipe je mechanismus za mnoha diagnostickými nástroji a lze ho použít k využívání událostí generovaných modulem runtime i vlastních událostí zapsaných pomocí EventSource.

Tento článek je přehledem vysoké úrovně o EventPipe. Popisuje, kdy a jak používat EventPipe a jak ho nakonfigurovat tak, aby co nejlépe vyhovoval vašim potřebám.

Základy eventPipe

EventPipe agreguje události generované komponentami modulu runtime – například kompilátor Just-In-Time nebo garbage collector – a události zapsané z instancí EventSource v knihovnách a uživatelském kódu.

Události se pak serializují ve .nettrace formátu souboru a lze je zapsat přímo do souboru nebo streamovat přes diagnostický port pro spotřebu mimo proces.

Další informace o formátu NetTrace najdete v dokumentaci k formátu NetTrace.

Porovnání EventPipe a ETW/perf_events (nástroje pro sledování událostí)

EventPipe je součástí modulu runtime .NET a je navržený tak, aby fungoval stejným způsobem napříč všemi platformami, které podporuje .NET Core. Díky tomu mohou nástroje pro trasování založené na EventPipe, jako například dotnet-counters, dotnet-gcdump a dotnet-trace, bezproblémově fungovat na různých platformách.

Vzhledem k tomu, že EventPipe je předdefinovaná komponenta modulu runtime, je jeho obor omezen na spravovaný kód a samotný modul runtime. Bez jiných nástrojů pro trasování události EventPipe zahrnují trasování zásobníku pouze s informacemi o rámci spravovaného kódu. Pokud chcete získat události z jiných nespravovaných knihoven uživatelského režimu, vzorkování procesoru pro nativní kód nebo události jádra, použijte nástroje pro trasování specifické pro operační systém, jako je Trasování událostí pro Windows nebo perf_events. Nástroj perfcollect v Linuxu pomáhá automatizovat pomocí perf_events a LTTng.

Počínaje rozhraním .NET 10 může EventPipe v Linuxu generovat události jako user_events, což umožňuje shromažďování spravovaných událostí, událostí operačního systému nebo jádra a nativních zásobníků volání v jednom sjednocené trasování. Tento režim vyžaduje oprávnění správce nebo root a jádro Linuxu 6.4 a novější. Další informace najdete na webu dotnet-trace collect-linux.

Dalším významným rozdílem mezi EventPipe a ETW/perf_events je požadavek na oprávnění správce/root. Pokud chcete sledovat aplikaci pomocí Trasování událostí pro Windows nebo perf_events, musíte být administrátorem nebo rootem. Pomocí standardního eventPipe můžete trasovat aplikace, pokud je tracer (například dotnet-trace) spuštěný jako stejný uživatel jako uživatel, který aplikaci spustil. Režim EventPipe (user_events) popsaný dříve vyžaduje oprávnění správce nebo root oprávnění, protože interaguje s trasovací infrastrukturou na úrovni OS.

Následující tabulka obsahuje souhrn rozdílů mezi událostmi EventPipe a ETW/perf_events.

Funkce EventPipe EventPipe (user_events) Trasování událostí pro Windows výkonové události
Multiplatformní Ano Ne (pouze u podporovaných distribucí Linuxu) Ne (jenom ve Windows) Ne (pouze u podporovaných distribucí Linuxu)
Vyžadování oprávnění správce nebo root oprávnění Ne Ano Ano Ano
Může získat události operačního systému nebo jádra Ne Ano Ano Ano
Dokáže vyřešit nativní zásobníky volání Ne Ano Ano Ano

Trasování aplikace .NET pomocí EventPipe

EventPipe můžete použít k trasování aplikace .NET mnoha způsoby:

Po vytvoření souboru nettrace, který obsahuje události EventPipe, můžete tento soubor zobrazit v nástroji PerfView nebo v sadě Visual Studio. Na ne-Windows platformách můžete převést soubor nettrace do speedscope nebo Chromium formátu trasování pomocí příkazu dotnet-trace convert a zobrazit ho pomocí speedscope nebo Chrome DevTools.

Trasování EventPipe můžete analyzovat také programově pomocí TraceEventu.

Nástroje, které používají EventPipe

Toto je nejjednodušší způsob, jak pomocí eventPipe trasovat aplikaci. Další informace o tom, jak jednotlivé nástroje používat, najdete v dokumentaci jednotlivých nástrojů.

Trasování pomocí proměnných prostředí

Upřednostňovaným mechanismem pro použití eventPipe je použití dotnet-trace nebo knihovny Microsoft.Diagnostics.NETCore.Client .

Následující proměnné prostředí ale můžete použít k nastavení relace EventPipe v aplikaci a k zápisu trasování přímo do souboru. Pokud chcete trasování zastavit, ukončete aplikaci.

  • DOTNET_EnableEventPipe: Nastavte 1 pro spuštění relace EventPipe, která zapisuje přímo do souboru. Výchozí hodnota je 0.

  • DOTNET_EventPipeOutputPath: Cesta k výstupnímu trasovacímu souboru EventPipe, když je nakonfigurovaná tak, aby běžela přes DOTNET_EnableEventPipe. Výchozí hodnota je trace.nettrace, která se vytvoří ve stejném adresáři, ze kterého aplikace běží.

    Poznámka:

    Od verze .NET 6 jsou instance řetězce {pid} v DOTNET_EventPipeOutputPath nahrazeny ID sledovaného procesu.

  • DOTNET_EventPipeCircularMB: Šestnáctková hodnota, která udává velikost interního zásobníku EventPipe v megabajtech. Tato hodnota konfigurace se používá pouze v případě, že je eventPipe nakonfigurovaný tak, aby běžel přes DOTNET_EnableEventPipe. Výchozí velikost vyrovnávací paměti je 1024 MB, která se překládá na tuto proměnnou prostředí nastavenou na 400, protože0x400 == 1024 .

    Poznámka:

    Pokud cílový proces zapisuje události příliš často, může tato vyrovnávací paměť přetéct a některé události mohou být vynechány. Pokud se zahodí příliš mnoho událostí, zvětšete velikost vyrovnávací paměti, abyste zjistili, jestli se počet vynechaných událostí snižuje. Pokud se počet vynechaných událostí nezmenší s větší velikostí vyrovnávací paměti, může to být způsobeno pomalým čtenářem, který brání v vyprázdnění vyrovnávací paměti cílového procesu.

  • DOTNET_EventPipeProcNumbers: Nastavte toto na 1 pro povolení zachytávání čísel procesorů v hlavičkách událostí EventPipe. Výchozí hodnota je 0.

  • DOTNET_EventPipeConfig: Nastaví konfiguraci relace EventPipe při spuštění relace EventPipe s DOTNET_EnableEventPipe. Syntaxe je následující:

    <provider>:<keyword>:<level>

    Můžete také zadat více poskytovatelů tak, že je oddělíte čárkou:

    <provider1>:<keyword1>:<level1>,<provider2>:<keyword2>:<level2>

    Pokud tato proměnná prostředí není nastavená, ale EventPipe je povoleno prostřednictvím DOTNET_EnableEventPipe, zahájí se trasování povolením následujících poskytovatelů se zadanými klíčovými slovy a úrovněmi:

    • Microsoft-Windows-DotNETRuntime:4c14fccbd:5
    • Microsoft-Windows-DotNETRuntimePrivate:4002000b:5
    • Microsoft-DotNETCore-SampleProfiler:0:5

    Další informace o některých známých poskytovatelích v .NET obraťte se na Známí poskytovatelé událostí.