Ako sme zrýchlili web Poľnoinfo.sk, keď pri 500% náraste návštevnosti začal padať

Jedného dňa som si od môjho dlhoročného klienta a kamaráta našiel správu, že jeho portál Poľnoinfo.sk sa už hodinu nechce poriadne načítať. Keďže ten web sme mu pred vyše rokom vytvorili my, ihneď som si sadol za laptop a začal skúmať, kde je problém. Tento článok je súhrnom toho, ako sa nám podarilo zistiť, kde bol problém a problém vyriešiť takým spôsobom, že sa teraz portál načíta rýchlejšie ako kedykoľvek predtým.

Správa od klienta

Správa od klienta, ktorá nepoteší

Ihneď som web otvoril a potvrdil, že web sa buď nenačítal vôbec, alebo sa načítal po 30 až 60 sekundách.

Chybová hláška Too Many Requests

Chybová hláška pri pokuse o načítanie webu

Ako vyriešiť problém s pomalou alebo nefunkčnou WordPress web stránkou

Testovanie web stránky s nástrojom WebPageTest

Web stránku Poľnoinfo som otestoval cez online testovací nástroj WebPageTest, ktorý načíta aktuálnu verziu web stránky a zobrazí detailné vyhodnotenie procesu jeho načítania. Ak sa nejaký web načíta pomaly, tento test zvyčajne problém odhalí.

Výsledok testu bol však v poriadku. Web sa načítal v štandardnej rýchlosti 5,6 sekundy na prvé načítanie a 4,2 sekundy na opatovné načítanie tým istým návštevníkom. Žiadny problém som neobjavil.

Testovanie web stránky s nástrojom Google Analytics

Následne som otvoril štatistiky návštevnosti portálu cez Google Analytics a uvidel, že za predchádzajúci deň narástla čítanosť portálu o 20%. Čítanosť v daný deň som nevedel, keďže Google Analytics neuvádza dáta z daného dňa ihneď, ale s oneskorením. Presné štatistiky návštevnosti je preto možné vidieť iba za predchádzajúce dni. Nárast čítanosti o 20% však nemôže spôsobiť kolaps web stránky. Problém musel byť niekde inde.

Kontrola web stránky na smartfóne

Pri zobrazení portálu na mobile sa mi stránka načítala rýchlo. Nevšimol som si ani len malé spomalenie načítania. Klient mi však potvrdil, že aj na mobile mu to web načítať nechcelo. Toto je vážnejší problém, ako som si myslel.

Chybová hláška na mobile

Chybová hláška pri pokuse o načítanie webu na mobile

Kontrola webhostingu: Pomalé príkazy na databázu

V administrácii webhostingu od Websupportu som si potom všimol informáciu o tom, že web Poľnoinfo.sk zadával mnoho „pomalých príkazov“ na databázu. To znamená, že jeden alebo viacero skriptov webu sa snažilo získať údaje z databázy veľmi neefektívnym spôsobom, ktorý spomaľoval rýchlosť načítavania. Vo výpise daných pomalých príkazov som videl, že niektoré príkazy na databázu sa snažili načítať až 1,5 milióna riadkov jednej z tabuliek databázy. To je nesmierne veľa údajov, hlavne keď sa načítajú pri každom zobrazení web stránky nejakým návštevníkom.

Ak neviete, čo je to databáza alebo ako funguje, stačí vám vedieť, že databáza je niečo ako balík excelovských tabuliek, do ktorých web stránka zapisuje svoje údaje a z ktorých tie údaje získava vtedy, keď ich potrebuje.

Informácia o pomalých príkazoch na databázu v administrácii Websupportu

Informácia o pomalých príkazoch na databázu v administrácii Websupportu

Analýza vnútorných procesov web stránky cez Query Monitor

Portál Poľnoinfo je postavený na redakčnom systéme WordPress. Tento systém je najpopulárnejším redakčným systémom na svete a beží na ňom 35 % všetkých web stránok na internete a až 52% z TOP 1 milióna najpopulárnejších web stránok na svete. Výhodou jeho populárnosti je aj to, že pre WordPress existuje množstvo pluginov (zásuvných modulov či doplnkov), ktoré pridajú web stránke rôznu funkcionalitu. Jedným z nich je aj Query Monitor, plugin, ktorý zobrazí interné štatistiky načítania web stránky, na ktorej je nainštalovaný.

Po nainštalovaní Query Monitoru sa mi potvrdilo to, čo ukázali už dáta z webhostingu – niekoľko príkazov na databázu bolo tak zle definovaných a takých náročných, že to databáza pri náraste čítanosti prestala zvládať.

Pomalý príkaz na databázu

Jeden príkaz na databázu trval až 20 sekúnd!

Funkcionalita, ktorá znefunkčnila portál Poľnoinfo

Portál Poľnoinfo meria čítanosť všetkých svojich článkov. Informácia o počte zobrazení jednotlivých článkov je hodnotná nie iba pre prevádzkovateľa portálu, ale aj pre samotných čitateľov. Portál už od svojho začiatku zobrazuje aj rebríček čítanosti – 5 najčítanejších článkov za posledných 24 hodín a 5 najčítanejších článkov za posledných 7 dní, ale taktiež aj rebríček troch najkomentovanejších článkov za posledných 7 dní.

Na vytvorenie tejto funkcionality portál Poľnoinfo používa jeden z obľúbených WordPress pluginov. Ten funguje tak, že pre každé jedno zobrazenie každého jedného článku každým jedným návštevníkom portálu zapíše do databázy informáciu o tom, že daný článok bol zobrazený. To je v poriadku a databázu to nezaťažuje. Čo spôsobovalo problém bolo, ako daný plugin získaval štatistické údaje o najčítanejších článkoch za posledných 24 hodín, no predovšetkým za posledných 7 dní. Na to sme však prišli až o dva dni neskôr, keď sme videli v štatistikách návštevnosti portálu, že návštevnosť Poľnoinfo.sk stúpla za posledné dva dni o vyše 500 %.

Nárasť čítanosti Poľnoinfo

Čítanosť Poľnoinfo stúpla o 200% v porovnaní s predchádzajúcim týždňom, v jeden deň dokonca až o 518%!

Najčítanejšie články na Poľnoinfo mávali štandardne okolo tisíc až 2 000 čítaní. Teraz však mali najčítanejšie články až vyše 8 000 čítaní. Top 5 najčítanejších článkov za posledných 7 dní malo spolu skoro 20 000 čítaní. Keď teda chcel web získať informáciu o tom, ktoré články boli za posledný týždeň najčítanejšie, musel v databáze načítať skoro 20 000 riadkov údajov. Pritom ale musel prejsť všetky riadky v danej tabuľke, ktorých je aktuálne vyše jeden a pol milióna. A to všetko iba preto, aby na webe zobrazil nadpis piatich článkov s informáciou o ich aktuálnej čítanosti.

Čo je to cachovanie, ako funguje a prečo nám v tomto prípade nepomohlo

Cachovanie je jedným z najefektívnejších spôsobov, ako zrýchliť načítanie web stránok. Funguje tak, že keď príde nejaký návštevník na web stránku, tak sa určité dáta danej web stránky uložia v jeho prehliadači a pri opatovnom načítaní danej web stránky sa už nenačítajú z internetu, ale priamo z disku daného zariadenia – počítača, laptopu alebo smartfónu – čo načítanie web stránky výrazne zrýchli. Vidieť to môžete aj vo výsledkoch načítavania portálu cez službu WebPageTest, ktorý som spomínal za začiatku článku.

Ako funguje cachovanie web stránok

Porovnanie množstva sťahovaných informácii pri prvom a opätovnom načítaní webu Poľnoinfo. Test bol robený pred optimalizáciou, ktorú popisujem v tomto článku.

Na portáli Poľnoinfo používame cachovanie už dávno. Box s informáciami o najčítanejších článkov však bol z cachovania vynechaný, pretože sme chceli docieliť tie najčerstvejšie údaje o aktuálnej čítanosti článkov. Keď sa totiž tie čísla o čítanosti článkov „zacacheujú“, môžu sa potom návštevníkom zobraziť neaktuálne údaje. V prípade najčítanejších článkov za 24 hodín to spôsobovalo výrazné odchylky, kde napríklad nejaký článok mal už reálnu čítanosť 400, ale v zozname najčítanejších článkov mal stále iba 150, alebo aj menej.

Keď nastal problém s načítaním webu Poľnoinfo pre rýchly nárasť návštevnosti a prišli sme na to, že problém spôsoboval box s najčítanejšími článkami, zapli sme jeho cachovanie a zvýšili frekvenciu vyprázdňovania cache na každých 15 minút. To znamená, že informácie o najčítanejších článkov sa z databázy sťahovali iba raz za 15 minút. To však náš problém odstránilo iba navonok.

Zle naprogramovaný web cachovanie nevyrieši, iba daný problém schová

Po zapnutí cachovania to vyzeralo tak, že problém bol vyriešený. Klientovi sa web načítal rýchlo. Mne taktiež. Aj informácie z Query Monitora, pluginu, ktorý som spomínal vyššie, boli pozitívne. Web fungoval.

Ale, raz za čas za opäť nechcel načítať a Query Monitor vypísal informáciu o tom, že nejaký skript sa načítal aj 30 sekúnd. Cachovaním sme problém nevyriešili, iba sme ho schovali tým, že sa web návštevníkom po prvom extrémne pomalom načítaní stránky už načítal rýchlo, keďže sa načítal z cache prehliadača daného návštevníka a daný pomalý príkaz na databázu sa teda nespustil. Avšak, po 15 minútach sa cache webu automaticky vymazala a tak bolo ďalšie načítanie webu opäť extrémne pomalé.

Riešenie na mieru, ktoré problém na dobro odstránilo

Keď sme prechádzali kód pluginu na vytvorenie funkcionality najčítanejších článkov, potvrdilo sa nám, čo hovoril Query Monitor, aj štatistiky webhostingu. Príkaz na databázu, ktorý daný plugin vykonával pri každom zobrazení stránky nejakým novým návštevníkom, bol vysoko neefektívny a pri čítaností článkov v tisíckach databáza tento príkaz buď nevedela vykonať, alebo ho vykonala s oneskorením v desiatkach sekúnd.

Riešením z našej strany bolo na mieru vytvoriť skript, ktorý vykonáva nasledovné:

  1. Každých 15 minút sa skript pripojí na databázu a efektívnym spôsobom získa údaje o najčítanejších článkoch za 24 hodín a 7 dní, a o najkomentovanejších článkoch za 7 dní.
  2. Po každom získaní údajov (spolu sú 3) je zámerne pridané takzvané uspanie skriptu na 5 sekúnd, ktoré zníži potenciálnu záťaž na databázový server.
  3. Získané údaje skript spracuje a do databázy uloží už iba samostatné nadpisy článkov, odkazy na tieto články (url adresy) a počet ich zobrazení za dané časové obdobie (zvlášť pre 24 hodín a za 7 dní).
  4. Body 1 až 3 prebiehajú na pozadí, to znamená, že neovplyvňujú rýchlosť zobrazenia portálu návštevníkom. Skript sa spustí iba jedenkrát každých 15 minút.
  5. Pri zobrazení stránky návštevníkom sa z databázy načíta iba jeden riadok, v ktorom sú zapísané údaje o aktuálne najčítanejších článkoch (z bodu 3).

Vytvorením tohto jednoduchého skriptu sme zabezpečili, že pri načítaní web stránky sa z databázu nezískavajú údaje z vyše jeden a pol milióna riadkov, ale iba z jedného jediného. Myslím, že ten rozdiel v rýchlosti je jasný.

Optimalizované príkazy na databázu

Optimalizované príkazy na databázu. Prvý zisťuje najčítanejšie články za 7 dní, druhý najkomentovanejšie články za 7 dní. Spolu ich vykonanie trvá iba stotinu sekundy (0,01 s), zatiaľ čo pôvodný skript trval desiatky sekúnd.

Po pár dňoch sme už videli obrovský rozdiel v efektivite portálu aj v štatistikách webhostingu. V grafoch nižšie môžete vidieť nárasť záťaže 20. apríla, keď začalo na portál chodiť výrazne viac ľudí. 21. apríla sme problém vyriešili a síce bolo na webe ešte viac ľudí ako deň predtým (ako je možné vidieť v grafe Google Analytics vyššie), web to už bez problémov zvládal, a dokonca pritom používal výrazne menej zdrojov. 22. apríla už bola hotová aj ďalšia optimalizácia (viac nižšie) a efektivita webu ešte porástla. Dôležitá poznámka: Snímky obrazovky boli robené 23. apríla, preto v grafe údaj z tohto dňa nie je započítaný (resp. je na nule).

Štatistiky záťaže serverového počítača

Záťaž serverového počítača v sekundách. Väčšia celková záťaž znamená pomalší (menej efektívny) web. Portál bol optimalizovaný 21. a 22. apríla.

Štatistiky záťaže serverového počítača

Celkový počet množstva načítaných a zapísaných údajov z a do databázy. Čím menej údajov sa z databázy sťahuje a do databázy zapisuje, tým je web rýchlejší. Portál bol optimalizovaný 21. a 22. apríla.

Ďalšia optimalizácia rýchlosti načítania portálu

Keď sme už na webe Poľnoinfo riešili rýchlosť načítavania, pozreli sme sa aj na iné časti, ktoré by sme mohli vylepšiť. K zisteniu toho, čo sa dá na webe vylepšiť, je skvelá aj služba WebPageTest spomínaná vyššie, no my sme sa v tomto prípade sústredili na službu GTmetrix, ktorá dokáže otestovať web stránku naraz hneď cez niekoľko nástrojov a má prehladné užívateľské rozhranie.

Príliš skoré načítanie skriptov

Najväčšou slabinou portálu Poľnoinfo bolo príliš skoré načítanie skriptov, ktoré neboli potrebné ihneď pri načítaní webu. Príliš skoré načítavanie skriptov, ktoré nie sú potrebné, dokáže výrazne spomaliť rýchlosť načítania web stránky. Problémom WordPressu a používania rôznych pluginov od rôznych autorov je to, že nemáme priamu kontrolu nad ich kódom a záleží na nich, ako kvalitne ich plugin optimalizujú pre efektívne, rýchle načítanie.

Testom cez GTmetrix sme objavili niekoľko problémových pluginov. Jedným z nich bol skript od Facebooku, cez ktorý sa v pätičke webu načítal „Facebook Like Box“, teda priamo kód od Facebook s aktuálnymi údajmi o facebookovej stránke Poľnoinfo. Tento Facebook box sme odstránili a nahradili ho animovaným banerom. Táto malá a jednoduchá zmena ihneď zlepšila rýchlosť načítania každej podstránky portálu (zo známky B – 84% na známku B – 88%).

Ďalšími problémovými boli skripty z pluginov, ktoré na webe vytvárajú funkcionalitu kalendára poľnohospodárskych podujatí a chránia kontaktné formuláre pred spamom. Ich načítanie sme oneskorili tak, aby nespomaľovali rýchlosť webu.

Načítanie skriptov, ktoré nie sú potrebné

Taktiež sme úplne odstránili načítanie skriptov na podstránkach, kde neboli potrebné. Napríklad skripty galérie fotografií nie je potrebné načítať na úvodnej stránke portálu a skripty vytvárajúce grafy burzových cien stačí načítať iba na podstránkach s grafmi.

Všetkými týmito zmenami sme boli schopný dosiahnuť načítanie web stránky (vrátane reklamných banerov) za 4,5 sekundy, pri opätovnom načítaní iba za 3,6 sekundy. Hodnotenie GTmetrix sme zlepšili z pôvodnej známky C – 78 % (skoršie v mesiaci apríl) na známku A – 91 % (až A – 95 % v prípade vypnutia neoptimalizovaných meracích kódov jednej reklamnej kampane, ktorá aktuálne na webe prebieha).

Test rýchlosti načítania web stránky

Pôvodný výsledok portálu Poľnoinfo z 3. apríla

Test rýchlosti načítania web stránky

Výsledok rýchlosti načítania portálu Poľnoinfo po jeho optimalizácii

Záver

Je dôležité, aby vaša web stránka vyzerala profesionálne, bola prehľadná a funkčná. Čo je však rovnako dôležité, a mnoho ľudí to podcenuje až dokým je neskoro, je fungovanie web stránky na pozadí. Jej svižnosť a efektivita. Pretože krásna web stránka je vám nanič, keď nefunguje. Pri webe Poľnoinfo sme to podcenili a doplatili sme na to. Poučili sme sa však, portál sme optimalizovali a pripravili ho na ďalší rast a zvyšujúcu sa návštevnosť.

To, že vaša web stránka funguje dnes, ešte neznamená, že bude bez problémov fungovať aj zajtra. Niekedy stačí iba jeden skvelo napísaný článok. Jeden odkaz na váš web z nejakého populárneho webu. Jedna zmienka v televízii a môžete mať problém.

Ďakujeme za pozornosť

Zanechajte nám komentár