Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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:
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: A kimeneti EventPipe nyomkövetési fájl elérési útja, ha konfigurálva van a futtatásraDOTNET_EnableEventPipe. Az alapértelmezett érték aztrace.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ányokDOTNET_EventPipeOutputPathhelyé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ásraDOTNET_EnableEventPipe. Az alapértelmezett pufferméret 1024 MB, amely ennek a környezeti változónak a beállítását400jelenti, 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, hogy1engedélyezze a processzorszámok rögzítését az EventPipe eseményfejléceiben. Az alapértelmezett érték0.DOTNET_EventPipeConfig: Az EventPipe-munkamenet konfigurációjának beállítása az EventPipe-munkamenet indításakor a következővelDOTNET_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: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.