13 Софтвер за профилисање за отклањање проблема са перформансама апликације

Glavni cilj vaše aplikacije je da efikasno služi krajnjim korisnicima.

Ona mora biti brza, responzivna, jednostavna za korišćenje i pouzdana, pored drugih poželjnih funkcija.

Međutim, održavanje softvera na način koji kontinuirano pruža vrhunske performanse nije jednostavan zadatak.

Kada vaš kod počne da poziva nepotrebne funkcije, zapliće se u samog sebe, nailazi na greške i ulazi u suvišne petlje, može doći do neefikasnosti. Vaša aplikacija može postati spora, nereagujuća ili se ponašati nepredvidivo.

Ako ne rešite ove probleme, ukupne performanse aplikacije će biti ugrožene.

Posledično, vaši korisnici mogu postati nezadovoljni ili potpuno prestati da koriste vašu aplikaciju zbog loših performansi i sporosti. To ne samo da narušava vašu reputaciju, već vas i košta u smislu prihoda i profita. Zbog toga, vaš kod treba analizirati, pregledati i otkloniti greške kako bi se postigao optimalan učinak. Brz način da to uradite jeste korišćenje softverskog alata za profilisanje, koji prati i otklanja greške u vašem kodu i eliminiše uska grla koja se odnose na performanse.

U ovom članku ćete naučiti o profilisanju softvera i kako vam ono može biti od pomoći. Zatim ću vas provesti kroz neke od najboljih alata za profilisanje, koji će vam pomoći da otklonite greške u aplikaciji i optimizujete njene performanse.

Šta je softversko profiliranje?

Profilisanje softvera je dinamička analiza koda, u kojoj se istražuje ponašanje programa pomoću podataka prikupljenih tokom njegovog izvršavanja. Cilj je da se utvrde različiti delovi programa koje je potrebno optimizovati kako bi se povećala brzina aplikacije, njena odzivnost i smanjila potrošnja memorije i resursa.

Softverski profiler obično meri trajanje i učestalost poziva funkcija, zajedno sa memorijom ili vremenskom složenošću koja je povezana sa programom. Dostupni su i specifični profileri, poput onih za memoriju.

Profilisanje se obično izvodi instrumentiranjem izvornog koda programa. Profileri mogu koristiti različite tehnike profilisanja, poput instrumentalnih metoda, metoda zasnovanih na događajima, statističkih ili simulacionih metoda.

Zašto je profiliranje softvera važno?

Profilisanje softvera je neophodno kako bi se utvrdila upotreba resursa i vreme izvršavanja povezano sa određenom funkcijom. Pomaže u optimizaciji brzine programa i istovremeno osigurava da troši minimalne resurse.

Takođe, koristi se za praćenje i optimizaciju upotrebe CPU-a i vremena izvršavanja komandi.

Zbog toga je odabir pravog softverskog alata za profiliranje ključan da biste bili sigurni da možete brže otkloniti greške u performansama, poboljšati efikasnost i pružiti bolje iskustvo krajnjem korisniku. Mnogi profileri dolaze sa detaljnim izveštajima i interaktivnim grafikonima i vizualizacijama koji vam pomažu da pronađete tačan uzrok problema, što olakšava njihovo rešavanje.

U nastavku je lista nekih od najboljih softverskih profilera koje možete isprobati. Obavestite nas koji vam je najbolje poslužio.

py-spy

py-spy je odličan alat za profiliranje zasnovan na uzorkovanju za Python. Omogućava vam da brzo vidite na šta vaša aplikacija, bazirana na Python-u, troši najviše vremena.

Za to ne morate da menjate svoj kod ili ponovo pokrećete program u celosti. py-spy ima nizak režijski trošak i razvijen je u Rust-u radi veće brzine. Nije dizajniran da radi u istom procesu gde se izvršava vaš profilisani program, baziran na Python-u. To znači da je py-spy vrlo siguran za upotrebu na produkcijskim kodovima zasnovanim na Python-u.

Alat vam omogućava da snimate profile, generišete „flame graphs“ (grafikone plamena) za kreiranje interaktivnih SVG datoteka. Možete pogledati i druge opcije, kao što je promena stope uzorkovanja, profilisanje izvornih C ekstenzija, podprocesa, ID-ova niti i još mnogo toga. Pregled funkcija koje se izvršavaju u vašem programu možete dobiti pomoću komande ‘top’, a prikaz trenutnog steka poziva pomoću komande ‘dump’ za svaku Python nit.

Podržava sve verzije CPython interpretera, od 2.3 do 2.7 i 3.3 do 3.8. py-spy možete instalirati sa PyPI-a ili GitHub-a.

Pyroscope

Softver otvorenog koda za kontinuirano profiliranje Pyroscope vam pomaže da rešite sve probleme sa performansama u vašoj aplikaciji za samo nekoliko minuta.

Možete pokrenuti server praćen agentom bez obzira na to šta koristite, Docker, Linux ili tražite Ruby ili Go dokumente, Pyroscope vas pokriva. Čak i ako želite deset sekundi ili deset meseci podataka o profilisanju softvera, njihov prilagođeni mehanizam za skladištenje omogućava brze upite.

Ne morate da brinete o režijskim troškovima ili performansama aplikacije, jer koriste tehnologiju profilisanja zasnovanu na uzorkovanju, koja ne utiče na performanse. Pyroscope efikasno skladišti vaše podatke o profilisanju; stoga je isplativo za vas čak i ako želite da godinama skladištite različite podatke o profilisanju iz raznih aplikacija.

Radi na macOS-u, Linux-u i Docker-u i podržava programe napisane u Python-u, Go-u i Ruby-u.

Bubbleprof

Bubbleprof by Clinic.js pruža svež i jedinstven način profilisanja vašeg softvera napisanog u Node.js. Koristi korisnički interfejs sa „mehurićima“ koji pomaže svima, od stručnjaka do početnika, da utvrde asinhrono vreme provedeno u vašoj aplikaciji.

On vizualizuje kako vaši Node.js procesi funkcionišu tako što posmatra njegove asinhronizovane operacije, grupiše ih, izračunava kašnjenja i mapira ih.

Bubbleprof određuje trajanje operacija gledajući veličinu mehurića unutar određene grupe operacija, koje mogu biti vaš kod, jezgro čvora ili modul. Takođe, grupiše susedne grupe kako bi smanjio nered.

Kako bi izračunao kašnjenja kako operacija prelazi iz jedne grupe u drugu, Bubbleprof meri dužinu strelice koja povezuje mehuriće. Pored toga, koristi i različite boje u procesima merenja. Istovremeno, unutrašnje obojene linije predstavljaju mešavinu tipova asinhronizovanih operacija kao uzrok kašnjenja.

Pyinstrument

Optimizujte svoj Python kod uz pomoć Pyinstrument.

Pokazuje vam zašto je vaš Python kod spor i pomaže vam da dijagnostikujete probleme, kako biste mogli da postignete izuzetno brze performanse.

Da biste koristili Pyinstrument, ne morate da pišete Python skriptu; samo pozovite Pyinstrument direktno pomoću komandne linije. Vaša skripta će se izvršavati normalno, a alat će dati obojeni rezime oblasti u kojima je aplikacija provela najviše vremena. Takođe, dolazi sa Python API-jem koji proces čini još jednostavnijim.

Imate opciju da profilišete web zahteve u Flask-u i Djangu, za koje postoji detaljna dokumentacija. Imajte na umu da Pyinstrument nudi statističko profiliranje, koje beleži stek poziva svakih 1 ms, umesto da prati svaki poziv funkcije koji vaš program uputi.

Ovo je korisno, jer statistički profileri imaju manji režijski trošak u poređenju sa profilerima za praćenje. S obzirom na to da snima ceo stek, praćenje skupih poziva funkcija postaje lako. Pored toga, Pyinstrument takođe skriva (po defaultu) okvire biblioteke, omogućavajući vam da se fokusirate na aplikacije ili module koji su odgovorni za uticaj na performanse.

Otklanjanje grešaka u performansama je olakšano, jer Pyinstrument beleži vreme provedeno koristeći vreme „zidnog sata“. Alat prati celokupno vreme izvršavanja programa, uključujući čitanje datoteka, preuzimanje podataka, komunikaciju sa bazom podataka itd.

Xdebug

Da biste poboljšali performanse svog koda i učinili razvojno iskustvo malo zabavnijim, Xdebug dolazi sa širokim spektrom mogućnosti za profiliranje i otklanjanje grešaka.

To je, zapravo, PHP ekstenzija koja vam omogućava da pronađete uska grla u vašoj PHP aplikaciji i analizirate njene performanse pomoću spoljašnjih alata za vizualizaciju, koji generišu grafikone performansi.

Xdebug kreira detaljan izlaz, koji prikazuje putanju aplikacije do greške, uključujući parametre koji su prosleđeni datoj funkciji. To se radi radi praćenja grešaka. Kako bi pomogao programeru da jasno razume stvari, Xdebug generiše informacije označene bojama, uz strukturirane prikaze.

Takođe, dolazi sa programom za otklanjanje grešaka sa udaljene lokacije, koji možete koristiti da povežete Xdebug sa aktivnim kodom, IDE-om ili pregledačem, kako biste videli tačke prekida koda i izvršavali kod red po red. Još jedna funkcija koju nudi je pokrivenost koda, koja pokazuje koliko je koda vašeg programa izvršeno, a takođe vam pomaže i pri testiranju jedinica.

SPX

Jednostavan dodatak za profiliranje (SPX) je ekstenzija za profiliranje dizajnirana za PHP. Ima neke jedinstvene karakteristike, koje ga izdvajaju od drugih ekstenzija za profiliranje. Potpuno je BESPLATAN za korišćenje i ograničen je samo na vašu infrastrukturu, što znači da nema rizika od curenja podataka.

Jednostavnost SPX-a čini ga vrlo lakim za korišćenje: sve što vam je potrebno je da podesite komandnu liniju ili promenljivu okruženja za profiliranje skripte. Ili, takođe možete uključiti radio dugme na web stranici kako biste profilisali skriptu. Kao rezultat toga, ne morate ručno instrumentirati svoj kod.

Takođe podržava pokretanje skripte putem komandne linije – Ctrl-C. Pored toga, ovaj proces takođe eliminiše potrebu za korišćenjem pokretača komandne linije ili namenske ekstenzije pregledača. SPX podržava više od 22 metrike, uključujući različite metrike vremena i memorije, objekte, datoteke u upotrebi, I/O itd.

Može da prikuplja podatke bez napuštanja konteksta. Njegov web korisnički interfejs omogućava konfigurisanje/omogućavanje profilisanja za sesiju pregledača koja se trenutno koristi i navodi sve detalje profilisanih skripti i izveštaje. Web korisnički interfejs vam omogućava da odaberete određeni izveštaj za dublju analizu i sadrži neke interaktivne vizualizacije, kao što su „Flamegraph“, ravni profil i vremenska linija, koja se može skalirati u milionske pozive funkcije.

Prefix

Prefix by Stackify je jednostavan za instalaciju i lagan profiler koda koji mnogi programeri vole. Pomaže vam da eliminišete uska grla u performansama aplikacije, kako biste ih optimizovali i poboljšali korisničko iskustvo.

Prefix-ove superiorne mogućnosti praćenja i profilisanja omogućavaju vam da brzo pronađete skrivene izuzetke, spore SQL upite i još mnogo toga. On vašim programerima pruža pravu snagu APM-a (nadgledanje performansi aplikacije). Za to, Prefix proverava performanse koda onako kako je napisan i omogućava vam da testirate kodove sa boljim performansama.

Na ovaj način se dobija manje tiketa za podršku od strane produkcije i pomaže menadžerima razvoja da brže postignu ciljeve. Otkrijte sve upite sa lošim učinkom, nepoznata uska grla i upite koje generiše ORM.

Takođe možete da pratite svaki parametar SQL poziva, preuzmete podatke o trajanju i pregledate pogođene zapise. Prefix takođe olakšava uočavanje N+1 obrazaca. Zaboravite na sortiranje svih tih neurednih logova; spojite ih kako biste lako locirali probleme.

Prefix vam omogućava da pronađete kontekst sumnjivog loga unutar upita i da pređete sa jednog loga na trag za otklanjanje grešaka bez napora. Prefix rasvetljava zavisnosti sa lošim učinkom, što je korisno za pronalaženje skrivenih izuzetaka i rad sa zastarelim kodom ili delovima okvira. Ove zavisnosti mogu biti web servisi, usluge trećih strana, keš memorije i druge.

Prefix radi na Windows-u i Mac-u i podržava .Net, Ruby, Java, PHP, Python i Node.js.

Scalene

Scalene je visokoprecizan GPU, CPU i memorijski profiler visokih performansi za programe bazirane na Python-u. Nudi nekoliko prednosti u odnosu na druge programere za profiliranje, kao što su brži redosled rada i pružanje detaljnijih informacija.

Scalene je izuzetno brz i koristi uzorkovanje, a ne instrumentaciju. Ne oslanja se čak ni na Python-ove mogućnosti praćenja. Pored toga, njegovi troškovi su obično ispod 10-20%. Ovaj alat vrši profiliranje softvera na nivou linije i ukazuje na one linije koda koje su odgovorne za vreme izvršavanja vašeg programa.

Ovi detalji su vredniji od onih u profilisanju na nivou funkcije. Scalene odvaja vreme provedeno isključivo u Python-u od vremena prirodnog koda koji uključuje biblioteke. S obzirom da većina Python programera neće optimizovati performanse izvornog koda, programeri mogu da usredsrede svoje napore na optimizaciju onog koda koji se zaista može poboljšati.

On ističe „vruće tačke“ crvenom bojom, što vam olakšava uočavanje dodeljivanja CPU vremena/memorije i lako odvajanje sistemskog vremena kako biste pronašli I/O probleme. Scalene može da prijavi GPU vreme, profilise upotrebu memorije i prati upotrebu CPU-a. Scalene takođe može da identifikuje moguća curenja memorije, količinu kopiranja profila i generiše redukovane profile za linije koda koje troše više od 1% CPU-a.

VisualVM

Sveobuhvatni alat za rešavanje problema za Javu, VisualVM, dizajniran je za upotrebu u fazi proizvodnje i razvoju. To je vizuelni softver koji integriše lake funkcionalnosti profilisanja i JDK alate komandne linije.

VisualVM nadgleda aplikacije koje rade na Javi 1.4+ i rešava ih pomoću nekoliko tehnologija kao što su JMX, jvmstat, Attach API i Serviceability Agent. Ovaj alat savršeno odgovara različitim zahtevima inženjera kvaliteta, sistem administratora i krajnjih korisnika.

Automatski otkriva aplikacije bazirane na Javi koje se izvršavaju lokalno i udaljeno, i prikazuje ih. Alat vam takođe omogućava da ručno definišete programe koristeći JMX vezu. Za svaki proces, on prikazuje tipične podatke o vremenu izvršavanja, kao što su PID, prosleđeni argumenti, JDK startna pozicija, glavna klasa, JVM zastavice, JVM verzija, svojstva sistema i argumenti.

VisualVM prati upotrebu CPU-a, hrpu i meta prostor ili memoriju trajne generacije, pokrenute niti i učitane klase u aplikaciji. Prikazuje sve pokrenute niti u vremenskoj liniji, sa agregiranim vremenima spavanja, pokretanja, parkiranja, nadgledanja i čekanja.

I instrumentacija i profileri zasnovani na uzorkovanju mogu se koristiti sa VisualVM-om za upravljanje memorijom i performansama aplikacije. Prikazuje dump-ove niti kako bi pružio brz uvid u procese. Takođe pregleda i kreira .hprof snimke na zahtev, kako bi vam pomogao da otkrijete neefikasnost korišćenja gomile i otklonite curenja memorije.

Štaviše, VisualVM može da čita osnovne podatke o srušenom procesu zasnovanom na Javi, zajedno sa njegovim okruženjem. Možete analizirati svoje aplikacije van mreže; može da sačuva okruženje za izvršavanje aplikacije i konfiguraciju sa snimljenim snimcima gomile, dumpovima niti i snimcima profilisanja, koje možete da obradite van mreže u kasnijoj fazi.

Radi na Windows-u, Linux-u i Unix-u.

Orbit Profiler

Vizualizujte svoju C/C++ aplikaciju i brzo pronađite probleme sa performansama uz pomoć Orbit Profiler-a. To je alat za otklanjanje grešaka i samostalni profiler, čiji je cilj da pomogne programerima da vide i razumeju tok izvršavanja složene aplikacije.

Pruža jasan pregled svega što se dešava unutar aplikacije, tako da možete brzo eliminisati uska grla u performansama i vratiti visoke performanse vašoj aplikaciji.

Orbit Profiler može efikasno da radi na bilo kojoj C ili C++ aplikaciji, pod uslovom da može da pristupi PDB datoteci. Zatim će početi sa profilisanjem kada završite preuzimanje njegovog programa. Alat prelazi na ciljni proces, povezuje se sa odabranim funkcijama i vrši profiliranje.

Može čak i da radi na vašim optimizovanim finalnim ili isporučenim verzijama. Pored dinamičke instrumentacije, Orbit Profiler nudi i „uvek uključene“ mogućnosti uzorkovanja, koje su brze, uvek dostupne i pouzdane.

Radi na Windows-u i Linux-u.

Uber JVM Profiler

Pun naprednih mogućnosti profilisanja, Uber JVM Profiler je još jedna dobra opcija za vaše aplikacije bazirane na Javi.

Nudi Java agenta koji prikuplja brojne stek tragove i metrike za Spark/Hadoop JVM procese na distribuiran način, na primer, metrike memorije/CPU-a/IO.

Alat može da prati java argumente i metode u korisničkim kodovima bez njihovog menjanja. Takođe, možete ga koristiti za praćenje kašnjenja poziva HDFS čvorova imena za svaku Spark aplikaciju i pronalaženje problema. Može čak i da prati putanje HDFS datoteka aplikacije Spark, kako bi pronašao „vruće“ datoteke i izvršio dalju optimizaciju.

Uber JVM Profiler je prvobitno kreiran da profilira Spark aplikacije, koje uglavnom uključuju mnogo mašina ili procesa za jednu aplikaciju. Tako, ljudi mogu lako da povežu metrike za ove mašine ili procese.

Međutim, alat funkcioniše kao tipičan Java agent i možete ga koristiti za bilo koji od vaših JVM procesa. Njegove karakteristike uključuju:

  • Otklanjanje grešaka u korišćenju memorije Spark izvršilaca aplikacija, kao što su Java heap memorija, izvorna memorija, memorija koja nije hrpa, bafer grupa i memorijska grupa
  • Otklanjanje grešaka u upotrebi CPU-a i vremenu sakupljanja smeća
  • Otklanjanje grešaka u metodama Java klase za njihovu učestalost i vreme ili profiliranje trajanja
  • Profilisanje argumenata (otklanjanje grešaka i praćenje poziva metode Java klase i njene vrednosti argumenta)
  • Stacktrace profiliranje i generisanje „Flamegraphs“ za CPU vreme
  • Otklanjanje grešaka I/O metrika i JVM Thread metrika

Tracy

Tracy je koristan alat koji programerima pomaže da lako otklone greške u PHP programima. Ima jednostavan dizajn i napredne funkcije, kao što su podrška za CLI, otklanjanje grešaka u AJAX pozivima i još mnogo toga.

Može brzo da pronađe i ispravi greške, izbacuje promenljive, evidentira greške, vizualizuje potrošnju memorije i određuje vreme izvršavanja upita ili skripti. Korišćenje kodiranja bojama i isticanje problema crvenom bojom uz jasna objašnjenja pomaže vam da lako vizualizujete izuzetke i greške, i da ih razumete.

Tracy dolazi sa funkcijom evidentiranja i automatskom detekcijom okruženja. On skladišti podatke u datotekama logova i prikazuje poruke o grešci servera posetiocima tokom zastoja. Tracy takođe može da se integriše sa Drupal 7, OpenCart, WordPress-om i još mnogo toga.

vprof

vprof je vizuelni profiler za Python aplikacije. Pruža bogate, interaktivne vizualizacije za različite karakteristike vašeg Python programa, kao što su upotreba memorije i vreme rada.

Dostupan je pod BSD licencom i podržava Python 3.4 i novije verzije.

Zaključak

Performanse aplikacije su ključni faktor u ispunjavanju očekivanja krajnjih korisnika. Ako dođe do problema sa performansama, morate biti spremni da dijagnostikujete problem pre nego što on utiče na iskustvo krajnjeg korisnika.

Stoga, nastavite da optimizujete svoje aplikacije i odmah rešavajte probleme, kako biste kontinuirano pružali superbrze performanse aplikacije korisnicima, koristeći alate koje sam pomenuo u ovom članku.

Sledi brza uporedna tabela koja prikazuje navedene profilere i njihovu primarnu namenu.

Naziv Jezici
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