.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.

perfcollectEgy 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.

  1. Letöltés perfcollect.

    curl -OL https://aka.ms/perfcollect
    
  2. A szkript végrehajthatóvá tétele.

    chmod +x perfcollect
    
  3. 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:

    1. 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.

    2. 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

  1. 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].

  2. [Nyomkövetés] Gyűjtemény indítása.

    sudo ./perfcollect collect sampleTrace
    

    Várt kimenet:

    Collection started.  Press CTRL+C to stop.
    
  3. [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 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.

  4. [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
    
  5. [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 LTTngesemé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 .

  1. Másolja a trace.zip fájlt Linuxról egy Windows-gépre.

  2. Töltse le a PerfView fájlt a fájlból https://aka.ms/perfview.

  3. 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:

  1. dotnet-symbol telepítése:

    dotnet tool install -g dotnet-symbol
    
  2. 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
    
  3. 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 perfcollectszimbolikus 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.