13 Profileringsprogramvara för att felsöka applikationsprestandaproblem

By rik

Målet med din applikation bör vara att tillgodose dina användares behov på bästa möjliga sätt.

Den måste vara snabb, responsiv, användarvänlig och pålitlig, bland många andra önskvärda egenskaper.

Men att upprätthålla din mjukvara så att den fortsätter att prestera på toppnivå är inte en enkel uppgift.

När din kod börjar utföra onödiga funktioner, snubblar över sig själv, samlar på sig buggar och fastnar i extra loopar, kan det leda till ineffektivitet. Din applikation kan bli långsam, sluta svara eller bete sig oförutsägbart.

Om dessa problem inte åtgärdas, kommer applikationens övergripande prestanda att försämras.

Detta kan leda till att dina kunder blir frustrerade eller slutar använda din applikation helt på grund av dålig prestanda och långsamhet. Det skadar inte bara ditt anseende, utan kostar dig också intäkter och vinster. Därför är det nödvändigt att analysera, granska och felsöka din kod för att uppnå optimal prestanda. Det snabbaste sättet att göra detta är att använda ett programvaruprofileringsverktyg för att övervaka och felsöka din kod och eliminera prestandarelaterade flaskhalsar.

I den här artikeln kommer du att lära dig mer om programvaruprofilering och hur det kan vara till hjälp. Sedan kommer jag att gå igenom några av de bästa profileringsverktygen för att felsöka din applikation och optimera dess prestanda.

Vad är programvaruprofilering?

Programvaruprofilering är en form av dynamisk kodanalys där ett programs beteende granskas genom data som samlas in när programmet körs. Syftet är att identifiera de olika delarna av programmet som behöver optimeras för att förbättra applikationens hastighet, respons och minska dess minnes- och resursförbrukning.

En programvaruprofilerare mäter vanligen hur lång tid det tar för funktioner att köras, hur ofta de anropas, samt minnes- och tidskomplexiteten som är förknippad med ett program. Det finns även specifika profiler tillgängliga, till exempel minnesprofilerare.

Profilering görs ofta genom att instrumentera programkoden. Profilerare kan använda olika metoder för profilering, såsom instrumenteringsbaserade, händelsebaserade, statistiska eller simuleringsmetoder.

Varför är programvaruprofilering viktigt?

Programvaruprofilering är avgörande för att fastställa resursanvändning och exekveringstid för specifika funktioner. Det hjälper till att optimera programmets hastighet och samtidigt säkerställa att det förbrukar så lite resurser som möjligt.

Det används även för att spåra och optimera CPU-användning och körtid för kommandon.

Därför är det viktigt att välja rätt programvaruprofileringsverktyg för att snabbare kunna felsöka prestandarelaterade problem och förbättra effektiviteten och användarupplevelsen. Många profilerare erbjuder även detaljerade rapporter och interaktiva grafer och visualiseringar som hjälper dig att identifiera de exakta orsakerna till problemen, vilket gör det lättare att lösa dem.

Här följer en lista över några av de bästa programvaruprofilerarna som du kan testa. Berätta gärna för oss vilken som fungerar bäst för dig.

py-spy

py-spy är en utmärkt samplingsprofilerare för Python. Den låter dig få en inblick i vad din Python-baserade applikation använder sin tid på.

Du behöver inte ändra din kod eller starta om programmet. py-spy har låg overhead och är utvecklat i Rust för att vara snabbt. Det är inte konstruerat för att köras i samma process som ditt profilerade python-baserade program. Det innebär att py-spy är mycket säkert att använda mot produktionskod skriven i Python.

Verktyget låter dig spela in profiler, generera flamgrafer och skapa interaktiva SVG-filer. Du kan också använda andra alternativ, som att justera samplingsfrekvenser, profilera inbyggda C-tillägg, underprocesser och tråd-ID:n, med mera. Du kan få en live-vy av funktioner som körs i dina program med kommandot ”top” och visa den aktuella anropsstacken för varje python-tråd med kommandot ”dump”.

Det stöder alla CPython-tolkversioner, från 2.3 till 2.7 och 3.3 till 3.8. Du kan installera py-spy från PyPI eller GitHub.

Pyroscope

Programvaran för kontinuerlig profilering med öppen källkod, Pyroscope, hjälper dig att felsöka alla prestandaproblem i din applikation på bara några minuter.

Du kan starta servern och agenten oavsett vad du använder: Docker, Linux, eller om du letar efter dokumentation för Ruby eller Go, Pyroscope har det du behöver. Även om du vill ha tio sekunder eller tio månader av programvaruprofileringsdata, möjliggör deras specialdesignade lagringsmotor snabba frågor.

Du behöver inte oroa dig för overhead eller applikationsprestanda eftersom de använder samplingsprofileringsteknik som inte påverkar prestandan. Pyroscope lagrar din profileringsdata effektivt, vilket gör det kostnadseffektivt även om du vill lagra olika profileringsdata från flera applikationer under flera år.

Det fungerar på macOS, Linux och Docker och stöder program skrivna i Python, Go och Ruby.

Bubbleprof

Bubbleprof från Clinic.js ger ett nytt och unikt sätt att profilera din mjukvara skriven i Node.js. Den använder ett ”bubbel”-gränssnitt som hjälper alla, från experter till nybörjare, att identifiera asynkron tid som spenderas i din app.

Den visualiserar hur dina Node.js-processer fungerar genom att observera dess asynkrona operationer, gruppera dem, beräkna fördröjningarna och kartlägga dem.

Bubbleprof bestämmer operationstiderna genom att granska storleken på bubblorna inom en specifik grupp av operationer, som kan vara din kod, en nodkärna eller en modul. Den grupperar också intilliggande grupper för att minska röran.

För att beräkna fördröjningarna när operationer flyttar från en grupp till en annan mäter Bubbleprof längden på pilarna som förbinder bubblor. Dessutom använder den också olika färger under mätprocessen. Samtidigt representerar de inre färgade linjerna en blandning av asynkrona operationstyper som är orsak till fördröjningen.

Pyinstrument

Optimera din Python-kod med Pyinstrument.

Den visar dig varför din Python-kod är långsam och hjälper dig att diagnostisera problemen så att du kan uppnå den där blixtsnabba prestandan.

För att använda Pyinstrument behöver du inte skriva ett Python-skript, du kan bara anropa Pyinstrument direkt från kommandoraden. Ditt skript kommer att köras som vanligt, och verktyget ger en färgkodad sammanfattning av de områden där programmet har lagt sin tid. Det finns även ett Python-API som gör processen ännu enklare.

Du kan profilera webbförfrågningar i Flask och Django, och det finns bra dokumentation för hur man gör det. Observera att Pyinstrument erbjuder statistisk profilering som registrerar anropsstacken varje millisekund istället för att spåra varje funktionsanrop som görs av ditt program.

Detta är fördelaktigt eftersom statistiska profiler medför lägre overhead jämfört med spårningsprofilerare. Eftersom den registrerar hela stacken blir det enkelt att spåra resurskrävande funktionsanrop. Pyinstrument döljer också (som standard) biblioteksramar, vilket gör att du kan fokusera på de applikationer eller moduler som påverkar prestandan mest.

Felsökning av prestandaproblem blir enklare eftersom Pyinstrument registrerar den tid som spenderas med ”väggklockan”. Verktyget spårar hela programmets tid för att läsa filer, ladda ner data, kommunicera med databaser etc.

Xdebug

För att förbättra kodens prestanda och göra din utvecklingsupplevelse lite roligare kommer Xdebug med omfattande möjligheter för profilering och felsökning.

Det är faktiskt ett PHP-tillägg som låter dig hitta flaskhalsarna i din PHP-applikation och analysera dess prestanda med hjälp av externa visualiseringsverktyg för att generera prestandagrafer.

Xdebug skapar en detaljerad utdata som visar programmets väg till felet, inklusive parametrarna som skickats till en given funktion. Detta görs för att spåra fel. För att hjälpa utvecklare att förstå tydligt genererar den färgkodad information och strukturerade vyer.

Den levereras också med en fjärrfelsökare som du kan använda för att ansluta Xdebug med en kod som körs, en IDE eller en webbläsare för att visa brytpunkter och exekvera koden steg för steg. En annan funktion som den erbjuder är kodtäckning som visar hur mycket av din kod som exekveras och som hjälper dig även med enhetstester.

SPX

Enkelt profileringsverktyg (SPX) är ett profileringstillägg designat för PHP. Det har några unika egenskaper som skiljer det från andra profileringstillägg. Det är helt GRATIS att använda och är begränsat till din egen infrastruktur, vilket innebär att det inte finns någon risk för dataläckor.

SPX:s enkelhet gör det mycket lätt att använda: allt du behöver göra är att ställa in en kommandorad eller miljövariabel för att profilera ett skript. Alternativt kan du slå på alternativknappen på en webbsida för att profilera skriptet. På så sätt behöver du inte instrumentera din kod manuellt.

Den stöder också att man avslutar ett körande kommandoradsskript med Ctrl-C. Dessutom slipper man använda en kommandoradsstartare eller ett särskilt webbläsartillägg. SPX stöder flera mätvärden, cirka 22, inklusive olika tids- och minnesmått, objekt, filer som används, I/O, etc.

Det kan samla in data utan att lämna sammanhanget. Webbgränssnittet gör det möjligt att konfigurera/aktivera profilering för den webbläsarsession som används, och listar all information och rapporter om profilerade skript. Webbgränssnittet låter dig välja en specifik rapport för djupare analys och har några interaktiva visualiseringar, som flamgrafer, platta profiler och tidslinjer, som kan skalas till funktionsanrop i miljoner.

Prefix

Prefix från Stackify är en lättinstallerad och enkel kodprofilerare som många utvecklare gillar. Den hjälper dig att eliminera flaskhalsar i din applikations prestanda, optimera den och förbättra användarupplevelsen.

Prefix överlägsna spårnings- och profileringsfunktioner gör att du snabbt kan hitta dolda undantag, långsamma SQL-frågor med mera. Det ger dina utvecklare den verkliga kraften hos APM (Application Performance Monitoring). Prefix validerar kodprestandan som den är skriven och gör att du kan pusha koder med bättre prestanda för testning.

På så sätt får du färre supportärenden från produktionssidan och hjälper utvecklingsansvariga att nå sina mål snabbare. Upptäck alla frågor som presterar dåligt, okända flaskhalsar och ORM-genererade frågor.

Du kan också spåra varje SQL-anropsparameter, nedladdningstider och se de berörda posterna. Prefix gör det även enklare att upptäcka N+1-mönster. Glöm att sortera igenom alla de där röriga loggarna, samla ihop dem så att problem är lättare att hitta.

Prefix gör att du direkt kan hitta sammanhanget för en misstänkt logg i en förfrågan och hoppa från en logg till en spårning för felsökning utan ansträngning. Prefix lyfter fram dåligt presterande beroenden, vilket är användbart för att hitta dolda undantag och arbeta med äldre kod eller ramverk. Dessa beroenden kan vara webbtjänster, tredjepartstjänster, cachetjänster med mera.

Prefix fungerar på Windows och Mac och stöder .Net, Ruby, Java, PHP, Python och Node.js.

Scalene

Scalene är en högprecision, högpresterande GPU-, CPU- och minnesprofilerare för Python-baserade program. Det erbjuder flera fördelar jämfört med andra profilerare, såsom att vara snabbare och ge mer djupgående information.

Scalene är otroligt snabbt och använder sampling istället för instrumentering. Det förlitar sig inte ens på Pythons spårningsfaciliteter. Dessutom är dess overhead vanligtvis under 10–20 %. Det här verktyget utför programvaruprofilering på radnivå och pekar ut de rader med kod som ansvarar för programmets exekveringstid.

Denna detalj är mer värdefull än de vid profilering på funktionsnivå. Scalene skiljer på den tid som spenderas enbart i Python och den som spenderas i inbyggd kod, som inkluderar bibliotek. Eftersom de flesta Python-programmerare inte kommer att optimera inbyggd kodprestanda kan utvecklare fokusera sina ansträngningar på att optimera kod som de faktiskt kan förbättra.

Den markerar hotspots i rött, vilket gör det lättare att identifiera CPU-tid/minnesallokering och enkelt separera systemtid för att hitta I/O-problem. Scalene kan rapportera GPU-tid, profilera minnesanvändning och spåra CPU-användning. Scalene kan även identifiera potentiella minnesläckor, profilera kopieringsvolymer och generera reducerade profiler för kodrader som använder mer än 1 % av CPU:n.

VisualVM

Allt-i-ett-felsökningsverktyget för Java, VisualVM, är utformat för att användas både under produktions- och utvecklingsfaserna. Det är ett visuellt program som integrerar lätta profileringsfunktioner med kommandoradsverktyg från JDK.

VisualVM övervakar applikationer som körs på Java 1.4+ och felsöker dem med hjälp av flera tekniker, som JMX, jvmstat, Attach API och Serviceability Agent. Det här verktyget passar perfekt för olika krav, från kvalitetssäkrare till systemadministratörer och slutanvändare.

Det identifierar automatiskt Java-baserade program som körs på distans och lokalt och listar dem. Verktyget låter dig också definiera program manuellt med en JMX-anslutning. För varje process visar den viktig runtime-data, som PID, argument som skickats, JDK-hem, huvudklass, JVM-flaggor, JVM-version och system- och argumentegenskaper.

VisualVM övervakar CPU-användning, heap och metaspace eller permanent genereringsminne, körande trådar och inlästa klasser i en applikation. Den visar alla körande trådar på en tidslinje med aggregerade sömn-, kör-, park-, monitor- och väntetider.

Både instrumenterings- och samplingsprofiler kan köras med VisualVM för minneshantering och applikationsprestanda. Det visar tråddumpar för att ge snabb insikt i processer. Det visar och skapar även .hprof-ögonblicksbilder på begäran för att hjälpa dig att identifiera ineffektivitet vid heap-användning och felsöka minnesläckor.

Dessutom kan VisualVM läsa grundläggande data om en kraschad Java-baserad process och dess miljö. Du kan analysera dina appar offline, genom att spara appkörningsmiljö och konfiguration tillsammans med tagna heap-dumpar, tråddumpar och profileringsögonblicksbilder, som du kan bearbeta offline senare.

Det fungerar på Windows, Linux och Unix.

Orbit Profiler

Visualisera din C/C++-applikation och hitta prestandaproblem snabbt med hjälp av Orbit Profiler. Detta är ett felsökningsverktyg och en fristående profilerare som är utformad för att hjälpa utvecklare att se och förstå det komplexa exekveringsflödet i en app.

Den ger en tydlig bild av allt som händer inuti appen så att du snabbt kan eliminera prestandaflaskhalsar och återställa din applikations höga prestanda.

Orbit Profiler kan fungera effektivt på alla C- eller C++-appar, förutsatt att den har tillgång till PDB-filen. Därefter börjar profileringen när du har laddat ner programmet. Verktyget hoppar till målprocessen, kopplar sig till utvalda funktioner och utför profilering.

Det kan till och med fungera på dina optimerade slut- eller leveransbyggen. Förutom dynamisk instrumentering erbjuder Orbit Profiler även ”alltid på”-samplingsfunktioner, som är snabba, alltid tillgängliga och robusta.

Det fungerar på Windows och Linux.

Uber JVM Profiler

Med avancerade profileringsfunktioner är Uber JVM Profiler ett annat bra alternativ för dina Java-baserade applikationer.

Den erbjuder en Java-agent som samlar in flera stackspår och mätvärden för Spark/Hadoop JVM-processer på ett distribuerat sätt, till exempel minnes-/CPU-/IO-mätningar.

Verktyget kan spåra java-argument och -metoder i användarkoder utan att ändra dem. Du kan också använda det för att spåra samtalslatensen för HDFS-namnnoder för alla Spark-appar och hitta problem. Den kan till och med spåra Spark-appens HDFS-filsökvägar för att ta reda på vilka filer som används mest och utföra ytterligare optimeringar.

Uber JVM Profiler skapades ursprungligen för att profilera Spark-appar som vanligtvis inkluderar många maskiner eller processer för en applikation. Det gör att du enkelt kan korrelera mätvärden för dessa maskiner eller processer.

Verktyget fungerar dock som en vanlig java-agent och du kan använda den för alla dina JVM-processer. Dess funktioner inkluderar:

  • Felsökning av minnesanvändning i Spark-appexekutorer, som java-heapminne, inbyggt minne, icke-heapminne, buffertpool och minnespool.
  • Felsökning av CPU-användning och skräpinsamlingstid.
  • Felsökning av Java-klassmetoder för deras frekvens och tid eller varaktighetsprofilering.
  • Argumentprofilering (felsökning och spårning av java-klassmetodanrop och dess argumentvärden).
  • Stackspårningsprofilering och generering av flamgrafer för CPU-tid.
  • Felsökning av I/O-mått och JVM-trådmått.

Tracy

Tracy är ett praktiskt verktyg som hjälper utvecklare att felsöka PHP-program enkelt. Det har en användarvänlig design och avancerade funktioner som CLI-stöd, felsökning av AJAX-anrop med mera.

Den kan snabbt hitta och korrigera fel, dumpa variabler, logga fel, visualisera minnesförbrukning och bestämma exekveringstiden för frågor eller skript. Användning av färgkodning och markering av problem i rött med tydliga förklaringar hjälper dig att enkelt visualisera undantag och fel och förstå dem.

Tracy levereras med loggningsfunktion och automatisk miljöidentifiering. Den lagrar data i loggfiler och visar felmeddelanden för en besökare under driftstopp. Tracy kan också integreras med Drupal 7, OpenCart, WordPress med mera.

vprof

vprof är en visuell profilerare för Python-applikationer. Den ger rika, interaktiva visualiseringar för olika aspekter av dina Python-program, som minnesanvändning och körtid.

Den är tillgänglig under en BSD-licens och stöder Python 3.4 och högre.

Slutsats

Applikationsprestanda är avgörande för att uppfylla slutanvändarnas förväntningar. Om det uppstår prestandaproblem måste du vara redo att diagnostisera problemet innan det påverkar slutanvändarupplevelsen.

Fortsätt därför att optimera dina applikationer och åtgärda problem omedelbart så att ni fortsätter att leverera snabb applikationsprestanda till användarna genom att använda de verktyg som jag har nämnt i den här artikeln.

Här är en snabb jämförelsetabell som visar de ovanstående profilerna och vad de främst används till.

Namn Språk
py-spy Python
Pyroscope Python, Ruby, Go
Bubbleprof Node.js
Pyinstrument Python
Xdebug PHP
SPX PHP
Prefix Python, .NET, Java, Node.js, Ruby, PHP
Scalene Python
VisualVM Java
Orbit Profiler C, C++
Uber JVM Profiler Java
Tracy PHP
vprof Python