Målet med applikasjonen din er å levere en god opplevelse for sluttbrukerne.
Den bør være rask, responsiv, brukervennlig og pålitelig, blant andre viktige egenskaper.
Det er imidlertid ikke en enkel oppgave å vedlikeholde programvaren på en måte som sikrer at den fortsetter å yte optimalt.
Når koden din begynner å utføre unødvendige funksjoner, snubler over seg selv, fanger opp feil og går inn i ekstra løkker, kan det føre til ineffektivitet. Applikasjonen din kan bli treg, ikke svare eller oppføre seg uforutsigbart.
Og hvis du ikke retter disse problemene, vil den generelle ytelsen til applikasjonen lide.
Dette kan føre til at kundene dine blir irriterte eller slutter å bruke applikasjonen din helt på grunn av dårlig ytelse og lav hastighet. Det skader ikke bare omdømmet ditt, men koster deg også inntekter og fortjeneste. Derfor er det viktig å analysere, gjennomgå og feilsøke koden din for å oppnå optimal ytelse. Den raskeste måten å gjøre dette på er å bruke et programvareprofileringsverktøy for å overvåke og feilsøke koden din, og fjerne ytelsesrelaterte flaskehalser.
I denne artikkelen vil du lære om programvareprofilering og hvordan det kan være til hjelp. Jeg vil også veilede deg gjennom noen av de beste profileringsverktøyene som kan hjelpe deg med å feilsøke applikasjonen din og optimalisere ytelsen.
Hva er programvareprofilering?
Programvareprofilering er en dynamisk kodeanalyse der oppførselen til et program undersøkes ved hjelp av data som samles inn mens programmet kjører. Målet er å identifisere ulike deler av programmet som må optimaliseres for å øke applikasjonens hastighet og respons, og for å redusere minne- og ressursforbruk.
En programvareprofiler måler vanligvis varigheten og frekvensen av funksjonskall, i tillegg til minne- eller tidskompleksiteten som er knyttet til et program. Det finnes også spesifikke profiler, som minneprofilere.
Profilering utføres vanligvis ved å instrumentere programmets kildekode. Profilere kan benytte ulike teknikker for profilering, som instrumenterte, hendelsesbaserte, statistiske eller simuleringsmetoder.
Hvorfor er programvareprofilering viktig?
Programvareprofilering er nødvendig for å identifisere ressursbruken og utførelsestiden for en spesifikk funksjon. Dette hjelper deg med å optimalisere programmets hastighet samtidig som du sikrer at det bruker et minimum av ressurser.
Det brukes også til å spore og optimalisere CPU-bruk og kommandoutførelsestid.
Derfor er det viktig å velge det riktige programvareprofileringsverktøyet for å sikre at du kan feilsøke ytelsesrelaterte problemer raskere, for å forbedre effektiviteten og gi en bedre brukeropplevelse. Mange profilere leveres også med detaljerte rapporter og interaktive grafer og visualiseringer som hjelper deg med å finne den nøyaktige årsaken til problemene, noe som gjør det lettere å løse dem.
Her er en liste over noen av de beste programvareprofilerne du kan prøve, og fortell oss hva som fungerte best for deg.
py-spy
py-spy er en utmerket samplingsprofiler for Python. Den lar deg få et innblikk i hva din Python-baserte applikasjon bruker tiden sin på.
Dette krever ikke at du endrer koden eller starter programmet på nytt. py-spy har lav overhead og er utviklet i Rust for å gi høyere hastighet. Den er ikke bygget for å operere i samme prosess som det profilerte Python-baserte programmet kjører i. Dette betyr at py-spy er svært trygg å bruke på produksjons Python-baserte koder.
Verktøyet lar deg registrere profiler, generere flammegrafer for å lage interaktive SVG-filer. Du kan også se andre alternativer, som å endre samplingsfrekvenser, native C-utvidelser for profilering, underprosesser, tråd-ID-er og mer. Du kan få en live-visning av funksjoner som skjer i programmene dine ved å bruke «topp»-kommandoen, og vise gjeldende anropsstabel ved å bruke «dump»-kommandoen for hver Python-tråd.
Den støtter alle CPython-tolkversjoner, for eksempel 2.3 – 2.7 og 3.3 – 3.8. Du kan installere py-spy fra PyPI eller GitHub.
Pyroskop
Programvaren for kontinuerlig profilering av Pyroskop, med åpen kildekode, hjelper deg å feilsøke alle ytelsesproblemer i applikasjonen din på få minutter.
Du kan starte serveren etterfulgt av agenten, uansett hva du bruker, Docker, Linux, eller om du leter etter Ruby eller Go-dokumenter, Pyroscope har det du trenger. Selv om du sikter på ti sekunder eller ti måneder med programvareprofileringsdata, gjør deres spesialdesignede lagringsmotor raske spørringer.
Du trenger ikke bekymre deg for overhead eller applikasjonsytelse, da de bruker samplingsprofileringsteknologi som ikke påvirker ytelsen. Pyroscope lagrer profileringsdataene dine effektivt; derfor er det kostnadseffektivt selv om du ønsker å lagre ulike profileringsdata fra forskjellige applikasjoner i årevis.
Den fungerer på macOS, Linux og Docker, og støtter programmer skrevet i Python, Go og Ruby.
Bubbleprof
Bubbleprof fra Clinic.js gir en ny og unik måte å profilere programvaren din som er skrevet i Node.js. Den bruker et «boble»-grensesnitt som hjelper alle, fra eksperter til nybegynnere, med å identifisere asynkron tid brukt i appen din.
Den visualiserer hvordan Node.js-prosessene dine fungerer ved å observere asynkroniserte operasjoner, gruppere dem, beregne forsinkelsene og kartlegge dem.
Bubbleprof identifiserer operasjonstider ved å se på størrelsen på bobler innenfor en bestemt gruppe operasjoner, som kan være koden din, en nodekjerne eller en modul. Den samler også tilstøtende grupper for å redusere rot.
For å beregne forsinkelsene når operasjonen flyter fra en gruppe til en annen, måler Bubbleprof lengden på pilene som forbinder bobler. I tillegg bruker den også forskjellige farger i måleprosessen. De indre fargede linjene representerer en blanding av asynkronoperasjonstyper som forårsaker forsinkelsen.
Pyinstrument
Optimaliser Python-koden din med Pyinstrument.
Den viser deg hvorfor Python-koden din er treg, og hjelper deg med å diagnostisere problemene slik at du kan oppnå lynrask ytelse.
For å bruke Pyinstrument trenger du ikke å skrive et Python-skript; bare kall Pyinstrument direkte fra kommandolinjen. Skriptet ditt vil kjøre som normalt, og verktøyet vil gi deg et farget sammendrag av områdene der applikasjonen brukte sin tid. Den leveres også med et Python API som gjør prosessen enda enklere.
Du har også muligheten til å profilere nettforespørsler i Flask og Django, som det finnes omfattende dokumentasjon for. Det er viktig å merke seg at Pyinstrument tilbyr statistisk profilering som registrerer anropsstabelen hvert 1 ms i stedet for å spore alle funksjonskall som gjøres av programmet ditt.
Dette er fordelaktig ettersom statistiske profiler har lavere overhead sammenlignet med sporingsprofiler. Siden den registrerer hele stabelen, blir det enkelt å spore dyre funksjonskall. I tillegg skjuler Pyinstrument (som standard) bibliotekrammer, slik at du kan fokusere på applikasjoner eller moduler som er ansvarlige for å påvirke ytelsen.
Feilsøking av ytelsesproblemer er enklere fordi Pyinstrument registrerer tid brukt ved hjelp av «veggklokke»-tid. Verktøyet sporer all tid programmet bruker på å lese filer, laste ned data, kommunisere med en database, osv.
Xdebug
For å forbedre ytelsen til koden din og gjøre utviklingsopplevelsen litt morsommere, tilbyr Xdebug omfattende muligheter for profilering og feilsøking.
Det er faktisk en PHP-utvidelse som lar deg finne flaskehalsene i PHP-applikasjonen din og analysere ytelsen ved hjelp av eksterne visualiseringsverktøy for å generere ytelsesgrafer.
Xdebug lager en detaljert utskrift som viser applikasjonens bane for å nå en feil, inkludert parameterne den sendte til en gitt funksjon. Dette gjøres for å spore feil. For å hjelpe utviklere med å få et klart bilde av hva som skjer, genererer den fargekodet informasjon sammen med strukturerte visninger.
Den leveres også med en ekstern debugger som du kan bruke til å koble Xdebug til en kjørende kode, IDE eller nettleser for å se kodebrudd og utføre koden linje for linje. En annen funksjon den tilbyr er kodedekning, som viser hvor mye av programmets kode som ble utført, og den hjelper deg også med enhetstester.
SPX
Enkel profileringsutvidelse (SPX) er en profileringsutvidelse utviklet for PHP. Den har noen unike egenskaper som skiller den fra andre profileringsutvidelser. Den er helt GRATIS å bruke og begrenset til din infrastruktur, noe som betyr at det ikke er noen risiko for datalekkasjer.
SPXs enkelhet gjør den veldig brukervennlig: alt du trenger er å sette en kommandolinje eller miljøvariabel for å profilere et skript. Eller du kan også slå på en bryter på en nettside for å profilere skriptet. Dette betyr at du ikke trenger å instrumentere koden manuelt.
Den støtter også et kjørende kommandolinjeskript – Ctrl-C. I tillegg eliminerer denne prosessen også behovet for å bruke en kommandolinjestarter eller en dedikert nettleserutvidelse. SPX støtter multimetrikker på rundt 22, inkludert forskjellige tids- og minnemålinger, objekter, filer i bruk, I/O, etc.
Den kan samle data uten å forlate konteksten. Nettgrensesnittet lar deg konfigurere/aktivere profilering for nettleserøkten som er i bruk, og viser alle profilerte skriptdetaljer og rapporter. Nettgrensesnittet lar deg velge en spesifikk rapport for dypere analyse, og har noen interaktive visualiseringer som Flamegraph, flat profil og tidslinje som kan skaleres til funksjonskall i millioner.
Prefiks
Prefiks fra Stackify er en enkel å installere og lett kodeprofiler som mange utviklere setter pris på. Den hjelper deg med å fjerne flaskehalsene i applikasjonsytelsen din for å optimalisere den og forbedre brukeropplevelsen.
Prefiks» overlegne sporings- og profileringsmuligheter lar deg raskt finne skjulte unntak, langsomme SQL-spørringer og mer. Den gir utviklerne dine den virkelige kraften til APM (applikasjonsytelsesovervåkning). For å oppnå dette validerer Prefiks kodeytelsen slik den er skrevet, og lar deg fremme koder som gir bedre resultater for testing.
På denne måten får du færre støttebilletter fra produksjonssiden, og hjelper utviklingsledere med å nå målene raskere. Oppdag alle underpresterende spørringer, ukjente flaskehalser og ORM-genererte spørringer.
Du kan også spore hver SQL-kallparameter, laste ned tidspunktene og se de berørte postene. Prefiks gjør det enklere å oppdage N+1-mønstre også. Glem å sortere gjennom alle de rotete loggene; samle dem for å enkelt finne problemer.
Prefiks lar deg finne konteksten til en mistenkelig logg i en spørringsforespørsel direkte, og hoppe fra en logg til en sporing for enkel feilsøking. Prefiks kaster lys over dårlige resultater, noe som er nyttig for å finne skjulte unntak og arbeide med eldre kode eller rammeverkseksjoner. Disse avhengighetene kan være webtjenester, tredjepartstjenester, hurtigbuffertjenester og andre.
Prefiks fungerer på Windows og Mac, og støtter .Net, Ruby, Java, PHP, Python og Node.js.
Scalene
Scalene er en høypresisjons, høyytelses GPU-, CPU- og minneprofiler for Python-baserte programmer. Den tilbyr flere fordeler i forhold til andre profiler, som å kjøre bestillinger av raskere størrelser og levere mer dybdeinformasjon.
Scalene er utrolig rask og bruker sampling i stedet for instrumentering. Den er ikke engang avhengig av sporingsfasilitetene til Python. I tillegg er overheaden vanligvis under 10–20 %. Dette verktøyet utfører programvareprofilering på linjenivå, og peker ut de kodelinjene som er ansvarlige for programmets utførelsestid.
Denne informasjonen er mer verdifull enn den man får ved profilering på funksjonsnivå. Scalene skiller tiden brukt eksklusivt i Python fra den for opprinnelig kode, som inkluderer biblioteker. Siden de fleste Python-programmerere ikke vil optimalisere den opprinnelige kodeytelsen, kan utviklere fokusere innsatsen på å optimalisere koder de faktisk kan forbedre.
Den fremhever hotspots i rødt, noe som gjør det enklere å oppdage CPU-tid/minnetildeling, og enkelt skille systemtid for å finne I/O-problemer. Scalene kan rapportere GPU-tid, profilere minnebruk og spore CPU-bruk. Scalene kan også identifisere mulige minnelekkasjer, profilkopieringsvolum og generere reduserte profiler for kodelinjer som bruker mer enn 1 % av CPU.
VisualVM
Alt-i-ett-feilsøkingsverktøyet for Java, VisualVM, er utviklet for bruk både i produksjons- og utviklingsfasen. Det er en visuell programvare som integrerer lette profileringsfunksjoner og kommandolinje JDK-verktøy.
VisualVM overvåker applikasjoner som kjører på Java 1.4+ og feilsøker dem ved hjelp av flere teknologier som JMX, jvmstat, Attach API og Serviceability Agent. Dette verktøyet passer perfekt for de ulike kravene til kvalitetsingeniører, systemadministratorer og sluttbrukere.
Den oppdager automatisk eksternt og lokalt kjørende Java-baserte applikasjoner og viser dem. Verktøyet lar deg også definere programmene manuelt ved å bruke JMX-tilkoblingen. For hver prosess viser den typiske kjøretidsdata som PID, beståtte argumenter, JDK-hjem, hovedklasse, JVM-flagg, JVM-versjon og system- og argumentegenskaper.
VisualVM overvåker CPU-bruk, heap og metaspace eller permanent generasjonsminne, kjørende tråder og lastede klasser i en applikasjon. Den viser alle løpende tråder i en tidslinje med aggregerte søvn-, løp-, park-, monitor- og ventetider.
Både instrumenterings- og samplingsprofiler kan utføres ved hjelp av VisualVM for minneadministrasjon og applikasjonsytelse. Den viser tråddumper for å gi rask innsikt i prosesser. Den viser også og lager .hprof-øyeblikksbilder på forespørsel for å hjelpe deg med å avdekke haugevis av ineffektivitet og feilsøke minnelekkasjer.
Videre kan VisualVM lese grunnleggende data om en krasjet Java-basert prosess, sammen med miljøet. Du kan analysere appene dine offline; den kan lagre app-kjøretidsmiljø og -konfigurasjon med heap dumps, tråddumper og profileringsøyeblikksbilder som du kan behandle offline på et senere tidspunkt.
Den fungerer på Windows, Linux og Unix.
Orbit Profiler
Visualiser C/C++-applikasjonen din og finn ytelsesproblemer raskt ved hjelp av Orbit Profiler. Dette er et feilsøkingsverktøy og en frittstående profiler som har som mål å hjelpe utviklere med å se og forstå den komplekse appens utførelsesflyt.
Den gir et skarpt overblikk over alt som skjer inne i appen, slik at du raskt kan fjerne flaskehalser i ytelsen og gjenopprette applikasjonens høye ytelse.
Orbit Profiler kan fungere effektivt på enhver C- eller C++-app, forutsatt at den har tilgang til PDB-filen. Deretter starter profileringen når du har fullført nedlastingen av programmet. Verktøyet hopper til målprosessen, kobler seg til utvalgte funksjoner og utfører profilering.
Den kan til og med fungere på de optimaliserte slutt- eller fraktbyggene dine. I tillegg til dynamisk instrumentering tilbyr Orbit Profiler også «alltid på» samplingsfunksjoner, som er raske, tilgjengelige hele tiden og robuste.
Den fungerer på Windows og Linux.
Uber JVM Profiler
Med avanserte profileringsmuligheter er Uber JVM Profiler et annet godt alternativ for dine Java-baserte applikasjoner.
Den tilbyr en Java Agent som samler inn flere stakkspor og metrikker for Spark/Hadoop JVM-prosesser på en distribuert måte, som for eksempel minne-/CPU-/IO-målinger.
Verktøyet kan spore Java-argumenter og -metoder i brukerkoder uten å endre dem. Du kan også bruke det til å spore anropsforsinkelsen til HDFS-navnenoder for hver Spark-app, og finne problemer. Den kan til og med spore Spark-appens HDFS-filbaner for å finne ut varme filer og utføre ytterligere optimalisering.
Uber JVM Profiler ble opprinnelig utviklet for å profilere Spark-apper, som vanligvis omfatter mange maskiner eller prosesser for én applikasjon. Derfor kan brukerne enkelt korrelere beregninger for disse maskinene eller prosessene.
Verktøyet fungerer imidlertid som en typisk Java-agent, og du kan bruke det til alle JVM-prosessene dine. Funksjonene omfatter:
- Feilsøking av minnebruk for Spark-apputførere, som for eksempel Java-heap-minne, innebygd minne, ikke-heap-minne, bufferpool og minnepool
- Feilsøking av CPU-bruk og søppeltømmertid
- Feilsøking av Java-klassemetoder for deres frekvens og tids- eller varighetsprofilering
- Argumentprofilering (feilsøking og sporing av Java-klassemetodekall og dens argumentverdi)
- Stakksporprofilering og generering av flammegrafer for CPU-tid
- Feilsøking av I/O-beregninger og JVM-trådberegninger
Tracy
Tracy er et nyttig verktøy som hjelper utviklere med å enkelt feilsøke PHP-programmer. Den har et brukervennlig design og avanserte funksjoner som CLI-støtte, feilsøking av AJAX-anrop og mer.
Den kan finne og rette feil raskt, dumpe variabler, logge feil, visualisere minneforbruk og identifisere utførelsestiden for spørringer eller skript. Ved å bruke fargekoding og fremheve problemer i rødt med tydelige forklaringer, kan du enkelt visualisere unntak og feil, og forstå dem.
Tracy leveres med loggingsfunksjonalitet og miljøautodeteksjon. Den lagrer data i loggfiler og viser serverfeilmeldinger til en besøkende under nedetid. Tracy kan også integreres med Drupal 7, OpenCart, WordPress og mer.
vprof
vprof er en visuell profiler for Python-applikasjoner. Den gir rike, interaktive visualiseringer for Python-programmets ulike egenskaper, som for eksempel minnebruk og kjøretid.
Den er tilgjengelig under en BSD-lisens og støtter Python 3.4 og nyere.
Konklusjon
Applikasjonsytelse er en avgjørende faktor for å oppfylle forventningene til sluttbrukerne. Hvis det oppstår ytelsesproblemer, må du være klar til å diagnostisere problemet før det påvirker sluttbrukeropplevelsen.
Derfor bør du fortsette å optimalisere applikasjonene dine og fikse problemer umiddelbart for å levere en superrask applikasjonsytelse til brukerne ved hjelp av verktøyene jeg har nevnt i denne artikkelen.
Her er en rask sammenligningstabell som viser profilererne ovenfor og hva de oftest brukes til.
Navn | Språk |
py-spy | Python |
Pyroskop | Python, Ruby, Go |
Bubbleprof | Node.js |
Pyinstrument | Python |
Xdebug | PHP |
SPX | PHP |
Prefiks | Python, .NET, Java, Node.js, Ruby, PHP |
Scalene | Python |
VisualVM | Java |
Orbit Profiler | C, C++ |
Uber JVM Profiler | Java |
Tracy | PHP |
vprof | Python |