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.
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/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-counters
az , 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-trace
mint 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 | 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,1
hogy 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
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ásraDOTNET_EnableEventPipe
. Az alapértelmezett pufferméret 1024 MB, amely ennek a környezeti változónak a beállítását400
jelenti, mivel ==0x400
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, hogy1
engedé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_EnableEventPipe
van, 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.