A számítástechnikában semmi sem az, aminek látszik. Ennek egyik oka a caching, azaz átmeneti tár, ami szinte mindenhol jelen van és nagyon fontos. Például ha nem lenne a géped processzorában, akkor a teljesítménye a századára/ezredére esne vissza és csak poháralátétnek lenne jó.
Megpróbálom laikusok számára is érthető módon elmagyarázni, hogy mi ez és hogyan használjuk a weben - egy újabb tudományos-ismeretterjesztő fantasztikum a Szantog blogon! (A caching nem egyenlő cashing.)
A cache arra való, hogy amit már egyszer kiszámoltunk/elkészítettünk, ne kelljen mégegyszer. Egyszerű példával: ha megkéred a gépedet, hogy számolja ki mennyi 30x5, akkor nem áll neki egyből kiszámolni, hanem megnézi, hogy megvan-e neki már ez az eredmény. Ha megvan, akkor nem fog számolgatni és így teljesítményt spórol.
Ez nagyobb blokkokban is működik: lehet olyat, hogyha a gép már "kiszámolt", azaz elkészített egy weboldalt, akkor az újabb és újabb kérések esetén nem fogja ismét elkészíteni, csak a már eltárolt eredményt küldi ki.
Persze a világ összes tárhelye sem lenne elég egy átmeneti tárhoz, olyan sokféle eredmény lehetséges. Az átmeneti tárból a legkevésbé használt dolgok automatikusan törlésre kerülnek és ha mégis szükség lenne rájuk, ismét ki kell számolni őket. A cache tárhely gazdálkodása ezért nagyon fontos és roppant ügyes algoritmusokat találnak ki, hogy a lehető legnagyobb legyen a cache találati aránya, azaz amikor nem kell dolgozni hanem benne van a kért eredmény.
A cache másik jellemzője még, hogy általában több rétegű. Ahogy az életben más területekre is jellemző, semmi sincs ingyér: a gyors és fürge dolgokban lévő cache-eknek kicsi, a lassabb dolgokban lévőknek nagyobb a tárhelyük.
Ez még a gépedben lévő processzorban is jelen van. Egy mai darabban kétrétegű a cache tár, nézzük hát az elterjedt Intel Core 2 Duo-t példának:
Vannak háromszintű cache-tárral szerelt processzorok is. Az ügyes cache-tár szervezés és logika fontosabb és több teljesítményt hoz, mint a márketingnek jobban fekvő gigahertz hajhászás. Többek között ennek köszönhető, ha az ugyanannyi (vagy kevesebb!) gigahertzes proci mégis gyorsabb.
Alapvetően ezekkel érdemes webes területen foglalkozni: opcode-cache, http (böngésző) cache, lokális, többszintű és elosztott cache.
Egy webes alkalmazás általában szkriptekkel íródik. Futtatáskor (tehát pl. amikor lekérsz egy weboldalt) ezeket a szkripteket először le kell fordítani a gép nyelvére, az egyszerűség kedvéért nevezzük ezt most gépi kódnak (a valóságban ez bonyolultabb és sokszor szintén többszintű). A gép a gépi kódot "érti", azt tudja végrehajtani és az eredmény egy weblap, amit megkapsz.
Az opcode-cache ezt a folyamatot rövidíti le azzal, hogy a már egyszer elkészített gépi kódokat tárolja és nem kell minden egyes kéréskor újra meg újra előállítani azokat. Ezek a kódok úgyis csak akkor változnak, ha módosítják a szkripteket, azaz borzasztó ritkán.
Az opcode-cache telepítése minden szerverre ajánlott, mert nagyon kevés erőforrást foglal (RAM-ból se kell több néhány megabájtnál) és kb. kétszer gyorsabb lesz tőle minden, vagy ha megfordítjuk, a szerver kétszer több látogatóval fog megbírkózni.
PHP-nál ajánlom az APC-t vagy az XCache-t, mindkettő teljesen stabil free/open source megoldás, viszonylag egyszerűen telepíthető és egyben a lokális cache-re is megoldást ad.
Ha valamilyen adatra többször van szükséged a szkripted futása során, akkor azt általában eltárolod egy adattömbben, azaz a memóriában. Most lefektetünk egy viszonyítási alapot, legyen ennek a sebessége 1000. Ha végigfut a szkripted, akkor ez az adat elvész, egy újabb futásban esetleg ismét elő kell állítani.
Erre a problémára kínál megoldást a lokális cache, ami egy olyan RAM-ban (memóriában) tárolási megoldás, aminek a tartalma mindig elérhető, akármennyi példányban és akármikor fut a szkript. Gyakorlatilag egy közös memóriatár, viszont lassabb a sebessége, csak kb. 268.
Vedd észre, hogy a cache-ben nem csak "szimpla" adatok tárolása lehetséges, komplett weboldalakat is simán tolhatsz bele! Úgy érdemes "cache-elni", hogy egy-egy nagyobb blokkot, netán komplett oldalt tárolsz. Bonyolultabb rendszereknél egy oldal kiszolgálásához akár 5-8 cache kérés is tartozhat, de ez még normális és ami még fontosabb, skálázódik. Egy jó rendszer még így is a századára csökkenti a szerver(farm) terhelését, ugye nagyon nem mindegy?
Oké, a szerveren van lokális cache, de mi van, ha több szerverünk van, mert egy már nem bírná a terhelést? Erre való az elosztott cache, ami pont ugyanolyan, mint a lokális, de a tartalma elérhető az összes szerverről. Olyan, mint egy nagy "felhő", amibe fellövöd az adatot.
Az elosztott cache a legfontosabb fegyverünk az adatbázis-kezelő olvasási oldalának (SELECT) tehermentesítésében. Bár alig 10-20%-kal gyorsabb egy gyors MySQL adatbázis-kezelőnél, viszont sokkal egyszerűbb skálázni (azaz újabb és újabb elosztott cache szervereket indítani), mint MySQL replikációkkal bajlódni.
Ennek a sebessége mindössze 33, míg egy gyors MySQL lekérdezés általában 14-20, hogy legyen viszonyítási alap (query cache-t most hagyjuk, nagyobb rendszereknél nem pálya). Messze a leghíresebb, legtöbbet használt és legjobb elosztott cache a Memcached, ráadásul tök free.
Mivel látszik a fentieknél, hogy a mérettel és az elérhetőséggel fordítottan arányos a sebesség, ezért célszerű a többszintű cache-rendszer kialakítása. Magyarul írnod kell egy olyan cache osztályt, ami először a lokális, aztán pedig az elosztott cache-ből kérdez, illetve elvégzi a cache szintek frissítését.
Pölö ha valami nincs meg a lokálisban csak az elosztottban, akkor az elosztottból történő olvasás után egyből be kell tolni a lokálisba a zadatot, hogy a következő olvasáskor már onnan legyen találat. A jól kialakított cache rendszer borzasztóan lecsökkenti az adatbázisból történő olvasást, sokszor egyenesen nullára.
Úgy korrekt, ha megemlítem ezt is: a tárolni kívánt izét elmentjük egy fájlba és onnan olvasgatjuk be. A trükk az, hogy az operációs rendszerek csalnak, a gyakran használt fájlokat betöltik a memóriába, így ennek a megoldásnak a sebessége 74. Hátránya, hogy nem olyan egyszerű használni és gond a konkurens (közel egy időben történő) írás.
Kicsit mostohagyerek ügy, különösen a mai webkettes alkalmazások világában. Ugyanis alapértelmezettként érdemes kikapcsolni, azaz olyan fejléceket (header) küldünk ki a nagyvilágba, hogy a tartalmunk egyből elévül, még a böngésző "vissza" gombja esetén is újra kell kérni, majd cache-elünk mi a szerveren. Így egyszerűbb az élet, pláne a hibakeresés.
Látogatottabb oldalaknál, pl. egy címlapon azért érdemes pár másodpercre, netán (forradalmi gondolat!) fél percre is beállítani, meg lehet vele spórolni néhány százalék teljesítményt.
A többi (lokális, elosztott) cache-re is igaz, hogy akár néhány másodpercre is érdemes tárolgatni, tehát akkor is, ha tudjuk, hogy az adat 5 másodperc múlva elévül. Miért? Mert egy számítógép belső dolgai szerint ez már rettentő hosszúságú idő, ennyi alatt akár 500 oldalt is kiszolgálhat!
Felhő mondta nekem, hogy a Ustream főoldalát 3 másodpercig cache-elik és megéri. A Webcsatornánál egy video adatfolyamot 20 másodpercig cache-elünk. Ennek annyi a hátulütője, hogyha pont abban a néhány másodpercben történik valami, például leállítanak egy Ustream főoldalról linkelt adást, akkor a ráklikkelő látogató már csak a nagy semmit fogja látni. Ez egy kompromisszum, amit fel kell vállalni a teljesítmény miatt és úgy állítunk be, hogy a bekövetkezési esélye minimális legyen.
Ez az egyik oka annak is, hogyha mondjuk az Index címlapon kattintasz egy cikkre, néha a "nem találom", vagy csak egy szimpla fehér oldalra jutsz. A szerkesztők néha pont a te látogatásod ideje alatt változtatják meg a cikk linkjét, de ez a cache miatt még "nem szivárog fel".
Spoiler: én háromszintű cache osztályt írtam PHP-ban, majd írok róla bővebben és lehet, hogy ki is adom a forrást, mert tud egy-két különleges dolgot.
iMect means internet, media and other cool things. We're a small company located in Hungary. There is a big footer on every page where you can discover what we do and what happens with us.
Az iMect jelentése: internet, média és egyéb király dolgok. Egy kis magyar cég vagyunk. Minden oldalon van egy nagy lábléc, ahol felfedezheted, hogy mivel foglalkozunk.