Välimuisteilla löysät pois sivulatauksista

Kirjoitettu: 13.9.2019 Päivitetty: 19.9.2019

Välimuisti eli cache on erittäin hyödyllinen ja yleinen tekniikka, jolla voidaan saavuttaa jopa kymmenkertainen nopeus verrattuna välimuistittamattomaan pyyntöön. Välimuistin idea on, että siihen tallennetaan lyhyeksi aikaa jonkin tiedonhaun tulos. Mikäli samaa tietoa tarvitaan pian uudestaan, ei sen laskemiseksi tai hakemiseksi tarvitse tehdä samaa raskasta toimenpidettä uudestaan, vaan tulos löytyy heti välimuistista kuin apteekin hyllyltä.

Välimuisti eroaa kuitenkin apteekin hyllystä siinä mielessä, että sen sisältö voidaan koska tahansa hävittää ilman että siitä aiheutuu mitään haittaa. Jos tietoa tarvitaan uudestaan, on se edelleen laskettavissa tai haettavissa alkuperäisestä lähteestä, se vain kestää kauemmin.

Monille varmasti tutuin välimuisti löytyy verkkoselaimesta. Aina kun selain hakee palvelimelta jonkin sivun, toimittaa palvelin itse sivun sisällön lisäksi myös tiettyjä otsikkotietoja, joista löytyy monesti jokin päivämäärä tai erääntymisaika. Tämän tiedon avulla selain tietää käyttää selaimen muistia käyttäjän käydessä samalla sivustolla uudestaan, eikä turhaan hae kaikkea tietoa uudelleen palvelimelta. Mitä isompi sivu on tai mitä hitaampi verkkoyhteys käyttäjällä on, sitä merkittävämpi ero on sen suhteen tuleeko sivu selaimen paikallisesta välimuistista muutamassa millisekunnissa vai pitääkö sen latautumista odotella tuhatkertainen määrä eli useita sekunteja.

Välimuistille on myös tyypillistä, että se paikka jossa välimuistia säilytetään on pienempi ja nopeampi, mutta myös kalliimpi muistityyppi kuin se, jossa data oli pysyvässä säilytyksessä.

Välimuistin yleiset tasot

Välimuisteja käytetään kaiken aikaa erilaisilla tasoilla, esimerkiksi normaaleissa ohjelmistoissa, käyttöjärjestelmissä, laiteajureissa ja suorittimen sisällä. Tietokoneen joskus itse osista koonneelle lienee tuttua, että suoritinta ostettaessa tuotetiedoissa löytyy paitsi kellotaajuuden megahertzit, myös tiedot L1, L2 ja L3 -muistien koosta. Mitä suuremmat välimuistit suorittimesta löytyy, sitä nopeammin se saa laskutoimitukset tehtyä, koska suorittimen ei tarvitse käydä kesken kaiken hakemassa tietoa emolevyllä toisaalla olevasta RAM-muistista. Seravolla käytetään ainoastaan ammattilaiskäyttöön tarkoitettuja suorittimia, joiden välimuistit pystyvät suoriutumaan vaativistakin pyynnöistä ja kuormatasoista.

Kiintolevy on toinen laite, jonka sisältä löytyy välimuistia. Kiintolevyn välimuistissa säilytetään niitä tiedostoja, joita luetaan kaikkein eniten, jotta niiden lukuoperaatiot saadaan tehtyä mahdollisimman nopeasti, eikä tietoja tarvitsisi hakea leyvltä. Ero on erityisen suuri perinteisissä HDD-kiintolevyissä, mutta myös SSD-kiintolevyissä on sisäänrakennettu välimuisti. HDD-kiintolevyjen ja SSD- sekä PCIe-kiintolevyjen nopeusero on kuitenkin jo lähtökohtaisesti niin suuri, että HDD-kiintoelvyillä varustetut palvelimet eivät välimuistista huolimatta pärjää vertailussa nopeammille levytekniikoille. Tästä johtuen Seravolla on käytössä pelkästään nopeita SSD-kiintolevyjä sekä huippunopeita PCIe-kiitolevyjä.

Tietokoneiden työmuisti eli RAM-muisti on paljon nopeampaa kuin SSD-kiintolevyn muisti, mutta myös paljon kalliimpaa ja siksi sitä käytetään vähemmän. RAM-muistilla on monia käyttötarkoituksia, joista yksi on toimia kiintolevyn välimuistina. Linux-käyttöjärjestelmässä (joka on Seravolla käytössä kaikilla palvelimilla) kaikki vapaa RAM-muisti käytetään automaattisesti kiintolevyn välimuistina, kiintolevyille tehtävien hakujen minimoimiseksi.

Välimuisteja löytyy siis todella monesta paikkaa. Niiltä osin kun välimuistit ovat käytössä tavanomaisissa ohjelmistoissa, on niiden yleisin fyysinen tallennuspaikka RAM-muisti, kiintolevyn käyttämisen ja turhan I/O-kuorman välttämiseksi. Joskus ohjelmistot optimoivat myös miten suoritin käyttää välimuistejaan.

WordPress-käytössä tärkeät välimuistit

WordPressin käyttäjille tärkeät välimuistit liittyvät tiedostojen käsittelyyn (esim. PHP-tiedostot ja kuvat), tietokannan toimintaan, WordPressin sisäiseen välimuistiin, sekä WordPressin, HTTP-palvelimen ja selaimen välisiin välimuisteihin. Seravolla kaikille näille tasoille on tehty optimointeja ja ne ovat kaikilla asiakkailla vakiona käytössä, ellei asiakas ole erikseen poistanut niitä.

PHP:n välimuistit

WP-palvelussa on PHP-prosesseja jatkuvasti valmiustilassa. Niiden välimuisteihin on ladattu kaikki WordPressin, teeman ja lisäosien PHP-tiedostot, sekä kaikki PHP:n omat kirjastot. Näin PHP voi heti suorittaa sille tulevan pyynnön ilman, että sen tarvitsee käyttää aikaa kiintolevyn sisällön lukemiseen. Mikäli WordPressiin tulee päivitys, tai sivuston kehittäjä muuttaa PHP-tiedostojen sisältöjä, nollaantuu välimuisti automaattisesti ja PHP lataa välimuistiinsa uusimmat versiot PHP-tiedostoista.

MariaDB-tietokannan välimuistit

Mikäli WordPress hidastelee, on monesti syynä tietokannan hitaus, joka puolestaan johtuu siitä, että dataa luetaan paljon enemmän kuin mitä oikeasti tarvitsisi, tai tiedoissa on liikaa ristiinviittauksia. Hyvät SQL-kyselyt ja tiedon sisällysluetteloiden (eli indeksien) käyttö ovat avainasemassa, mutta tekemättä mitään muutoksia WordPress-sivuston koodiin voi tietokantaa myös nopeuttaa käyttämällä sen välimuistia. Silloin tietokantapalvelin ei hae tietoja toistuvasti kiintolevyltä, vaan pitää useimmin käytetyt tiedot jatkuvasti RAM-muistissa.

WordPressin transientit ja Redis-välimuisti

Itse WordPressissä on myös sisäänrakennettu välimuistitusjärjestemä, jota teeman/lisäosan koodaja voi hyödyntää WP Transient API -funktioiden kautta. Esimerkki käyttötapauksesta voisi olla esimerkiksi sellainen, jossa sivulla halutaan näyttää lista kymmenestä suosituimmasta artikkelista. Listan tekeminen saattaa kuitenkin olla raskas operaatio, joka vaatii ison tilastodatan louhimista. Transienteja voi hyödyntää tässä esimerkissä niin, että kun tilasto lasketaan, tallennetaan se transientiin vaikkapa tunniksi – tilastossa tuskin tapahtuu olennaisia muutoksia tunnissa. Sivuston vierailijoille voidaan sitten näyttää transientista haettava tulos heti, ilman tarvetta hitaalle laskutoimitukselle.

Normaaleissa WordPress-asennuksissa transientit tallennetaan tietokantaan. Seravolla transienteja ei kuitenkaan tallenneta tietokantaan, vaan erilliseen Redis-välimuistiin, joka pitää koko ajan kaikkia tietoja RAM-muistissa ja on tietokantaa yksinkertaisempana ohjelmistona salamannopea vaihtoehto tarjoilemaan transientien tietoja PHP-prosesseille.

Palvelimen HTTP-välimuisti

Usein on myös tilanteita, joissa kokonainen sivu säilyy samanlaisena pidemmän aikaa. Sellaisessa tapauksessa ei ole tarpeen toistuvasti ajaa PHP-koodia sivun tuottamiseksi, vaan koko sivu voidaan laittaa välimuistiin esimerkiksi minuutiksi, kymmeneksi minuutiksi tai tunniksi. Seravolla HTTP-palvelimet tarkistavat aina minkälaisia otsikkotietoja PHP-prosessit lähettävät HTML-sivun tulostamisen yhteydessä. Mikäli sivulla on sallittu sen välimuistittaminen kokonaisuudessaan joksikin aikaa, toteuttavat HTTP-palvelimet sen.

Jos sivun lataus voidaan tarjoilla HTTP-palvelimen välimuistista ilman että sitä haetaan PHP:lta, on sivun latautuminen helposti kymmenkertaisesti nopeampi, koska sekä PHP-koodin suorittaminen että tietokantakyselyjen tekeminen jää pois.

Selaimen HTTP-välimuisti

Kuvankaappaus Webpagetest.org-sivustolta
Yllä visualisaatio Seravo.com:n lataamisesta kun kävijä tulee sivustolle ensimmäisen kerran. Alla näkyy toinen latauskerta ja kuinka suurin osa kuvien yms latauksista jää pois, koska ne ovat jo valmiiksi selaimen välimuistissa.

Käyttäjien verkkoselaimet lukevat samoja edellämainittuja HTTP-otsikkotietoja. Mikäli kokonaisen sivun välimuistittaminen on sallittu, käyttää selain tätä mahdollisuutta hyväkseen. Se ei hae sivua uudestaan palvelimelta, mikäli käyttäjä omalla selaimellaan avaa saman sivun sen vielä löytyessä välimuistista.

Jos selaimen välimuistia käytetään oikein, voi se nopeuttaa sivujen lataamista äärettömästi lisää, koska osaa latauksista ei tehdä lainkaan.

Niin sanottujen staattisten tiedostojen (kuvat, JavaScript-tiedostot yms) välimuistiotsakkeet ovat Seravon toimesta automaattisesti asetettu oikein ja toiminnassa. Sen sijaan dynaamisen – eli WordPressin ja PHP:n tuottaman – sisällön osalta sivuston kehittäjän pitää jollain tavalla ohjata välimuistiotsakkeita.

WordPress-sivuston kehittäjän kannattaa opetella tuntemaan ja käyttämään HTTP-välimuistiotsikoita oikein, koska loppukäyttäjälle nopein mahdollinen sivunlataus on sellainen, jossa sivua ei ylipäänsä haeta uudestaan verkon yli. Näitä ovat esim Cache-control ja Expires. Wikipedia ja Mozillan tekemä dokumentaatio ovat hyviä tietolähteitä.

Seravolla olevan sivuston osalta kehittäjä voi helposti mennä palvelimelle SSH-yhteydellä ja komennolla wp-check-http-cache tarkistaa onko sivustolla ylipäänsä HTTP-otsikkotietoja jotka sallivat välimuistittamisen.

$ wp-check-http-cache
----------------------------------------
Seravo HTTP cache checker
----------------------------------------
Testing https://seravo.com/...
Request 1: HIT
Request 2: HIT
Request 3: HIT
----------------------------------------
SUCCESS: HTTP cache works for https://seravo.com/.
----------------------------------------
You can also test this yourself by running:
  curl -IL https://seravo.com/

Komennolla wp-speed-test puolestaan voi testata sivun nopeutta ja sille voi antaa optioksi --cache, jolloin näkee mikä on sivun latautumisen nopeusero kun se tulee tai ei tule HTTP-välimuistista.

$ wp-speed-test --cache
Testing speed URL https://seravo.com...

Warning: invoked with --cache and thus measuring cached results. This does not measure actual PHP speed.

For an explanation of the different times, please see docs at https://curl.haxx.se/docs/manpage.html

URL                  TOTAL NAMELOOKUP CONNECT APPCONNECT PRETRANSFER STARTTRANSFER    = AVG
https://seravo.com   0.010      0.004   0.005      0.008       0.008         0.010    0.010
https://seravo.com   0.002      0.000   0.000      0.000       0.000         0.002    0.006
https://seravo.com   0.002      0.000   0.000      0.000       0.000         0.002    0.005

Monelle käyttäjälle tuttu ”selaimen välimuistin tyhjentäminen” tarkoittaa nimenomaan sitä, että pakotetaan selain hakemaan palvelimelta HTML-tiedosto uudestaan. Välimuistin tyhjentämistä kätevämpi temppu on vain painaa Ctrl+F5 (Chrome- ja Firefox -selaimissa, muissa selaimissa näppäinyhdistelmä voi olla muu), jolloin selain varmasti hakee sivun uusimman version. Seravon palvelimet tietävät mikäli käyttäjä painoi tuota maagista näppäinyhdistelmää (koska HTTP-otsikkotietojen mukana on käsky Pragma: no-cache) ja hakevat sivun tuoreimman version aina PHP-tasolta asti.

Välimuistitoimintojen koodaaminen on usein haastavaa

Välimuistien toteuttaminen on koodaajalle usein haastavaa. Suurin osa tiedoista ja sivuista voisi olla lähes koko ajan välimuistissa, mutta välillä tulee poikkeuksia. Esim jos vaalitulospalvelun etusivun välimuistiajaksi on asetettu yksi tunti, on se suurimman osan vuodesta hyvä arvo, paitsi juuri silloin kun uusi vaalitulos on julkaistu ja kaikkien käyttäjien pitäisi nähdä se heti.

Kaikkien välimuistien ohjaaminen, myös HTTP-tason välimuistin, on hankalaa. Kun sisällölle on kerran merkitty voimassaoloajaksi yksi tunti, selain ei tunnin aikana kysele sivusta uutta versiota ja siksi siten myöskään voimassaoloaikaa ei voi lyhentää kesken kaiken. Kun kyselyä ei kerran tule, niin tieto voimassaolon lyhentymisestäkään ei etene minnekään. Palvelimelta käsin voi tyhjentää vain palvelimen omat välimuistit, mutta käyttäjien selainten välimuistiin ei tietenkään voi olla mitään pääsyä. Verkkosivuston kehittäjä voi ainoastaan vaikuttaa siihen, että sisällölle luodaan uusia voimassaoloaikoja kun sisältöä seuraavan kerran pyydetään.

Välimuistin hankaluuden takia onkin olemassa sanonta, että tietotekniikassa ei ole kuin kaksi vaikeaa asiaa: asioiden nimeäminen ja välimuistittaminen.

Muista välillä välimuisti

Välimuistin käyttö ei välttämättä ole aina ja kaikkialla suositeltavaa. Esimerkiksi verkkokaupan sisäänkirjautuneelle käyttäjälle, jonka nimi ja ostoskorin sisältö näkyy HTML-sisällössä, ei pitäisi laittaa HTTP-tason välimuistia lainkaan. Käyttäjän omalla koneella ei välttämättä ostoskorin sisältö päivity heti kun uusi tuote on siihen lisätty ja pahimassa tapauksessa käyttäjän nimi (esim. ”Hei Matti!”) saattaisi näkyä kaikille muillekin käyttäjille. WooCommercessa ja muissa verkkokauppa-alustoissa jokaiselle sisäänkirjautuneelle käyttäjälle asetetaan automaattisesti oma evästeensä, jonka olemassaolo aiheuttaa sen, että HTTP-tason välimuistitusta ei tapahtu.

Parhaimmillaan hyvällä välimuistin käytöllä asiat voivat nopeutua jopa kymmenkertaisesti. Pienilläkin optimoinneilla voi saada kymmenien prosenttien parannuksia. Eikä kyse ole pelkästään nopeudesta: jos välimuistilla voidaan säästää ja jättää jokin turha asia tekemättä, säästyy silloin myös sähköä ja syntyy vähemmän päästöjä. Eli välimuistin käytöstä kiittää sekä loppukäyttäjät että luonto!

Kommentoi

Otto Kekäläinen

Hae WP-palvelu.fi:stä

Lue myös

Uusi kumppanisivu on nyt julkaistu!

6.12.2019

Aloitimme alkukesästä projektin, joka on nyt saatu päätökseensä. Olemme rakentaneet sivuillemme uuden kumppanisivun, jolla on esiteltynä suurin osa yhteistyökumppaneistamme. Olemme […]

Huippuluokan ylläpitoa huippuluokan tapahtumalle

21.11.2019

Nordic Business Forum on Slushin ohella yksi Suomen suurimmista menestystarinoista tapahtumatuotannon saralla. Vuonna 2010 ensimmäistä kertaa järjestetty tapahtuma on tänä […]

WordPress 5.3 ”Kirk” ulkona

14.11.2019

Marraskuun 12. toi meille uuden WordPress-version 5.3, joka tunnetaan myös nimellä ”Kirk”, legendaarisen jazz-muuusikon Rahsaan Roland Kirkin mukaan. Uusi versio […]