Kontaktovať podporu

Odpovedáme e-mailom, zvyčajne do dvoch dní.

Google reCAPTCHA kontroluje toto podanie na ochranu pred zneužitím; údaje sa prenášajú spoločnosti Google. Skript sa načíta až pri otvorení tohto formulára.

← Všetky príspevky

Čo naozaj stojí načítanie celého lib/

O obsahu a jeho overovaní

V tomto článku

Riadok 46 jediného vstupného súboru tejto služby:

foreach (glob(__DIR__ . '/lib/*.php') as $f) { require_once $f; }

To je 65 súborov a 1,5 megabajtu načítavaných pri každej požiadavke. Obrázok počítadla, stránka so štatistikami, 404 — všetko rovnako. Včera sa to stalo 20 734-krát.

26 rodín dizajnov počítadiel — 715 KB, použije sa jedna vlajky 189 KB · grafy 158 KB · všetko ostatné 470 KB studené, bez vyrovnávacej pamäte operačných kódov: 132 ms operačné kódy vo vyrovnávacej pamäti na disku: 18,2 ms operačné kódy v zdieľanej pamäti: 0,33 ms — glob a 65 volaní stat 65 súborov, 1,5 MB, 56 tried, každá požiadavka

Číslo, na ktorom záleží, je to malé

Načítať všetko od začiatku s vypnutou vyrovnávacou pamäťou operačných kódov trvá približne 132 milisekúnd. To je číslo, ktoré by z toho robilo problém, a nie je to číslo, ktoré server platí.

Pri už skompilovaných operačných kódoch v zdieľanej pamäti zostáva výpis adresára a jedno volanie stat() na súbor, pretože overovanie časových značiek je zapnuté: 0,33 milisekundy. Pri včerajšej návštevnosti je to menej než sedem sekúnd práce za celý deň.

Medzi nimi je tretie meranie, 18,2 milisekundy, vykonané s vyrovnávacou pamäťou operačných kódov čítajúcou z disku namiesto pamäte. Je to horná hranica, nie skutočný údaj — to, čo sa deje, keď vyrovnávacia pamäť existuje, ale je pomalšia než tá skutočná. Uvádza sa preto, že je to jediná hodnota po zahriatí merateľná z príkazového riadka a predstieranie opaku by bolo ľahkou chybou.

Teda: toto nestojí takmer nič a nestojí to takmer nič výhradne vďaka niečomu inému. Vypnite vyrovnávaciu pamäť operačných kódov a ten istý riadok stojí štyristokrát viac. Je to skutočná závislosť a oplatí sa o nej vedieť namiesto jej objavenia pri aktualizácii.

Čo je v tých 1,5 megabajtu naozaj

Štyridsaťsedem percent — 715 kilobajtov v 26 súboroch — tvoria rodiny dizajnov počítadiel. Vykreslenie obrázka počítadla potrebuje presne jednu z nich. Ostatných 25 sa načíta, deklaruje a nikdy nepoužije.

Ďalej: 189 kilobajtov údajov o vlajkách potrebných na geografickej stránke; 158 kilobajtov knižnice na grafy potrebných pri vykresľovaní grafu. Ani jedno sa nepodieľa na poskytovaní obrázka počítadla, čo je požiadavka, na ktorú táto služba odpovedá častejšie než na ktorúkoľvek inú.

Viditeľnou cenou je pamäť, nie čas. Špičková pamäť na požiadavku sa zvýši približne o štyri megabajty a na rozdiel od operačných kódov — zdieľaných medzi všetkými procesmi — sa táto časť platí pri každej požiadavke súbežne každým pracovným procesom naraz.

Niekto si to už všimol

Vzor glob je lib/*.php. Nie je rekurzívny a tesne pod ním sú dva adresáre: lib/live/ s 229 kilobajtmi a lib/recht/ so 182 kilobajtmi. Štyristo kilobajtov, ktoré kedysi boli v ceste načítavania a teraz nie sú.

Presunuli sa, pretože sú veľké a málokedy potrebné: časti štatistík a právne texty. Celým mechanizmom je umiestnenie o adresár hlbšie. Nie je tu konfigurácia, odložený zavádzač ani mapa automatického načítavania — súbor buď je vo vzore glob, alebo nie je.

Je to skutočná oprava a oplatí sa to povedať, pretože zjavným ďalším krokom by bol automatický zavádzač a ten by tu bol veľkou zmenou na riešenie problému, ktorý príkaz mkdir už vyriešil dvakrát.

Prečo zostáva

Jediný glob je najjednoduchšia vec, ktorá môže fungovať, a podľa dôkazov funguje: tretina milisekundy na malom serveri v mechanizme, ktorý musí byť rýchly. Nahradiť ho samostatnými príkazmi require pre súbory znamená pre každý nový súbor riadok niekde navyše a zabudnutý riadok vytvorí fatálnu chybu v produkcii namiesto trochu väčšej záťaže.

Potrebuje však zapísať to, čo ho od začiatku robilo životaschopným: ak sa súbor v lib/ zväčší, presunie sa do podadresára a načíta sa cez require tam, kde sa používa. Týmto pravidlom sa riadili tie dva adresáre a až doteraz nebolo nikde zapísané.

Všeobecná verzia je nudnejšia než meranie. „Všetko načítava všetko“ je zvyčajne nesprávny tvar a pred prestavbou sa oplatí zmerať jeho cenu. Tu stojí 0,33 milisekundy a štyri megabajty a práve štyri megabajty treba sledovať, pretože rastú so súbežnosťou a milisekundy nie.

Reklama