Megosztás a következőn keresztül:


EventPipe

Az EventPipe egy futtatókörnyezeti összetevő, amely az ETW-hez vagy LTTng-hez 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 operációsrendszer-natív összetevőkre, például az ETW-re vagy az LTTng-re 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.

Az EventPipe szerializálási formátumával kapcsolatos további információkért tekintse meg az EventPipe formátum dokumentációját.

EventPipe és ETW/LTTng

Az EventPipe a .NET-futtatókörnyezet (CoreCLR) része, és úgy lett kialakítva, hogy a .NET Core minden platformjához hasonlóan 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 nem használható alacsonyabb szintű események nyomon követésére, például natív kódverem feloldására vagy különböző kernelesemények lekérésére. Ha c/C++ interopot használ az alkalmazásban, vagy magát a futtatókörnyezetet szeretné nyomon követni (amely C++-ban van megírva), vagy mélyebb diagnosztikát szeretne végezni a kerneleseményeket igénylő alkalmazás viselkedésében (azaz natív szálbeli környezetváltási eseményekben), akkor az ETW-t vagy a perf/LTTng-et kell használnia.

Az EventPipe és az ETW/LTTng között egy másik jelentős különbség a rendszergazdai/gyökérjogosultság-követelmény. Ha egy alkalmazást az ETW vagy LTTng használatával szeretne nyomon követni, 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/LTTng közötti különbségek összegzését tartalmazza.

Szolgáltatás EventPipe ETW LTTng
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 DOTNET_EventPipeOutputPath sztringpéldányok {pid} 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, mivel == 0x4001024 .

    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.

Feljegyzés

A .NET 6 az előtagon DOTNET_ szabványosítja a .NET futásidejű viselkedést konfiguráló környezeti változók helyett COMPlus_ . Az COMPlus_ előtag azonban továbbra is működni fog. Ha a .NET-futtatókörnyezet egy korábbi verzióját használja, akkor is használja a COMPlus_ környezeti változók előtagját.