Artikkelit, Asiantuntijalta asiantuntijalle

Miten verkkopalvelu kuormittuu? Riittääkö vessapaperit?

Mikael Kundert
Mikael Kundert

Tiedon välittämisessä ja kaupan vessapaperin saatavuudessa on yllättävän monta yhteistä nimittäjää. Tässä kahden artikkelin sarjassa käyn lävitse mistä tekijöistä verkkopalveluiden ruuhkautuminen aiheutuu, miten palveluiden suorityskykyä voidaan testata ja mitä voidaan tehdä, ettei palvelu ruuhkautuisi tai jopa kaatuisi.

Meme with text in finnish: "Do you have enough toilet paper?"

Viime viikkoina moni taho on ollut yllättävien haasteiden edessä. Totutut tavat toimia, tuottaa ja kuluttaa ovat menneet lähes kaikilla uusiksi. Tämä yhdessä liki yhdessä yössä tapahtunut loikka, jopa vähän tuntemattomaan, on aiheuttanut ruuhkaa niin vessapaperihyllyjen välissä kuin verkkopalveluissakin.

Jotta voimme ymmärrettävästi käsitellä verkkopalvelun ruuhkautumisen testaamista ja siihen varautumista, on hyvä ensin selvittää mitkä ovat ne elementit ja tekijät, jotka ruuhkautumisen aiheuttavat.

Tässä artikkelissa käynkin lävitse miten verkkopalvelun kuormitus syntyy:

  • yksittäisen käyttäjän
  • verkon
  • suorittimen
  • muistin resurssien näkökulmasta

Miten yksittäinen käyttäjä kuormittaa verkkopalvelua?

Kun käyttäjä astuu sisään verkkopalveluun, käyttäjän selain käynnistää komentojen ja kutsujen ketjureaktion. Selain tekee kutsun palvelimelle hakemalla HTML dokumentin, jonka perusteella selain lähtee muodostamaan sivua käyttäjälle.
HTML dokumentissa on määritelty:

  • sivun rakenne
  • sivun sisältö
  • lisätietoa tarvittavista oheismateriaaleista eli “asseteista”.

Ensimmäisen kutsun tehtyään, selain hakee assetit, jotka tyypillisesti ovat kuvia, fontteja, tyylitiedostoja ja JavaScript tiedostoja. Tyylitiedostot (eli CSS) määrittävät, miltä sivun tulisi näyttää. JavaScript tiedostot puolestaan tuovat lisätoimintoja sivuille, jotka ajetaan käyttäjän selaimella.

Tyylitiedostot ja JavaScript voivat aiheuttaa lisää kutsuja palvelimelle. Jos tyylitiedostossa määritellään, että jonkin elementin taustalla pitäisi olla kuva, niin silloin selain tekee uuden kutsun palvelimelle. Jos JavaScript toiminnallisuudessa halutaan hakea lisää tietoa, kuten esimerkiksi viimeisimmät notifikaatiot, niin tällöin selain tekee uuden tai jopa toistuvan kutsun palvelimelle.

Havainnekuva selaimen ja palvelimen viestinvaihdosta käyttäjän astuessa verkkopalveluun

Nämä kutsut ovat yleensä HTTP kutsuja. HTTP kutsussa määritellään kutsun operaatio/verbi, resurssin osoite, otsakkeet sekä mahdollinen sisältö. Kutsun koko voi olla esimerkiksi 400 tavua.

Jokainen palvelimelle lähetetty kutsu kuormittaa kolmea resurssia: verkkoa, suoritinta ja muistia.

400 tavuinen kutsu lähetetään palvelimelle suoritinta ja verkkoa rasittaen. Kutsu luetaan selaimen muistista palvelimen käsittelymuistiin verkon yli, josta sitten palvelin puolestaan toimittaa halutun resurssin takaisin selaimelle. Palvelimen vastaus voi olla esimerkiksi kuva, joka on kooltaan 20 kilotavua, eli 20 000 tavua.

Kutsun ja vastauksen koot voivat siis olla huomattavan eri kokoisia. Näin ollen palvelimen vastaukset kuormittavat verkkoa lähes poikkeuksetta enemmän kuin kutsut.

Verrataan esimerkiksi kahta erityyppistä kutsua:

Yksinkertaisempi kutsu pyytää verkkopalvelua välittämään palvelimen kiintolevyllä olevan tiedoston suoraan. Yksinkertainen kutsu rasittaa palvelinta siis vain “perus”pyynnöllä tiedonvälityksen suhteen.

Kompleksisempi kutsu pyytää palvelimelta myös tilaamansa sisällön muokkausta. Vaikka itse kutsu olisi kooltaan 400 tavuinen, kutsun toteuttaminen voi edellyttää esimerkiksi tilatun kuvan käsittelyä kutsun edellyttämällä tavalla. Kuvan käsittely luonnollisesti rasittaa palvelimen suoritinta ja muistia.

Havainnekuva yksinkertaisen ja kompleksisen kutsun aiheuttamista prosesseista palvelimilla.

Verkkopalvelun toteutuksesta riippuen kutsut kuluttavat keskenään erilaisia resursseja. Lähtökohtaisesti staattisen tiedon välitys rasittaa enemmän verkkoa kuin suoritinta ja muistia. Kompleksisemmat kutsut voivat käynnistää mittavankin operaation palvelimella ja näin rasitus kohdistuu suhteessa enemmän suorittimeen ja/tai muistiin. Kompleksisen kutsun kokonaisrasite on luonnollisesti yksinkertaista kutsua merkittävämpi.

Millä tavalla verkkopalvelut ruuhkautuvat?Verkkopalvelu ruuhkautuu jos tarve ylittää olemassa olevan resurssin verkon, suorittimen tai muistin kohdalla. Käydään seuraavaksi lävitse mitä tämä kunkin kohdalla tarkalleen ottaen tarkoittaa.

Verkko

Internetyhteyden kaistanleveys mitataan kahteen suuntaan. “Upload” ja “download” ovat käyttäjän internet yhteydessä yleensä “download” painoitteisia, koska suurin osa kotikäyttäjien internet liikenteestä kuormittaa nimenomaan sisääntulevaa liikennettä. Jos olet ostanut ns. 100 megabitin netin, se yleensä tarkoittaa sitä että se teoriassa kykenee vastaanottamaan enintään 100 megabittiä sekunnissa. Monesti kuitenkin ulospäin menevä liikenne saattaa olla rajoitettu esimerkiksi 20 megabittiin.

Palvelimen kaistanleveys on yleensä symmetrinen. Jos palvelin on yhden gigabitin verkkoadapterilla varustettu, niin se kykenee vastaanottamaan sekä lähettämään tietoa yhden gigabitin nopeudella.

Visualisointi kaistanleveyden käytöstä tilanteessa, jossa palvelin palvelee useampaa käyttäjää samanaikaisesti

Kun verkko kuormittuu, on kysymys siitä, että joko vastaanottajan tai lähettäjän kaistanleveys ei enää riitä suurempaan tiedonsiirtoon. Yleensä verkon kuormittuminen johtuu käytettävän verkkopalvelun kaistanleveydestä (tai “kapeudesta”), sillä verkkopalvelu palvelee useita käyttäjiä samanaikaisesti. Usean käyttäjän yhtäaikainen palveleminen voi aiheuttaa tilanteen, jossa kaistanleveys ei riitä palvelemaan kaikkia käyttäjiä samanaikaisesti ja ongelmitta.

Kun kaistanleveys on kokonaan käytössä, se näkyy käyttäjille pidempinä latausaikoina. Normaalisti sekunnissa latautuva sivu vaatiikin kymmenen sekuntia latautuakseen, jos verkko on ylikuormittunut.

Suoritin

Suorittimen (CPU) toimintaa seurataan kahdella mittarilla:
1. Käyttöaste (usage), joka kertoo kuinka paljon suoritinta käytetään
2. Kuormitus (load), joka kertoo kuinka monta aktiivista prosessia on käynnissä

Suorittimen ydin voi suorittaa kerralla vain yhtä prosessia kerralla. Kun käyttöjärjestelmällä on useampi prosessi käynnissä, sen vuoronnin (scheduler) vastaa siitä, että suoritin edistää kaikkia prosesseja suorittamalla jatkuvasti kutakin prosessia hyvin lyhyen ajan kerrallaan. Tämä on niin nopeaa toimintaa, että sitä ei pysty ihmissilmin tai korvin havaitsemaan mitenkään.

Suorittimella voi olla useampia ytimiä. Yksittäiset ytimet voivat suorittaa keskenään samanaikaisesti omia prosessejaan – näin koko palvelimen suorituskyky on luonnollisesti suurempi, sillä työkuorma jakautuu useamman ytimen kesken.

Mikäli tarve samanaikaisille prosesseille on kokonaisuudessaan liian suuri, kuormittuu palvelimen suoritin. Yksittäinen prosessi joutuu odottamaan vuoroaan pidempään, ennen kuin suoritin saa prosessin valmiiksi.

Esimerkki: Kun suoritin on kevyesti tai normaalisti kuormitettu voi yksi prosessi viedä esimerkiksi 50ms (10 ms suoritinta, 40 ms kutsun ja vastauksen välittämistä). Kun palvelu on kovassa kuormituksessa, sen suorittamiseen voi mennä esimerkiksi 200ms (160 ms suoritinta, 40 ms kutsun ja vastauksen välittämistä).

Vaikka kaistanleveys sallisi, voi kuitenkin suorittimen työkuormasta tulla hidaste. Nopea verkkoyhteys ei siis voi hoputtaa prosesseja millään tavalla.

Muisti ja tiedon säilytys

Suorittimen toiminnassa keskeinen komponentti on muisti. Se on tiedon säilytyspaikka, josta suoritin lukee ja/tai kirjoittaa. Muistin säilytyskeinoja on useita. Palvelimen keskusmuisti on nopea tapa pitää tietoa väliaikaisesti muistissa. Kiintolevy taas puolestaan on hitaampi, mutta kykenee säilyttämään suurempia määriä tietoja. Siksi kiintolevylle tallennetaan yleensä pysyvämmät tiedostot, mutta sitä voidaan käyttää myös palvelimen muistin “hätävarapaikkana”. Tätä paikkaa kutsutaan levyvälimuistiksi.

Kun verkkopalvelu vastaanottaa kutsun, palvelin lukee kutsun sisällön keskusmuistiin. Tämän jälkeen ohjelma lukee muistista kutsun ja päättelee, mitä kutsulle pitää tehdä.

Jokainen prosessi vie tietyn verran keskusmuistia. Ajattava prosessi itsessäänkin on keskusmuistissa ja prosessissa vaadittaviin tiedonkäsittelyihin tarvitaan keskusmuistia. Todellisuudessa verkkopalvelun prosessi ei ole suunniteltu pelkästään kuvan käsittelyyn, vaan on kokonaisuudessaan yksi prosessi, joka palvelee verkkopalvelun eri toimintoja ja näin ollen voi tarvita muutamia satoja megatavuja, joskus jopa gigatavuja vastatakseen sille lähetettyyn kutsuun.

Palvelimen muisti koostuu keskusmuistista ja levyvälimuistista. Jos keskusmuisti loppuu, käyttöjärjestelmä siirtyy käyttämään levyvälimuistia (mikä on hitaampaa kuin keskusmuisti). Kun palvelimella oleva muisti loppuu kesken, joutuu käyttöjärjestelmä ns. “tappamaan” jonkun prosesseista. Yleensä tämä prosessi on se, joka vie eniten muistia.

Muistin hallintaan liittyvät konfiguraatiot tulevatkin avuksi tässä kohtaa. Niiden avulla voidaan varmistaa ettei yksittäinen prosessi ylitä sille asetettua ylärajaa muistin kuormituksen suhteen. Mikäli ylärajaa ei olisi asetettu, käyttöjärjestelmä tappaisi kokonaisuutta merkittävästi hidastavan prosessin ja koko verkkopalvelun terve suorittaminen vaarantuisi.

Aina digin ovet eivät aukea käyttäjälle; verkkopalvelu voi vastata virhesanomalla”. Virhesanoma on yleinen niissä tapauksissa, joissa verkkopalvelu ei jostain sisäisestä syystä kykene vastaamaan kutsuun. Esimerkiksi jos prosessissa käy niin, että vastauksen muodostaminen ylittää konfiguroidun muistin rajan, niin verkkopalvelu saattaa keskeyttää sen vastaamalla esimerkiksi 500 Internal Server Error tai 502 Bad Gateway.

Mikäli verkkopalvelun prosessi puutteellisista resursseista johtuen joudutaan tappamaan, niin palvelin jättää kokonaan vastaamatta selaimelle Käyttäjälle tämän näkyy joko liian pitkänä vastauksena, jolloin selain yksinkertaisesti lakkaa odottamasta vastausta ja ilmoittaa käyttäjälleen aikakatkaisusta. On myös mahdollista, että verkkopalvelu sulkee yhteyden ilman vastausta, jolloin käyttäjä näkee ilmoituksen yhteyden sulkemisesta.

Miten välttyä verkkopalvelun kyykkäämisiltä?

Nyt kun olemme käyneet lävitse verkkopalvelun ruuhkautumisen syyt ja mekanismit, pääsemme seuraavassa, lähiviikkoina julkaistavassa artikkelissa käsittelemään näiden ruuhkien simuloimista, testaamista ja ruuhkiin varautumista.