Megosztás:


EventPipe

Az EventPipe egy futtatókörnyezeti összetevő, amely az ETW-hez vagy perf_events hasonló nyomkövetési adatok gyűjtésére használható. Az EventPipe célja, hogy a .NET-fejlesztők egyszerűen nyomon követhessék a .NET-alkalmazásaikat anélkül, hogy platformspecifikus, magas jogosultságú összetevőkre, például az ETW-ra vagy perf_events kellene támaszkodniuk.

Az EventPipe számos diagnosztikai eszköz mögötti mechanizmus, amely a futtatókörnyezet által kibocsátott események, valamint az EventSource-nal írt egyéni események felhasználására használható.

Ez a cikk az EventPipe magas szintű áttekintését ismerteti. Leírja, hogy mikor és hogyan használhatja az EventPipe-et, és hogyan konfigurálhatja az igényeinek leginkább megfelelőre.

Az EventPipe alapjai

Az EventPipe összesíti a futtatókörnyezet összetevői által kibocsátott eseményeket – például a Just-In-Time fordítót vagy a szemétgyűjtőt –, valamint az EventSource-példányokból a kódtárakban és a felhasználói kódban írt eseményeket.

Az események ezután fájlformátumban .nettrace szerializálódnak, és közvetlenül egy fájlba írhatók, vagy egy diagnosztikai porton keresztül streamelhetők folyamaton kívüli felhasználás céljából.

A NetTrace formátummal kapcsolatos további információkért tekintse meg a NetTrace formátum dokumentációját.

EventPipe és ETW/perf_events

Az EventPipe a .NET-futtatókörnyezet része, és úgy lett kialakítva, hogy a .NET Core által támogatott platformokon is ugyanúgy működjön. Ez lehetővé teszi, hogy az EventPipe-alapú nyomkövetési eszközök, például dotnet-countersaz , dotnet-gcdumpés dotnet-trace, zökkenőmentesen működjenek a platformokon.

Mivel azonban az EventPipe egy beépített futtatókörnyezeti összetevő, hatóköre a felügyelt kódra és magára a futtatókörnyezetre korlátozódik. Az EventPipe-események csak felügyelt kódkeret-információkkal rendelkező stacktraceket tartalmaznak. Ha más nem felügyelt felhasználói módú kódtárakból, a natív kódhoz tartozó CPU-mintavételezésből vagy kerneleseményekből szeretne eseményeket generálni, akkor operációsrendszer-specifikus nyomkövetési eszközöket, például ETW-t vagy perf_events kell használnia. Linuxon a perfcollect eszköz segít automatizálni perf_events és LTTng használatával.

Az EventPipe és az ETW/perf_events között egy másik jelentős különbség a rendszergazdai/gyökérjogjoggal rendelkező jogosultsági követelmény. Egy alkalmazás ETW vagy perf_events használatával történő nyomon követéséhez rendszergazdai/gyökérszintűnek kell lennie. Az EventPipe használatával mindaddig nyomon követheti az alkalmazásokat, amíg a jelölő (például ) ugyanazzal a felhasználóval fut, dotnet-tracemint az alkalmazást elindító felhasználó.

Az alábbi táblázat az EventPipe és az ETW/perf_events közötti különbségek összegzését tartalmazza.

Szolgáltatás EventPipe ETW teljesítmény események (perf_events)
Platformfüggetlen Igen Nem (csak Windows rendszeren) Nem (csak támogatott Linux-disztribúciók esetében)
Rendszergazdai/gyökérszintű jogosultság megkövetelése Nem Igen Igen
Rendszer-/kernelesemények lekérése Nem Igen Igen
Natív híváshívások feloldása Nem Igen Igen

A .NET-alkalmazás nyomon követése az EventPipe használatával

Az EventPipe használatával többféleképpen is nyomon követheti a .NET-alkalmazást:

Miután létrehozott egy nettrace olyan fájlt, amely tartalmazza az EventPipe-eseményeket, megtekintheti a fájlt a PerfView-ban vagy a Visual Studióban. A nem Windows-platformokon a dotnet-trace convert paranccsal konvertálhatja a nettrace fájlt speedscope egy vagy Chromium több nyomkövetési formátumba, és megtekintheti a speedscope vagy a Chrome DevTools használatával.

Az EventPipe-nyomkövetéseket programozott módon is elemezheti a TraceEvent használatával.

EventPipe-et használó eszközök

Ez a legegyszerűbb módja annak, hogy az EventPipe használatával nyomon kövesse az alkalmazást. Ha többet szeretne megtudni az egyes eszközök használatáról, tekintse meg az egyes eszközök dokumentációját.

  • A dotnet-counters lehetővé teszi a .NET-futtatókörnyezet és az alapvető kódtárak által kibocsátott különböző metrikák, valamint az írható egyéni metrikák monitorozását és gyűjtését.

  • A dotnet-gcdump lehetővé teszi az alkalmazások felügyelt halomapjának elemzésére szolgáló élő folyamatok GC-halomképeinek gyűjtését.

  • A dotnet-trace lehetővé teszi az alkalmazások nyomon követését a teljesítmény elemzéséhez.

Nyomkövetés környezeti változók használatával

Az EventPipe használatának elsődleges mechanizmusa a dotnet-trace vagy a Microsoft.Diagnostics.NETCore.Client kódtár használata.

Az alábbi környezeti változókkal azonban beállíthat egy EventPipe-munkamenetet egy alkalmazásban, és közvetlenül egy fájlba írhatja a nyomkövetést. A nyomkövetés leállításához lépjen ki az alkalmazásból.

  • DOTNET_EnableEventPipe: Ezt úgy állíthatja be, 1 hogy elindítson egy olyan EventPipe-munkamenetet, amely közvetlenül egy fájlba ír. Az alapértelmezett érték 0.

  • DOTNET_EventPipeOutputPath: A kimeneti EventPipe nyomkövetési fájl elérési útja, ha konfigurálva van a futtatásra DOTNET_EnableEventPipe. Az alapértelmezett érték az trace.nettrace, amely ugyanabban a könyvtárban lesz létrehozva, amelyből az alkalmazás fut.

    Feljegyzés

    A .NET 6 óta a beszúrt {pid} sztringpéldányok DOTNET_EventPipeOutputPath helyébe a nyomkövetés alatt álló folyamat folyamatazonosítója kerül.

  • DOTNET_EventPipeCircularMB: Hexadecimális érték, amely megabájtban jelöli az EventPipe belső pufferének méretét. Ezt a konfigurációs értéket csak akkor használja a rendszer, ha az EventPipe konfigurálva van a futtatásra DOTNET_EnableEventPipe. Az alapértelmezett pufferméret 1024 MB, amely ennek a környezeti változónak a beállítását 400jelenti, mivel0x400 == 1024 .

    Feljegyzés

    Ha a célfolyamat túl gyakran ír eseményeket, túlcsordulhat a puffer, és egyes események elvethetők. Ha túl sok eseményt ejtett el, növelje a puffer méretét, hogy lássa, csökken-e az elvetett események száma. Ha az eldobott események száma nem csökken nagyobb puffermérettel, annak oka lehet, hogy egy lassú olvasó megakadályozza a célfolyamat puffereinek kiürítését.

  • DOTNET_EventPipeProcNumbers: Állítsa be úgy, hogy 1 engedélyezze a processzorszámok rögzítését az EventPipe eseményfejléceiben. Az alapértelmezett érték 0.

  • DOTNET_EventPipeConfig: Az EventPipe-munkamenet konfigurációjának beállítása az EventPipe-munkamenet indításakor a következővel DOTNET_EnableEventPipe: . A szintaxis a következő:

    <provider>:<keyword>:<level>

    Több szolgáltatót is megadhat vesszővel összefűzve:

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

    Ha ez a környezeti változó nincs beállítva, de az EventPipe engedélyezve DOTNET_EnableEventPipevan, a nyomkövetést a következő kulcsszavakkal és szintekkel rendelkező szolgáltatók engedélyezésével indítja el:

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

    Ha többet szeretne megtudni a .NET ismert szolgáltatóiról, tekintse meg a jól ismert eseményszolgáltatókat.