Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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. Más nyomkövetési eszközök nélkül az EventPipe-események csak felügyelt kód keret információval rendelkező veremnyomkövetéseket tartalmaznak. Ha más, nem felügyelt felhasználói módú kódtárakból, a natív kód- vagy kernelesemények cpu-mintavételezéséből szeretne eseményeket lekérni, használjon operációsrendszer-specifikus nyomkövetési eszközöket, például ETW-t vagy perf_events. Linuxon a perfcollect eszköz segít automatizálni perf_events és LTTng használatával.
A .NET 10-től kezdve a Linuxon futó EventPipe user_events-ként képes eseményeket kibocsátni, lehetővé téve a felügyelt események, operációsrendszer-/kernelesemények és natív hívások gyűjtését egyetlen egységes nyomkövetésben. Ehhez a módhoz rendszergazdai/gyökérjogokkal és Linux kernel 6.4+-ra van szükség. További információért lásd dotnet-trace collect-linux.
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 alkalmazások nyomon követéséhez a standard EventPipe használatával biztosíthatja, hogy a nyomkövető (például dotnet-trace) ugyanazzal a felhasználóval fusson, mint aki az alkalmazást elindította. A korábban ismertetett EventPipe (user_events) mód rendszergazdai/fő jogosultságokat igényel, mivel az operációs rendszerszintű nyomkövetési infrastruktúrával működik együtt.
Az alábbi táblázat az EventPipe és az ETW/perf_events közötti különbségek összegzését tartalmazza.
| Funkció | EventPipe | EventPipe (felhasználói_események) | ETW | teljesítmény események (perf_events) |
|---|---|---|---|---|
| Platformfüggetlen | Igen | Nem (csak támogatott Linux-disztribúciók esetében) | 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 | Igen |
| Rendszer-/kernelesemények lekérése | Nem | Igen | Igen | Igen |
| Natív hívásverem feloldása | Nem | Igen | 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:
Használja az EventPipe-ra épülő diagnosztikai eszközök egyikét.
A Microsoft.Diagnostics.NETCore.Client kódtár használatával saját eszközt írhat az EventPipe-munkamenetek konfigurálásához és elindításához.
Környezeti változók használatával indítsa el az EventPipe-et.
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,1hogy elindítson egy olyan EventPipe-munkamenetet, amely közvetlenül egy fájlba ír. Az alapértelmezett érték0.DOTNET_EventPipeOutputPath: Az kimeneti EventPipe nyomkövetési fájl elérési útja, amikor aDOTNET_EnableEventPipesegítségével van konfigurálva a futtatásra. Az alapértelmezett érték aztrace.nettrace, amely ugyanabban a könyvtárban lesz létrehozva, amelyből az alkalmazás fut.Megjegyzés
.NET 6 óta a
{pid}sztringpéldányokatDOTNET_EventPipeOutputPathhelyett a nyomkövetett folyamat folyamatazonosítójára cserélik.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áshozDOTNET_EnableEventPipe. Az alapértelmezett pufferméret 1024 MB, amely ennek a környezeti változónak a beállítását400jelenti, mivel0x400==1024.Megjegyzé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, hogy1engedélyezze a processzorszámok rögzítését az EventPipe eseményfejléceiben. Az alapértelmezett érték0.DOTNET_EventPipeThreadSamplingRate: .NET 11 és újabb verziókban érhető el. Ezredmásodpercben állítja be az EventPipe szálidő mintavételezési profilerének időközét. Ha meg van0határozva vagy elhagyva, a rendszerkörnyezet 10 ms-es (~100 Hz) beépített alapértelmezett értékét használja. Ez a beállítás folyamatszintű, és minden EventPipe-munkamenetre hatással van, beleértve az olyan eszközök által indított igény szerinti nyomkövetéseket is, mint a dotnet-trace. A nagy érték beállítása csökkenti a mintavételezési többletterhelést, de csökkenti a folyamat élettartama során összegyűjtött nyomkövetések felbontását is.DOTNET_EventPipeConfig: Az EventPipe-munkamenet konfigurációjának beállítása egy EventPipe-munkamenet indításakor a(z)DOTNET_EnableEventPipesegítségével. 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:5Microsoft-Windows-DotNETRuntimePrivate:4002000b:5Microsoft-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.