Search Posts

Základy ako zrýchliť načítavanie webu

V poslednom období som viac krát riešil problém s načítavaním webových stránok, ktorým sa zvačšil objem dát (hlavne v databáze). Prvotné reklamácia smerovala samozrejme na server a jeho výkon. Po par testoch sa však zistilo, že výkon je v poriadku a server sa nudi aj v prípade, že sa stránka načítava 3-4 sekundy.

Pozrieme sa na to, ako si našu stránku otestovať a vyladiť aby bola rýchlosť načítavania čo najlepšia.

Táto téma je veľmi rozsiahla, tak som sa ju rozhodol rozdeliť do troch časti.

  1. časť – pozrieme sa ako si zmerať rýchlosť načítavania, ako nájsť problém a ako vyriešiť najčastejšie sa opakujúce sa problémy
  2. časť – optimalizácia databázy
  3. časť – pozrieme sa na optimalizáciu prostredia, ako si stránku upraviť, aby potrebovala na prevádzku minimálny výkon
speedweb-hosting

Analýza prevádzky a načítavania

Skôr, ako začneme prechádzať samotný kód stránky, je dobré pozrieť sa na procesy webservera a skontrolovať si,  napríklad vo výpise top, či naša stránka zaberá vyšší výkon procesora. Väčšinou takáto pomalá stránka dokáže zabrať celé jadro procesoru, ktoré obsluhuje daný proces.

Ak máme pri výpise tom podobné hodnoty ako na obrázku, je potrebné so začatím debugu kódu stránky. Príklad výpisu top príkazu:

výpis procesov

Ďalšou veľmi dôležitým nastavením pri analýze webu je logovanie pomalých query a query, ktoré nepoužívajú indexy. Veľká väčšina pomalých webov nemá správne zadefinované indexy. Viac o optimalizácií query a databáz si povieme v pokračovaní môjho článku.

Pre debugovanie webovej stránky si spravte radšej kopiu webu a testujte všetky príklady na subdoméne. Napríklad dev.speedweb.sk

Meranie spotrebovanej RAM

Merať spotrebovanú je možne rôznymi spôsobmi. Najjednoduchšie to je pomocou nastavenia auto_append_file. Vytvoríme si skript memory_usage.php a tento skript zadefinujeme ako auto_append_file. Toto nastavenie nám spraví to, že každá návšteva nám zaloguje hodnotu spotrebovanej ram.

Príklad skriptu memory_usage.php

<?php

$memory = memory_get_usage();

function nice_val ($val) {
         if (abs($val) < 1000 * 1024) {
                return number_format($val / 1024, 2) . “ kB“;
         }
        if (abs($val) < 1000 * 1048576) {
               return number_format($val / 1048576, 2) . “ MB“;
        }
       return $val;
}

$mem = nice_val($memory);
$line = „{$_SERVER[‚SCRIPT_FILENAME‘]} => {$mem}“;
openlog(„PHP Memory usage“, LOG_PID, LOG_SYSLOG);
syslog(LOG_WARNING, $line);

Merať spotrebovanú ram môžeme v tomto prípade len ak máme prístup k logom servera a vieme si nastaviť PHP premennú auto_append_file. Ak tieto možnosti nemáme, môžeme si na konci našich skriptov vložiť kód, ktorý nám zapíše spotrebovanú RAM do súboru.

Príklad kódu:

$memory = memory_get_usage();
$line = "{$_SERVER['SCRIPT_FILENAME']} => {$memory}";
$fp = fopen('memory.log', 'w');
fwrite($fp, $line);
fclose($fp);

Meranie času

Na meranie času trvania skriptu je potrebné merať tak, že si odčítame čas na konci a začiatku skriptu. Použijeme na to funkciu microtime() s parametrom true.

Príklad kódu<?php
$zaciatok = microtime(true);
// Váš kód$koniec = microtime(true);
$cas = $koniec – $zaciatok;echo „Skript trval $cas sekund\n“;
?>Takto môžeme merať čas načítavania na rôznych miestach kódu. Zvyčajne sa dopracujete k pár problematickým miestam, ktoré bude potrebné prerobiť a optimalizovať. Najčastejšie to býva generovanie obrázkov, pdf súborov a volanie databázových query. Problematika vytvárania tabuliek a optimalizácia query je na tolko obsiahla, že som sa jej rozhodol venovať zvlášt clánok.

Optimalizácia databáz

Najčastejšou príčinou pomalého načítavania stránok býva optimalizácia databázy, zle navrhnuté tabuľky (štruktúra, velkosť, indexy), zle vyskladané query. Pri vytvárani a správe databazy je vždy potrebne mať na pamäti otáku: Ako sa mi bude systém spravať, ak mi dáta narastú na sto tisíc až milion záznamov? Aj tie najhoršie query zbehnú za výborny čas, ak robíme select len cez pár riadkov.

Dátový typ tabuliek

Najčastejšie sa používajú dva typy MyIsam a InnoDB. MyIsam je rýchlejší typ, na druhej strane nie je zaručená konzistentnoť dát. Ďalšou nevýhodou je čas locknutia tabuliek pri updatoch. InnoDB je pomalší engine, na druhej strane sa nám ale stará o konzistentnosť dát a v pripade chyby sa vie vrátiť. Ak ale nepotrebujete výužívať transakcie, odporúčam používať typ MyIsam.

Štruktúta tabuliek

Ak vytvárame nové tabulky, je dobré si ich nakresliť a pospájať si ich vzájomné relácie. Tabulky je potrebné navrhnuť tak, aby neboli zbytočne velké a aby pracovali s čo možno najmenej operáciami. V žiadnom prípade neukladať do tabuliek dáta (obrázky, hudbu, súbory)

Ak už máme živý projekt, veľmi tažko sa nám mení celková štruktúra tabuliek. V takýchto prípadoch môžeme výužiť napríklad pridanie tabulky, ktorá nám zjednoduši počet operácií. Napríklad, ak máme dve tabulky s relaciou n ku m (napr. n produktov a každý produkt ma m kategorií), vytvoríme si referenčnú tabulku, kde vložime každé spojenie produktu a kategórie. Stúpne nám síce  objem dát, ale ušetríme si tým veľké množstvo operácií.

INDEXY  a EXPLAIN

Pre čo najrýchlejšie výhladavanie v tabulkách je potrebné mať správne nastavené indexy. Je to vlastne dátová struktúra, ktorá nám urýchluje vzhľadávanie. Existuje jedno pravidlo, že všetko, čo máme za where by malo mať index. Je dobré sa ho držať, ale treba indexy voliť rozumne, nakolko nie je dobré mat nadefinovaných priveľa indexov.

Rovnako musíme zadefinovať index aj v prípade, že spájame viac tabuliek. JOIN, LEFT JOIN…

Ak si nevieme rady, ako zadefinovať správne index, môžeme použiť príkaz EXPLAIN. Vyskladáme si náš požadovaný select a potom len pred select vložíme EXPLAIN. Tento príkaz nám poskytne výpis existujúcich klúčov, navrhne nové kľúče a vypíše nám aj údaj o tom, koľko riadkov je potrebné prehladať, kým sa dostaneme k výsledku.

V prípade viacerých podmienok za WHERE nám zvýsi rýchlosť zadefinovanie zložených indexov.

CREATE INDEX zlozeny_index on TABLE (stípec1, stípec2) ;

QUERY

Každé query, ktoré voláme by mali spínať nasledovné body:

  • používať INDEXY pri WHERE, JOIN a ORDER
  • používať LIMIT a selectovat len tolko riadkov, koľko naozaj potrebujeme
  • nepoužívať veľké dátové typy BIGINT,..
  • pri JOIN používať rovnaké dátove typy a rovnakej velkosti
  • definovať si, ktoré stípce chceme selectovat, nie select . from…
  • použivat SELECT DISTINCT iba ak je to nutné

vyhladávanie a diakritika

Ak prehladávate veľké textové polia, je rýchlejšie použiť LIKE ako REGEXP. Velké textove pokia sa zvyknú prehladávať full-textovým prehladávaním (MATCH .. AGAINST). Full-text však nedokážu detekovať text ak zadáme bez diakritiky a chceme aby našlo aj s diakritikou. LIKE dokáže najsť zhodu aj v prípadoch, ak zadáme slovo bez diakritiky ak máme data v utf-8 a tabulku mame v kodovaní utf8_general_ci.

Ďalšia možnost, ako optimalizovať vyhladávanie aj s diakritikou je tá, že si upravíme náš text do standardizovanáho tvaru bez diakritiky uložíme si ho do dalšieho stĺpca a prehladávame upravený text.

V ďalšej časti sa pozrieme na to, ako upraviť nastavenia na servery, cache a kompresiu tak, aby mala stránka čo najrýchlejšiu odozvu.

Zdroj : https://www.speedweb.sk/blog/ako-zrychlit-nacitavanie-webu-1-cast/

Zdroj : https://www.speedweb.sk/blog/ako-zrychlit-nacitavanie-webu-2-cast/

Pridaj komentár