Suorituskykyongelmien vianmääritys tuotannossa voi olla tuskallista ja joissakin tapauksissa mahdotonta ilman oikeita työkaluja. Java-profilointia on ollut olemassa jo iät ja ajat, mutta java-profiloijat, joita useimmat kehittäjät ajattelevat, ovat vain yhtä tyyppiä: tavallisia JVM-profiloijia.
Mutta yhden tyyppisen profiloijan käyttäminen ei riitä.
Aseta, että analysoit sovelluksesi suorituskykyä. On olemassa useita profiloinnin toimintoja, joita voit suorittaa. Yleensä tavalliset profilointilaitteet käsittelevät muistiprofilointia, suorittimen profilointia ja säieprofilointia.
Mutta vaikka tämä kattavuus olisikin kunnossa, käyttämällä useiden profilointilaitteiden yhdistelmää löydät enemmän suorituskykyongelmia. Tämä johtuu siitä, että jokainen profiloija on tietyllä osa-alueella parempi suorituskykyongelmien jahtaamisessa.
Tässä postauksessa keskustelemme kolmesta erityyppisestä Java-profiloijasta ja siitä, miksi tarvitsemme niitä kaikkia sovellusta kehitettäessä. Aloitamme tyypeistä ja sukellamme syvälle kuhunkin niistä.
Katsotaanpa kolmea erilaista Java-profilointityyppiä:
- Normaalit JVM-profilointityypit, jotka seuraavat JVM:n jokaista yksityiskohtaa (suorittimen, säikeen, muistin, roskienkeräyksen jne.).
- Kevyet profilointityypit, jotka korostavat sovellustasi hieman abstrahoiden.
- APM-työkalut (Application Performance Management), joita käytetään sovellusten live-seurantaan tuotantoympäristöissä.
Vakiomuotoiset JVM-profiloijat
Tuotteet, kuten VisualVM, JProfiler, YourKit ja Java Mission Control.
Vakiomuotoinen JVM-profiloija tarjoaa varmasti eniten dataa, mutta se ei kuitenkaan ole välttämättä hyödyllisin tieto. Tämä riippuu debuggaustehtävän tyypistä.
JVM-profiloijat seuraavat kaikkia metodikutsuja ja muistin käyttöä. Näin kehittäjä voi sukeltaa kutsurakenteeseen haluamastaan kulmasta.
Pros:
- Suuri muistivuodon jäljittämiseen, tavalliset profilointilaitteet kertovat yksityiskohtaisesti kaiken JVM:n muistinkäytön ja mitkä luokat/objektit ovat vastuussa. Mahdollisuus suorittaa roskienkeruu manuaalisesti ja tarkastella sitten muistinkulutusta voi helposti valottaa luokkia ja prosesseja, jotka pitävät muistia hallussaan virheellisesti.
- Hyvä CPU-käytön seurantaan, Java-profilerissa on yleensä CPU-näytteenotto-ominaisuus, jolla voidaan seurata ja aggregoida CPU-aikaa luokittain ja metodeittain, mikä auttaa nollaamaan kuumat kohdat.
Miinukset:
- Edellyttää suoran yhteyden seurattavaan JVM:ään; tämä rajoittaa käytön useimmissa tapauksissa kehitysympäristöihin. (Huomautus: jotkin profilointilaitteet voivat toimia rajoitetusti säike- ja muistitiedostojen dumppien avulla.)
- Hidastavat sovelluksen toimintaa; tarjottujen yksityiskohtien korkeaan tasoon tarvitaan paljon laskentatehoa.
Kevytrakenteiset Java-transaktioprofilointilaitteet
Tuotteet kuten XRebel ja Stackify Prefix.
Kevytrakenteiset profilointilaitteet ottavat erilaisen lähestymistavan sovelluksesi seurantaan pistämällä itsensä suoraan koodiin.
- Aspect-profilointilaitteet käyttävät aspektiorientoitunutta ohjelmointia (AOP) pistämällä koodia määritettyjen metodien alkuun ja loppuun. Injektoitu koodi voi käynnistää ajastimen ja ilmoittaa kuluneen ajan, kun metodi päättyy. Nämä profilointilaitteet on helppo ottaa käyttöön, mutta sinun on tiedettävä, mitä haluat profiloida. Katso esimerkki kohdasta Spring AOP Method Profiling.
- Java Agent -profiloijat käyttävät Java Instrumentation API:ta injektoimaan koodia sovellukseen. Tällä menetelmällä on parempi pääsy sovellukseesi, koska koodi kirjoitetaan uudelleen tavukooditasolla. Tämä mahdollistaa minkä tahansa sovelluksessasi suoritettavan koodin instrumentoinnin, olipa se kirjoittamaasi koodia tai kolmannen osapuolen kirjastoja, joista sovelluksesi on riippuvainen. Tutustu tähän Java-agenttien esittelyyn nähdäksesi, miten tämä kaikki toimii.
Aspect-profiloijat ovat melko helppoja asentaa, mutta ne ovat rajoitettuja sen suhteen, mitä ne voivat valvoa, ja niitä rasittaa se, että niiden on määriteltävä yksityiskohtaisesti kaikki se, mitä haluat seurata. Java Agentsilla on suuri etu seurannan syvyydessä, mutta ne ovat paljon monimutkaisempia kirjoittaa.
Stackify Prefix on kehittäjäsuuntautunut Java-profiloija, joka käyttää kulissien takana Java Agent -profilointimenetelmää.
Hienoa on se, että Prefix tietää jo valmiiksi halutuimmat luokat ja kolmannen osapuolen kirjastot, joita kehittäjät haluavat instrumentoida – sinun ei siis tarvitse eritellä niitä kaikkia. Lisäksi se ottaa kaikki instrumentoinnista saadut tilastot ja näyttää ne yksinkertaisella ja ymmärrettävällä tavalla.
Esimerkiksi, kun Hibernatea käyttävää sovellusta ajetaan, Prefix ei vain selitä yksityiskohtaisesti kyselyjen kulunutta aikaa, vaan näyttää myös tuotetun SQL:n parametriarvot. Kun sovelluksesi kutsuu SOAP/REST API:ta, Prefix näyttää pyynnön ja vastauksen sisällön.
Low Overhead, Java JVM Profiling in Production (APM)
Kaikki tähänastiset profilointilaitteet ovat olleet loistavia kehitystyössä, mutta järjestelmän suorituskyvyn seuraaminen tuotannossa on kriittisen tärkeää.
Tuotanto on aina erilainen maisema – kehitys- ja staging-asetelmilla ei tyypillisesti ole samoja tietokokonaisuuksia ja kuormitusta.
Javan APM-työkalut käyttävät tyypillisesti Java Agent -profilointimenetelmää, mutta erilaisilla instrumentointisäännöillä, jotta ne voidaan ajaa vaikuttamatta suorituskykyyn tuotannossa. Näiden profilointityökalujen juju on tarjota oikeaa tietoa älykkäällä tavalla, jotta ne eivät vie suorittimen sykliä.
Stackifyn Retrace on APM-työkalu, joka käyttää samaa tekniikkaa kuin Stackify Prefix muutamilla muutoksilla, jotta se toimisi sujuvasti staging- ja tuotantoympäristöissä.
Tämähän onnistuu aggregoimalla ajoitustilastoja ja poimimalla näytteenottoon perustuvia jälkiä. Näin saat metoditason näkyvyyttä sovelluksesi koodiin, joka toimii tuotannossa.
Jos sinulla on siis hidas verkkopyyntö, se näkyy jäljenä Retracessa. Sieltä voit sukeltaa sisään ja nähdä, mitkä metodit ovat syyllisiä.
Retrace Screenshot: Web Request Aggregation over 4 hours
Miksi tarvitset kaikki kolme profiloijaa sovellukseesi?
Vakioprofiloijat ovat hyviä löytämään suorituskykyongelmia kehitysvaiheessa. Tuotanto on kuitenkin eri skenaario. Sovelluksesi käyttäytyminen voi muuttua saapuvan liikenteen, palvelimen pyynnön, vastauksen ja monien muiden asioiden perusteella.
Mikä on siis ratkaisu tuotantoympäristöön? APM-työkalut ovat vastaus. APM-työkalut kohdistuvat tuotantoympäristöön ja antavat raportin sovelluksesi suorituskyvystä.
Vakioprofiilintarkkailijat auttavat siis kehityksessä ja APM-työkalut tuotannossa. Saatat miettiä, mihin kevyitä tapahtumaprofiilintarkkailijoita tarvitaan.
Nyt, kevyet profilointilaitteet noudattavat erilaista lähestymistapaa koodin profilointiin. Ne pistävät itsensä suoraan koodiin – erityisesti metodin alussa ja lopussa.
Ne ovat myös helppoja ottaa käyttöön ja kuluttavat suhteellisen vähän resursseja. Tämä on erittäin hyödyllistä sovelluksissa, jotka käyttävät laitteiston transaktiomuistia. Nämä sovellukset vaativat hienostuneita analyysityökaluja, jotka osoittavat tarkalleen, mikä metodi tai funktio aiheuttaa suorituskykyongelmia.
Voidaan epäilemättä sanoa, että jos kehität monimutkaista sovellusta, tarvitset kaikkia kolmea profiloijaa. Jokaisella profilointityypillä on ainutlaatuinen lähestymistapa sovelluksen tarkastamiseen suorituskykyongelmien varalta.
RebelLabin kyselytutkimus osoitti myös, että suurin osa yrityksistä käyttää useita koodiprofiloijia sovelluksen suorituskykyongelmien etsimiseen.
Miksi jotkin Java-profilointityypit ovat niin kalliita?
XRebel on hieno työkalu, mutta se maksaa 365 dollaria vuodessa. Stackify Prefix on ilmainen ja tarjoaa paljon samoja toimintoja.
ApM-ratkaisujen suurin ongelma on ehdottomasti niiden hinnoittelu. Ne ovat perinteisesti olleet niin kalliita, että vain suurimmilla yrityksillä on ollut varaa niihin.
Ei ole kovin järkevää käyttää noin 100 dollaria kuukaudessa Azuren tai AWS:n palvelimeen ja sen jälkeen käyttää lähes 200 dollaria kuukaudessa New Relicin kaltaiseen tuotteeseen.
Monitorointityökalujen ei pitäisi maksaa enemmän kuin palvelimet!
Lue lisää: APM Pricing Is Now Affordable for All Developers, and Why They Should Care
Wrapping It Up
Now that you have learned about the three types of Java code profilers, it’s time to decide whether you really need all of them.
Vastaus piilee sovelluksesi luonteessa.
Jos se on pieni, kuten paikallisen yrityksen tai myymälän kulujenhallintajärjestelmä, profiloinnin tekeminen onnistuu hyvin yksinkertaisesti. Tavallinen profiloija hoitaa homman.
Jos kehität web-sovellusta, kuten kuriirilaitoksen seurantajärjestelmää, sovellustasi saattavat käyttää tuhannet käyttäjät. Siinä tapauksessa tarvitset myös APM-työkaluja tuotantoympäristöön.
Jos sovelluksesi on sulautettuihin järjestelmiin, tarvitset kaikkia kolmea.
Valitse hyvin ja pidä hauskaa kehittäessäsi sovellusta, joka tarjoaa optimaalisen suorituskyvyn.