WordPressissä on monia suorituskykyyn vaikuttavia tekijöitä, joista osa on dramaattisia ja helposti havaittavia. Hitaat SQL-kyselyt. Raskaat lisäosat. Kuvien optimointi. Mutta sitten on tämä hiljainen, lähes näkymätön mekanismi, joka voi tehdä sivustosta tahmean ilman että mikään yksittäinen asia näyttää olevan rikki.
Autoloaded options.
Kyse ei ole bugista, vaan design-valinnasta. Ja juuri siksi se on kiinnostava.
Mikä autoloaded option oikeastaan on?
WordPress tallentaa asetukset wp_options-tauluun. Jokaisella optionilla on autoload-kenttä:
-
autoload = yes -
autoload = no
Kun WordPress käynnistyy, se tekee jotain hyvin ratkaisevaa:
Se lataa kaikki autoload = yes -asetukset yhdellä kyselyllä muistiin.
Ajatus on elegantti. Jos jokin asetus tarvitaan lähes jokaisella sivulatauksella, sen hakeminen etukäteen on tehokasta.
Yksi kysely → kaikki tärkeä data.
Kaunis teoria.
Designin alkuperäinen tarkoitus
Autoload-järjestelmä on optimointi. Ei hidaste.
Se on tarkoitettu pienille, usein tarvittaville arvoille:
-
sivuston nimi
-
URL
-
aktiiviset lisäosat
-
teemaan liittyvät asetukset
Ilman autoloadia WordPress tekisi jatkuvasti pieniä lisäkyselyitä. Autoload niputtaa nämä yhteen.
Kun data on pientä → ratkaisu on loistava.
Kun data ei ole pientä → syntyy ongelma.
Näkymätön suorituskykysyöppö syntyy
Autoload ei kysy:
“Kuinka suuri tämä arvo on?”
Se kysyy vain:
“Ladataanko tämä aina?”
Jos lisäosa tallentaa massiivisen datarakenteen ja asettaa:
autoload = yes
WordPress lataa sen jokaisella pyynnöllä.
Myös silloin kun dataa ei käytetä.
Tässä kohtaa optimointi muuttuu painolastiksi.
Muistin kulutus kasvaa salakavalasti
Autoloaded options -data:
-
ladataan aina
-
pidetään muistissa koko pyynnön ajan
-
vaikuttaa jokaiseen sivulataukseen
Tämä tarkoittaa:
-
suurempi muistinkäyttö
-
pidempi initialisaatio
-
hitaampi TTFB (time to first byte)
Ja mikä petollisinta:
Yksittäinen option ei näytä dramaattiselta.
Ongelma on kertymä.
Kuinka ongelma syntyy käytännössä?
Tyypillinen skenaario:
Lisäosa tarvitsee tallennustilaa. Kehittäjä käyttää Options APIa. Kaikki toimii. Sitten data kasvaa.
Esimerkiksi:
-
API-vastaukset
-
välimuistit
-
raportit
-
logit
-
massiiviset konfiguraatiot
Ja koska autoload = yes on usein oletus tai helppo valinta…
Boom.
Hiljainen suorituskykyeroosio.
Miksi tämä on niin vaikea havaita?
Autoloaded options -ongelmat ovat harvoin dramaattisia.
Ei virheilmoituksia. Ei kaatumisia. Ei selkeää savua konepellin alta.
Sen sijaan:
-
sivusto tuntuu hitaammalta
-
admin tuntuu tahmealta
-
CPU-kuorma kasvaa
-
muistirajat paukkuvat satunnaisesti
Se on kuin digitaalinen painonnousu. Ei huomaa päivässä, huomaa vuodessa.
Debuggaus on epämiellyttävän epäsuoraa
Kun sivusto hidastuu, epäily kohdistuu yleensä:
-
tietokantaan
-
lisäosiin
-
hostingiin
-
PHP-versioon
Harva ajattelee ensimmäisenä:
“Kuinka paljon autoloaded options -dataa ladataan?”
Silti usein juuri siellä piilee syyllinen.
Autoload ja TTFB:n psykologia
TTFB ei ole vain tekninen metriikka. Se on käyttäjäkokemuksen hermokeskus.
Autoloaded options vaikuttavat aivan pyynnön alkuun:
-
WordPress käynnistyy
-
options ladataan
-
muisti täyttyy
-
logiikka jatkuu
Jos autoload-data on massiivista, viive syntyy ennen kuin mitään näkyvää tapahtuu.
Käyttäjä kokee:
“Sivusto reagoi hitaasti.”
Vaikka HTML-generointi olisi nopeaa.
Klassinen antipattern: välimuisti options-taulussa
Yksi yleisimmistä virheistä:
Transienttien tai välimuistin tallentaminen optioniksi autoload = yes.
Välimuistin idea:
-
dataa käytetään joskus
-
data vanhenee
-
dataa ei tarvita aina
Autoloadin idea:
-
data tarvitaan aina
Näiden yhdistäminen on looginen ristiriita.
Silti sitä tapahtuu jatkuvasti.
Miksi kehittäjät päätyvät tähän ansaan?
Syyt ovat inhimillisiä.
Options API on:
-
helppo
-
nopea
-
tuttu
-
ei vaadi skeemasuunnittelua
Autoload:
-
toimii oletuksena
-
ei näytä vaaralliselta
-
ei aiheuta välitöntä ongelmaa
Ja koska vaikutus näkyy vasta mittakaavassa…
Virhe on hiljainen.
Kuinka iso on “liian iso”?
Ei ole yhtä maagista rajaa, mutta käytännön havaintoja on.
Autoloaded options yhteensä:
-
muutama kymmenen kilotavua → normaalia
-
satoja kilotavuja → varoitusmerkki
-
megatavuja → ongelma
-
useita megatavuja → suorituskykykatastrofi
Muista: tämä ladataan joka pyynnöllä.
Etusivu. Admin. AJAX. REST.
Kaikki.
Autoload ja muistimalli
Kun autoloaded options ladataan:
-
ne jäävät PHP-muistiin
-
ne kopioidaan tarvittaessa
-
ne vaikuttavat garbage collectioniin
Suurempi muistijalanjälki ei ole vain RAM-kysymys. Se vaikuttaa koko suorituksen dynamiikkaan.
Muisti ei ole neutraali resurssi.
Näkymätön kertymä: monta pientä syntiä
Todellinen ongelma ei usein ole yksi massiivinen option.
Se on:
-
200 keskikokoista optionia
-
useita lisäosia
-
vuosien kertymä
-
uninstall-logiikan puute
WordPress-sivustot vanhenevat. Lisäosia vaihdetaan. Data jää.
Autoload ei unohda.
Autoload ja legacy-sivustot
Vanhoilla sivustoilla tämä on erityisen yleistä.
Historia:
-
lisäosa asennettu 2018
-
lisäosa poistettu 2020
-
optionit jäljellä
-
autoload = yes
WordPress lataa ne edelleen.
Digitaalinen kummitustalo.
Hyvä käytäntö: mitä autoloadiin kuuluu?
Autoloadiin kuuluu data, joka on:
-
pieni
-
usein tarvittu
-
kriittinen lähes kaikille pyynnöille
Ei kuulu:
-
välimuisti
-
suuret datarakenteet
-
harvoin käytetty data
-
laskennalliset tulokset
Autoload on premium-muistia. Sinne ei dumpata kaikkea.
Arkkitehtuurinen ajattelutapa
Autoload ei ole vain tekninen flagi. Se on arkkitehtuuripäätös.
Kun asetat autoload = yes, sanot:
“Tämä data kuuluu jokaiselle sivulataukselle.”
Se on vahva väite.
Kannattaa olla varma.
Suorituskyvyn ironia
Autoload-järjestelmä on tehty nopeuttamaan WordPressiä.
Silti väärin käytettynä se on yksi yleisimmistä hidasteista.
Optimoinnista tulee pullonkaula.
Teknologian klassinen paradoksi.
Lopuksi: hitauden hiljainen ekosysteemi
WordPress-hitaus on harvoin yhden asian syy.
Se on ekosysteemi:
-
hieman raskas teema
-
muutama hidas kysely
-
liian paljon lisäosia
-
ja autoloaded options paisuneena taustalla
Autoloaded options ovat petollisia, koska ne ovat:
-
näkymättömiä
-
hiljaisia
-
aina läsnä
Kun sivusto hidastuu ilman ilmeistä syytä, siellä ne usein odottavat. Ei dramaattisesti. Ei aggressiivisesti. Vain rauhallisesti kuluttaen resursseja jokaisella pyynnöllä.
Täydellinen suorituskykysyöppö.
