Apache Software Foundationin kehittämä Apache Tomcat on avoimen lähdekoodin Java-servlet-säilö, joka toimii myös verkkopalvelimena. Vaikka yli 10 000 verkkosivustoa luottaa Tomcatiin verkkopalvelimena, Java-sovelluspalvelimien Plumbr osoitti, että yli 60 % Java-tekniikkaa käyttävistä verkkosivustoista luotti Apache Tomcatiin liiketoimintalogiikassa.
Tuotantoympäristöjen on oltava tehokkaita. Tämä edellyttää, että Apache Tomcat on määritetty käsittelemään suurinta mahdollista kuormitusta ja silti tarjoamaan käyttäjille parhaan vasteajan. Sovelluspalvelimen suorituskyky riippuu usein siitä, kuinka hyvin se on määritetty. Usein annetut oletusasetukset eivät ole optimaalisia.
eG Innovationsissa eG Enterprisen IT-suorituskyvyn seurantaratkaisumme käyttää Apache Tomcatia verkkopalvelimena. Olemme vuosien varrella löytäneet useita vinkkejä ja temppuja Tomcatin konfiguroimiseksi parhaan mahdollisen skaalautuvuuden saavuttamiseksi. Tämä blogikirjoitus dokumentoi oppimiamme parhaista käytännöistä, joita sinun tulee käyttää Tomcatin käyttöönotossa tuotannossa.
Ensimmäinen askel korkean suorituskyvyn saavuttamiseksi on ymmärtää, että Tomcat-sovelluspalvelimen virittäminen ei yksin riitä. Loppujen lopuksi Tomcat toimii Java-virtuaalikoneen (JVM) päällä. Joten huonosti määritetty JVM heikentää suorituskykyä. Samoin JVM toimii käyttöjärjestelmässä, ja on tärkeää, että käytössä on paras mahdollinen käyttöjärjestelmän kokoonpano parhaan mahdollisen suorituskyvyn saavuttamiseksi. Jopa sovelluskoodin pullonkaulat voivat aiheuttaa "Tomcat on hidas" -valituksia. Kaiken kaikkiaan Tomcatin suorituskyvyn virittämiseen on omaksuttava kokonaisvaltainen lähestymistapa.
Suorituskykyä on säädettävä kaikilla tasoilla: käyttöjärjestelmässä, JVM:ssä, Tomcat-säilössä ja sovelluskooditasolla.
Seuraavissa osioissa esittelemme parhaat käytännöt käyttöjärjestelmän, JVM:n, Tomcat-säilön ja sovelluskoodin määrittämiseksi parhaan mahdollisen suorituskyvyn saavuttamiseksi.
Koska Tomcat käyttää JVM:ää, JVM:n suorituskyky vaikuttaa myös Tomcatin suorituskykyyn.
Ennen kuin aloitat asetusten säätämisen, varmista, että olet valinnut sovelluksellesi nykyaikaisen JVM:n. On monia vertailuarvoja, jotka osoittavat 5–20 %:n suorituskyvyn kasvun kustakin Java-versiosta (katso lisätietoja tästä artikkelista). Monet JVM:t ovat saatavilla 32- ja 64-bittisissä tiloissa. Vaikka 32-bittinen tila on rajoitettu 2 Gt muistiin, 64-bittiset JVM:t mahdollistavat Java-keon asettamisen paljon korkeammalle. Varmista siis, että käytät 64-bittistä JVM:ää parhaan suorituskyvyn ja skaalautuvuuden saavuttamiseksi.Roskakeräys on prosessi, jolla Java-ohjelmat suorittavat automaattisen muistinhallinnan. Aiemmin jätteiden kerääminen tehtiin "stop-the-world" -tavalla. Eli kun roskat kerättiin, sovellus keskeytettiin muistin palauttamiseksi. Nykyään on monia roskienkeräystoteutuksia, joissa roskien kerääminen tapahtuu samanaikaisesti sovelluksen suorittamisen kanssa.
Parhaan suorituskyvyn saavuttamiseksi varmista, että valitset nykyaikaisen roskankeräimen, kuten G1GC (Garbage First Garbage Collector) tai Z Garbage Collector. JVM:n MaxGCPauseMillis-asetusta voidaan käyttää ympäristössä odotettavissa olevien huipputaukojen asettamiseen. On suositeltavaa, että tämä arvo on 500-2000 ms parhaan suorituskyvyn saavuttamiseksi. Pidemmät tauot lisäävät suorituskykyä, kun taas lyhyemmät tauot vähentävät viivettä ja suorituskykyä. Erilaisten GC-asetusten lisäksi seuraa tuotannossa olevaa Tomcat-palvelinta ja varmista, että JVM:n roskien keräämiseen käyttämä aika on pieni. Kaikki yli 5 %:n arvot heikentävät Tomcatin suorituskykyä.JVM:n muistin saatavuus voi myös vaikuttaa haitallisesti Tomcatin suorituskykyyn.
Sinun on varmistettava, että kaikissa keon ja ei-keon muistivarastoissa on riittävästi muistia. Jos jonkin muistivaraston käytettävissä oleva muisti on loppumassa, kohtaat OutOfMemory-poikkeuksia ja sovellus voi epäonnistua odottamattomilla tavoilla. Käytä JVM:n Xmx- ja Xms-lippuja asettaaksesi suurimman keon koon ja pinon koon ja XX-lippuja asettaaksesi PermSize- tai MetaspaceSize-arvot käytettävän JRE-version mukaan (lisätietoja on tässä artikkelissa).Varmista, että kunkin JVM:n muistivaraston käytettävissä oleva muisti on riittävä. Muistin puute vaikuttaa haitallisesti Tomcat-palvelimen suorituskykyyn.
Muistirajojen asettaminen on usein yrityksen ja erehdyksen prosessi. Muistirajojen asettaminen liian pieniksi voi johtaa poikkeuksiin, kun taas niiden asettaminen liian korkeiksi voi johtaa resurssien tuhlaukseen. Käytä JVM-seurantatyökalua ja analysoi suorituskykyä viikon tai pidemmän ajan ottaen huomioon myös huipputunnit JVM-muistivarastojen optimaalisten arvojen määrittämiseksi.Jos JVM:n muisti kasvaa rajoittamattomaksi, sinun on määritettävä, onko muistia olemassa. vuoto sovelluksessa.
Tee muistikekovedos Java sisäänrakennetuilla työkaluilla, kuten JvisualVM ja Jconsole. Käytä työkaluja, kuten Eclipse Memory Analyzer (MAT), muistivuotoja epäiltyjen määrittämiseen. MAT:n Dominator Tree auttaa sinua rajaamaan säikeitä/objekteja, jotka aiheuttavat muistivuodon.Lopuksi voit seurata säikeen toimintaa JVM:ssä.
Vaikka JVM:n säikeiden kokonaismäärä on seurattava kierteiden vuotojen havaitsemiseksi, on tärkeää seurata lankalohkoja ja lukkiutumia, koska ne heikentävät suorituskykyä. Pinojälki estyneistä säikeistä ja lukkiutuneista säikeistä voi paljastaa sovelluskooditason ongelmia.Säikeen tukkojen ja lukkiutumien tunnistaminen, jotka aiheuttavat sovelluksen jumiutumisen
Lisäksi tarkkaile yksittäisten säikeiden suorittimen käyttöä havaitaksesi poistuneet säikeet, jotka kuluttavat CPU:ta ja hidastavat Tomcatia. Jälleen mikä tahansa JVM-tason seurantatyökalu voi tarjota näitä oivalluksia. Joissakin tapauksissa sovelluksen taustasäikeet voivat viedä liikaa resursseja. Seuraamalla säikeen toimintaa voit määrittää tällaiset skenaariot ja jopa määrittää ongelman aiheuttavan koodirivin/menetelmän.Kuten JVM:n tapauksessa, monet skaalautuvuus ja uusimmissa julkaisuissa on tehty tietoturvaparannuksia. Varmista siis, että käytät Tomcatin uusinta versiota. Tällä hetkellä Tomcat 9 on uusin versio.
Tomcatin server.xml-määritystiedosto sisältää useita elementtejä, joita voidaan säätää Tomcatin suorituskyvyn parantamiseksi.
Liittimien määrittäminen
Nämä ovat elementtejä, joiden avulla Tomcat voi vastaanottaa pyyntöjä asiakkailta. Yksi liittimen esiintymä kuuntelee pyyntöjä tietyssä palvelimen TCP-porttinumerossa.
Jos Tomcat-palvelimellesi tulee erityyppisiä työkuormia, sinun tulee harkita useiden liittimien käyttöä – jotta yhden tyyppinen liikenne käsitellään yhdessä portissa ja toinen tyyppi toisessa portissa. Tämä vähentää muutoksia, joita erityyppiset työmäärät voivat häiritä toistensa kanssa.Jokainen saapuva pyyntö käsitellään säikeellä Tomcatissa. Liittimen maxThreads-attribuutti määrittää samanaikaisten säikeiden enimmäismäärän, jotka voidaan suorittaa liittimessä. Samanaikaisesti suoritettavien säikeiden määrä riippuu laitteistosta ja siinä olevien suorittimien määrästä. Mitä parempi laitteisto ja suurempi prosessorien määrä, sitä parempaa samanaikaisuutta Tomcatin on tuettava.
Jos maxThreads-attribuutti on asetettu liian pieneksi, pyyntöjen on odotettava, kunnes säie tulee saataville pyynnön käsittelemiseksi. Tämä voi pidentää käyttäjien näkemiä vasteaikoja. Siksi parhaan suorituskyvyn saavuttamiseksi aseta maxThreads riittävän korkeaksi arvoksi, jotta säikeet ovat aina käytettävissä Tomcatissa saapuvien pyyntöjen käsittelemiseksi.Tomcat-liittimen attribuutit
Valvonnan kannalta on tärkeää valvoa aktiivisten säikeiden määrää kunkin liittimen säievarannossa. Jos aktiivisten säikeiden määrä on lähellä maxThreads-rajaa, sinun tulee harkita Tomcat-palvelimen kokoonpanon viritystä, jotta liittimelle saadaan suurempi säievarasto.
Saapuvien pyyntöjen käsittelemiseen käytettävän liitinprotokollan valinta vaikuttaa myös Tomcat-palvelimen suorituskykyyn. Esimerkiksi Tomcat 9 tukee estäviä ja estäviä liittimiä. Katso tämä vertailutaulukko.
Estoliittimellä, jossa jokainen työsäie kulutetaan, kunnes siihen liittyvä yhteys on valmis. Ei-estävä liitin johtaa kuitenkin parempaan säikeenhallintaan pidemmillä käynnissä olevilla pyynnöillä. Suorituskykytestit viittaavat siihen, että estoton liitin tarjoaa paremman suorituskyvyn pidemmissä käynnissä olevissa pyynnöissä.
Harkitse ei-estävien liittimien käyttöä, sillä se parantaa suorituskykyä.Liittimen enableLookups-asetus määrittää, suorittaako Tomcat-palvelin DNS-käänteisen haun löytääkseen kunkin etäasiakkaan isäntänimen.
DNS-haut ovat kalliita, ja jos tämä arvo on tosi, DNS-palvelun hidastuminen voi saada vaikutelman siltä, että Tomcat on hidas. Parhaan suorituskyvyn saavuttamiseksi aseta enableLookups arvoon false kaikille käytössä oleville liittimille.Toinen tärkeä liitinasetus on acceptCount. Tämä on hyväksyntäjonon enimmäispituus, johon pyynnöt asetetaan odottaessaan käsittelysäiettä. Kun vastaanottojono on täynnä, saapuvat lisäpyynnöt hylätään. Oletusarvo 100 ei ole riittävä tyypillisille tuotantotyökuormille.
Näin ollen parhaan suorituskyvyn saavuttamiseksi asettamalla acceptCount-arvon on oltava riittävän suuri, jotta se mahtuu saapuvien yhteyksien purskeeseen, jonka palvelin voi vastaanottaa. Jos acceptCount on liian pieni, asiakkaat näkevät "yhteys hylätty" -virheitä. Jos arvo on liian korkea, jono vie lisää palvelinmuistia.Käytettäessä NIO- ja NIO2-liittimiä voit määrittää Tomcatin käyttämien socket-luku- ja kirjoituspuskurien koon. Attribuutit socket.rxBufSize ja socket.txBufSize säätelevät puskurin kokoasetusta.
Mitä suurempi socket.rxBufSize- ja socket.txBufSize-arvo on, sitä suurempaa suorituskykyä tuetaan. Harkitse 64 kt:n tai suurempia asetuksia näille arvoille.Usein asiakkaat voivat muodostaa yhteyden WAN-linkkien kautta Tomcat-palvelimeen. Pakkausattribuutti määrittää, pakkaako Tomcat sisältöä lähettäessään sen asiakkaille.
Aseta tämä attribuutti "on" saadaksesi parhaan suorituskyvyn. Tällöin käytetään GZIP-pakkausta. Pakattavat sisältötyypit on saatavilla compressibleMimeTypessä.Kaikki asiakkaan ja palvelimen välinen viestintä, joka on ensisijaisesti tekstiä, olipa kyseessä HTML, XML tai yksinkertaisesti Unicode, voidaan pakata säännöllisesti jopa 90 % käyttämällä yksinkertaista ja standardia GZIP-algoritmia. Tällä voi olla valtava vaikutus verkkoliikenteen vähentämiseen, mikä mahdollistaa vastausten lähettämisen takaisin asiakkaalle paljon nopeammin ja samalla sallien enemmän verkon kaistanleveyttä muille verkon raskaille sovelluksille.
Executorsin käyttäminen
Käytettäessä liittimiä, jokaiselle liittimelle on varattu lankajoukko. Jos käytät useita liittimiä, voit määrittää suorittimen. Suoritin on yhteinen säiepooli, jonka useat liittimet voivat jakaa. Tämä ei ainoastaan mahdollista säikeiden jakamista liittimien välillä, vaan se tarjoaa myös mekanismin, joka vähentää säikeiden määrää poolissa, jos saapuva työmäärä ei vaadi näitä säikeitä käsittelyyn. Kun käytät säievarastoa liitintä kohden, Tomcat ei ota takaisin säikeitä poolissa, joten jos näet kerran suuren pyyntöspurtin, tämä voi lisätä säikeiden määrää poolissa Tomcat-palvelimen koko käyttöiän ajan. Kun käytetään suorittajaa, maxThreads-asetus määritellään suorittajatasolla. Tällaisessa tapauksessa Tomcat-järjestelmänvalvojien on valvottava säiepoolin toimintaa ja käyttöä suorittajatasolla, ei liitintasolla.
Julkisten SSL-varmenteiden määrittäminen
Jos liittimesi on SSL-yhteensopiva, varmista, että olet määrittänyt sille kelvollisen julkisen SSL-varmenteen.Tutustu tästä blogista ymmärtääksesi tehokkuuden vaikutuksen, joka virheellisellä SSL-varmenteen määrityksellä voi olla Tomcatin suorituskykyyn.
Säädä resurssien välimuistiasetukset
Suorituskyvyn parantamiseksi Tomcat on oletuksena määritetty tallentamaan staattiset resurssit välimuistiin. Välimuistin koko on kuitenkin määritettävä riittävän suureksi suorituskyvyn säästämiseksi.
Voit säätää Tomcatin välimuistin asetuksia etsimällä Context-käskyn (palvelin.xml- tai konteksti.xml-tiedostosta) ja asettamalla cacheMaxSize-attribuutille sopivan arvon.Tietokantayhteyksien yhdistäminen
Yhteyden avaaminen tietokantaan ovat kalliita. Yhteyksien yhdistäminen on yleinen tekniikka tietokannan käytön optimoimiseksi luomalla avoimien yhteyksien pooli, jotta pyynnöt voivat ottaa yhteyksiä poolista ja palauttaa yhteydet takaisin pooliin, kun ne ovat suorittaneet tehtävänsä. Koska yhteyksiä ei tarvitse luoda ja purkaa jokaista pyyntöä varten, yhteyksien yhdistäminen mahdollistaa sovellusten vastauksen nopeamman ja vähentää tietokantapalvelimen yhteydenkäsittelyn ylimääräisiä kustannuksia. Tomcatissa on sisäänrakennettu tuki tietokantayhteyksien yhdistämiselle.
Kuten säieryhmien tapauksessa, varmista, että tietokantayhteyspoolin maxActive-asetus, joka määrittää, onko poolin aktiivisten yhteyksien enimmäismäärä riittävän suuri käsittelemään työkuormaa. Valvo tietokantayhteyspoolin käyttöä, koska jos yhteys pooli on täysin hyödynnetty, uudet pyynnöt odottavat ilmaisten yhteyksien saatavuutta, jolloin vastausajat pidentyvät.Web.xml-optimoinnit
Server.xml-tiedostoa käytetään määrittämään palvelinkohtaisia määrityksiä. Kutakin Tomcat-palvelinesiintymää kohden on vain yksi server.xml. Web.xml-tiedostoa käytetään verkkosovelluskohtaisten kokoonpanojen määrittämiseen. Jokaiselle Tomcat-palvelimelle asennetulle verkkosovellukselle on yksi web.xml-tiedosto. Kaikkien verkkosovellusten perimät oletusasetukset määritetään web.xml-tiedostolla Tomcatin päämäärityshakemistossa.
Tämän tiedoston oletusominaisuusarvot on viritetty kehitysympäristöjä varten, ja niitä on muokattava tuotantokäyttöönottoa varten. Java Server Pages (JSP) -kääntäjäasetuksella on kehitystilan asetus. Tämä on oletuksena totta. Muuta tämä arvoksi false, jotta vältytään usein tarkistamasta JSP:itä uudelleenkääntämisen välttämiseksi. Esikäännä JSP:t välttääksesi tuotantopalvelimien kääntämisen ylimääräisiä kustannuksia. Samoin aseta genStringAsCharArray arvoon "true" tuottaaksesi tehokkaampia char-taulukoita.Aseta trimSpaces arvoon "true" poistaaksesi tarpeettomat kohdat. tavua vastauksesta.Tehoton sovelluskoodi voi myös hidastaa Tomcatissa käyttöön otettua sovellusta. Kirjaaminen on yleinen tapa seurata sovelluksen toimintaa. Tulostiedostoihin kirjautuminen on kuitenkin synkronoitu toiminto, ja liiallinen kirjaus voi itse asiassa hidastaa sovelluksen suorituskykyä.
Käytä tavukoodiinstrumentointiin perustuvia tapahtumien jäljitystekniikoita sovelluksen käsittelyn seuraamiseen ilman muutoksia sovelluskoodiin. Nämä tekniikat perustuvat erityisesti muotoiltuun jar-tiedostoon, joka käyttää JVM:n tarjoamaa instrumentointisovellusliittymää muuttamaan olemassa olevaa JVM:ään ladattua tavukoodia.
IT-tiimit ja kehittäjät voivat käyttää tätä ominaisuutta syventyäkseen hitaisiin tapahtumiin ja havaitakseen ennakoivasti suorituskykyongelmat ennen kuin ne vaikuttavat loppukäyttäjiin.
Hajautettu tapahtumaseuranta, jota käytetään kooditason ongelmien tunnistamiseen Tomcatin toimittamissa verkkosovelluksissa
Saat usein kuulla, että Java-pohjaiset sovelluspalvelimet, kuten Tomcat, ovat hitaita tai eivät ole tuotantovalmiita. Tässä blogissa olemme tarjonneet joukon parhaita käytäntöjä, joiden avulla saat Tomcat-verkkosovelluspalvelimestasi kaiken irti. eG Enterprise -sovellusten suorituskyvyn seurantaratkaisumme käyttää Apache Tomcatia ydinsäiliömoottorina, ja sitä on käytetty laajalti tukemaan kymmenien tuhansien palvelimien, kymmenien miljoonien reaaliaikaisten mittareiden ja yli sadan tuhannen loppukäyttäjän seurantaa tuotannossa. Joten voit olla varma, että täällä tarjoamamme parhaat käytännöt todella toimivat!
PREV: Mikä on palvelimen ylläpitosuunnitelma ja miksi se on tärkeä ...