.NET-alkalmazások nyomkövetése a PerfCollect használatával
Ez a cikk a következőre vonatkozik: ✔️ .NET Core 2.1 SDK és újabb verziók
Ha teljesítményproblémák merülnek fel Linuxon, a nyomkövetési adatok gyűjtésével perfcollect
részletes információkat gyűjthet arról, hogy mi történt a gépen a teljesítményproblémák idején.
perfcollect
Egy bash-szkript, amely Linux Trace Toolkit: next generation (LTTng) használatával gyűjti a futtatókörnyezetből vagy bármely EventSource-ból írt eseményeket, valamint a célfolyamat processzormintáinak gyűjtésére.
A gép előkészítése
Az alábbi lépéseket követve előkészítheti a gépet a teljesítménykövetés gyűjtésére perfcollect
.
Feljegyzés
Ha tárolón belülről rögzíti a rögzítést, a tárolónak rendelkeznie kell a megfelelő képességekkel. A minimálisan szükséges képességek a következők: PERFMON
és SYS_PTRACE
. Ha a rögzítés a minimális készlettel meghiúsul, adja hozzá a SYS_ADMIN
képességet a tárolóhoz. További információ a tárolókban lévő alkalmazások PerfCollect használatával történő nyomon követéséről: Diagnosztikák gyűjtése tárolókban.
Letöltés
perfcollect
.curl -OL https://aka.ms/perfcollect
A szkript végrehajthatóvá tétele.
chmod +x perfcollect
Nyomkövetési előfeltételek telepítése – ezek a tényleges nyomkövetési kódtárak.
sudo ./perfcollect install
Ez a következő előfeltételeket telepíti a számítógépre:
perf
: a Linux Performance Events alrendszer és a társfelhasználói módú gyűjtemény/megjelenítő alkalmazás.perf
a Linux kernelforrás része, de alapértelmezés szerint nincs telepítve.LTTng
: A CoreCLR által futásidőben kibocsátott eseményadatok rögzítésére szolgál. Ezek az adatok ezután a különböző futtatókörnyezeti összetevők, például a GC, a JIT és a szálkészlet viselkedésének elemzésére szolgálnak.
A .NET Core és a Linux perf eszköz legújabb verziói támogatják a keretrendszerkód metódusneveinek automatikus feloldását.
A natív futtatókörnyezeti DLL-ek (például libcoreclr.so) perfcollect
metódusneveinek feloldásához az adatok konvertálásakor feloldja a szimbólumokat, de csak akkor, ha a bináris fájlok szimbólumai jelen vannak. Részletekért tekintse meg a natív futtatókörnyezeti szakasz szimbólumainak lekérését ismertető szakaszt.
Nyomkövetés gyűjtése
Két rendszerhéj érhető el : az egyik a nyomkövetés szabályozására szolgál, a másik a [Trace] néven, a másik pedig az alkalmazás futtatására, más néven [Alkalmazás].
[Nyomkövetés] Gyűjtemény indítása.
sudo ./perfcollect collect sampleTrace
Várt kimenet:
Collection started. Press CTRL+C to stop.
[Alkalmazás] Az alkalmazáshéj beállítása a következő környezeti változókkal – ez lehetővé teszi a CoreCLR nyomkövetési konfigurációját.
export DOTNET_PerfMapEnabled=1 export DOTNET_EnableEventLog=1
Feljegyzés
Az alkalmazás .NET 7-tel való végrehajtásakor az előző környezeti változók mellett is be kell állítania
DOTNET_EnableWriteXorExecute=0
. Például:export DOTNET_EnableWriteXorExecute=0
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 helyettCOMPlus_
. AzCOMPlus_
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 aCOMPlus_
környezeti változók előtagját.[Alkalmazás] Futtassa az alkalmazást – addig futtassa, amíg szüksége van a teljesítményproblémák rögzítéséhez. A pontos hossz lehet olyan rövid, amennyire szüksége van, amíg megfelelően rögzíti azt az időtartamot, amikor a vizsgálandó teljesítményproblémák jelentkeznek.
dotnet run
[Nyomkövetés] Gyűjtemény leállítása – nyomja le a CTRL+C billentyűkombinációt.
^C ...STOPPED. Starting post-processing. This may take some time. Generating native image symbol files ...SKIPPED Saving native symbols ...FINISHED Exporting perf.data file ...FINISHED Compressing trace files ...FINISHED Cleaning up artifacts ...FINISHED Trace saved to sampleTrace.trace.zip
A tömörített nyomkövetési fájl most az aktuális munkakönyvtárban van tárolva.
Nyomkövetés megtekintése
Számos lehetőség van a gyűjtött nyomkövetés megtekintésére. A nyomkövetések a Legjobban a Windows PerfView használatával tekinthetők meg, de közvetlenül Linuxon PerfCollect
is megtekinthetők saját maga vagy TraceCompass
.
A nyomkövetési fájl megtekintése a PerfCollect használatával
A perfcollect használatával megtekintheti az összegyűjtött nyomkövetést. Ehhez használja a következő parancsot:
./perfcollect view sampleTrace.trace.zip
Alapértelmezés szerint ez megjeleníti az alkalmazás cpu-nyomkövetését a használatával perf
.
Az összegyűjtött LTTng
események megtekintéséhez az egyes események megtekintéséhez adja meg a jelölőt -viewer lttng
:
./perfcollect view sampleTrace.trace.zip -viewer lttng
Ez a megjelenítő használatával babeltrace
nyomtatja ki az események hasznos adatait:
# [01:02:18.189217659] (+0.020132603) ubuntu-xenial DotNETRuntime:ExceptionThrown_V1: { cpu_id = 0 }, { ExceptionType = "System.Exception", ExceptionMessage = "An exception happened", ExceptionEIP = 139875671834775, ExceptionHRESULT = 2148734208, ExceptionFlags = 16, ClrInstanceID = 0 }
# [01:02:18.189250227] (+0.020165171) ubuntu-xenial DotNETRuntime:ExceptionCatchStart: { cpu_id = 0 }, { EntryEIP = 139873639728404, MethodID = 139873626968120, MethodName = "void [helloworld] helloworld.Program::Main(string[])", ClrInstanceID = 0 }
A perfView használata a nyomkövetési fájl megnyitásához
A CPU-minta és az események összesített nézetének megtekintéséhez windowsos gépen is használhatja PerfView
.
Másolja a trace.zip fájlt Linuxról egy Windows-gépre.
Töltse le a PerfView fájlt a fájlból https://aka.ms/perfview.
PerfView.exe futtatása
PerfView.exe <path to trace.zip file>
A PerfView megjeleníti a nyomkövetési fájlban található adatok alapján támogatott nézetek listáját.
A CPU-vizsgálatokhoz válassza a CPU-veremeket.
A részletes csoportházirend-információkért válassza a GCStats lehetőséget.
A folyamatonkénti/modulonkénti/metódusalapú JIT-információkért válassza a JITStats lehetőséget.
Ha nincs nézet a szükséges információkhoz, próbálja meg megkeresni az eseményeket a nyers események nézetben. Válassza az Események lehetőséget.
A nézetek PerfView-ban való értelmezéséről a nézetben található súgóhivatkozások, illetve a PerfView főablakában a Súgó felhasználói> útmutatója című témakörben talál további információt.
Feljegyzés
Az API-n keresztül System.Diagnostics.Tracing.EventSource írt események (beleértve a Keretrendszer eseményeit is) nem jelennek meg a szolgáltató neve alatt. Ehelyett eseményekként EventSourceEvent
vannak megírva a szolgáltatónál Microsoft-Windows-DotNETRuntime
, és a hasznos adataik JSON-szerializáltak.
Feljegyzés
Ha a metódusnevekben és a hívásokban lévő kereteket észleli [unknown] /memfd:doublemapper
, állítsa be DOTNET_EnableWriteXorExecute=0
a perfcollecttel nyomon követni kívánt alkalmazás futtatása előtt.
A TraceCompass használata a nyomkövetési fájl megnyitásához
Az Eclipse TraceCompass egy másik lehetőség a nyomkövetések megtekintésére. TraceCompass
Linux rendszerű gépeken is működik, így nem kell áthelyeznie a nyomkövetést egy Windows rendszerű gépre. TraceCompass
A nyomkövetési fájl megnyitásához ki kell bontania a fájlt.
unzip myTrace.trace.zip
perfcollect
az összegyűjtött LTTng-nyomkövetést CTF-fájlformátumba menti egy alkönyvtárban a lttngTrace
. A CTF-fájl egy olyan könyvtárban lesz, amely a következőképpen lttngTrace/auto-20201025-101230\ust\uid\1000\64-bit\
néz ki.
A CTF-nyomkövetési fájlt TraceCompass
a fájl kiválasztásával File -> Open Trace
és kiválasztásával metadata
nyithatja meg.
További részletekért tekintse meg a dokumentációtTraceCompass
.
Szimbólumok lekérése a natív futtatókörnyezethez
A legtöbb esetben a saját kód érdekli, amely perfcollect
alapértelmezés szerint feloldható. Néha hasznos látni, hogy mi történik a .NET DLL-eken belül (erről az utolsó szakasz volt szó), de néha érdekes, hogy mi történik a natív futtatókörnyezeti DLL-ekben (általában libcoreclr.so). perfcollect
feloldja ezek szimbólumait az adatok konvertálásakor, de csak akkor, ha a natív DLL-ek szimbólumai jelen vannak (és a kódtár mellett vannak).
Létezik egy dotnet-symbol nevű globális parancs, amely ezt teszi. Dotnet-szimbólum használata natív futtatókörnyezeti szimbólumok lekéréséhez:
dotnet-symbol
telepítése:dotnet tool install -g dotnet-symbol
Töltse le a szimbólumokat. Ha a .NET Core-futtatókörnyezet telepített verziója 2.1.0, a következő parancsot kell végrehajtania:
mkdir mySymbols dotnet symbol --symbols --output mySymbols /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0/lib*.so
Másolja a szimbólumokat a megfelelő helyre.
sudo cp mySymbols/* /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0
Ha ez nem lehetséges, mert nincs írási hozzáférése a megfelelő könyvtárhoz, a szimbólumok hozzáadásához használhatja
perf buildid-cache
.
Ezután a futtatáskor perfcollect
szimbolikus neveket kell kapnia a natív dll-ek számára.
Adatgyűjtés Docker-tárolóban
A tárolókörnyezetekben való használatra perfcollect
vonatkozó további információkért lásd : Diagnosztika gyűjtése tárolókban.
További információ a gyűjtemény beállításairól
A diagnosztikai igényeknek megfelelően a következő választható jelzőket perfcollect
adhatja meg.
Gyűjtsön egy adott időtartamra
Ha egy adott időtartamra szeretne nyomkövetést gyűjteni, használhatja -collectsec
azt a lehetőséget, amelyet egy szám követ, amely megadja, hogy hány másodpercig gyűjtsön nyomkövetést.
Threadtime-nyomkövetések gyűjtése
A beállítás -threadtime
lehetővé perfcollect
teszi a szálonkénti processzorhasználati adatok gyűjtését. Ez lehetővé teszi annak elemzését, hogy minden szál hol töltötte a processzoridejét.
Nyomkövetések gyűjtése a felügyelt memória és a szemétgyűjtő teljesítményéhez
Az alábbi lehetőségek lehetővé teszik a GC-események konkrét gyűjtését a futtatókörnyezetből.
perfcollect collect -gccollectonly
Csak a csoportházirend-gyűjtemény eseményeinek minimális készletét gyűjtse össze. Ez a legkevésbé részletes GC eseménygyűjtési profil, amely a legkisebb hatással van a célalkalmazás teljesítményére. Ez a parancs hasonló a PerfView parancsához PerfView.exe /GCCollectOnly collect
.
perfcollect collect -gconly
Gyűjtsön részletesebb GC-gyűjtési eseményeket JIT-, Loader- és Exception-eseményekkel. Ez részletesebb eseményeket kér (például a foglalási adatokat és a csoportházirend-összekapcsolási információkat), és nagyobb hatással lesz a célalkalmazás teljesítményére, mint -gccollectonly
a beállításra. Ez a parancs hasonló a PerfView parancsához PerfView.exe /GCOnly collect
.
perfcollect collect -gcwithheap
Gyűjtse össze a legigértelműbb GC gyűjtési eseményeket, amelyek nyomon követik a halom túlélését és mozgását is. Ez részletes elemzést nyújt a csoportházirend-viselkedésről, de nagy teljesítményköltséggel jár, mivel az egyes GC-k több mint kétszer hosszabb időt is igénybe vehetnek. Javasoljuk, hogy tisztában legyen azzal, hogy milyen teljesítménybeli hatása van ennek a nyomkövetési lehetőségnek az éles környezetekben való nyomon követés során.