Memcached: zrychlete svůj web pomocí cache

Adam Štrauch 7. 12. 2012

Jednou z možností, jak zvednout výkon aplikace, je použití cache. Tu je možné spravovat mnoha způsoby a jedním z nich je nasazení daemona memcached. Jeho podporu dnes obsahuje většina jazyků, webových serverů i různých frameworků. Navíc je nasazení velice snadné a požadovaný výsledek je jednoduše dosažitelný.

Někdy jsou vývojáři nebo správci serverů postaveni před problém, kdy k jejich aplikaci začne přistupovat najednou třeba 1000× více uživatelů. Požadavky na výkon najednou vyskočí o stovky procent a doposud používaná implementace je najednou nedostatečná.

Tato situace se dá řešit mnoha způsoby. Někdy stačí jen pár úprav kódu aplikace, jindy pomůže navýšení počtu serverů, případně vyladění databázového serveru, ale pomoci může také cache, tedy využití nějakého místa, kam si aplikace odloží výsledek dlouhých výpočtů a ten pak nějaký čas používá. Cache není nic jiného než paměť, ze které se dá rychle něco získat nebo tam naopak uložit.

Efektivita cache závisí na mnoha faktorech a nejlépe se dosahuje na úrovni aplikace. Ta totiž ví, jaká data mohou v cachi být a jaká ne. U jednoho webu může být z cache pouze polovina stránky, zatímco u druhého to může být stránka celá. Pak už záleží na konkrétní situaci, abychom se rozhodli, jak cache implementovat, aby přinesla vytoužené ovoce. To se povede pouze tehdy, podaří-li se cachí eliminovat množství těch nejnáročnějších dotazů.

Zkrátka cachí se snažíme minimalizovat místa v naší aplikaci, která jsou úzkým hrdlem při zvýšené zátěži. Může to být pomalý SQL dotaz, komplikovaný výpočet, parsování dat a mnoho jiných věcí. Nemusíme do cache cpát nutně vše, ale postačí opatrně vybrat ty výpočty, jejichž získání stojí nejvíce času.

Memcached

Memcached není nic nového, ani komplikovaného, ale když ho správně použijete, můžete zatížení vašeho serveru snížit o desítky procent. Je to jednoduchý daemon, který má alokované nastavené množství paměti, do které mohou aplikace ukládat libovolná data. Ty pak jsou k dispozici velmi rychle a navíc mohou být být sdílena například mezi mnoha procesy jedné aplikace. když paměť dojde, začnou se odmazávat staré záznamy. Kromě toho lze záznamu nastavit čas expirace, po kterém již není platný.

Využití memcached je limitováno pouze velikostí paměti a jeho základními vlastnostmi:

  • Jednoduchá databáze
  • Data jsou pouze v paměti (při ztrátě napájení dojde ke ztrátě dat)
  • Všechny operace mají složitost O(1)
  • Expiraci dat obstarává server

Instalace a konfigurace

Memcached není vybíravý na instalační nebo konfigurační proces. Po instalaci stejnojmenného balíčku třeba v Debianu, je do systému přidán konfigurační soubor /etc/memcached.conf, ve kterém jsou k nalezení parametry popsané v nápovědě nebo manuálové stránce. Ty jsou totiž init skriptem přidány za spouštěný binární soubor.

Někdy se může hodit mít na serveru spuštěných memcached daemonů víc, například v případě sdíleného hostingu. V takovém případě je nutné se postarat o správu každého z nich třeba pomocí supervisordu. Základní memcached se spouští takto:

/usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 

V příkladu si daemon naalokuje 64 MB RAM, poběží pod uživatelem memcache a bude naslouchat na localhostu na portu 11211, což je výchozí port. Nicméně ne vždy se hodí naslouchání na portu, který mohou použít všechny aplikace. U hostingového serveru je vhodné, aby o sobě aplikace vůbec nevěděly, a v takovém případě poslouží sockety:

/usr/bin/memcached -s /home/user/memcached.sock -a 600 -m 64 

Supervisord pak pomůže se správou i několika desítek memcached daemonů pro různé uživatele.

Komunikace

Výměna dat mezi aplikací a memcached probíhá pomocí jednoduchého protokolu, který si můžete vyzkoušet i přes telnet.

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set klic 1 60 4
test
STORED
get klic
VALUE klic 1 4
test
END 

Pro práci s daty používá memcached celkem dvanáct příkazů, jejichž dokumentaci najdete na jeho stránce na Google Code. Další 4 příkazy se používají pro získání statistik.

$ echo -e "stats" | nc localhost 11211
STAT pid 25496
STAT uptime 1545
STAT time 1354825196
STAT version 1.4.14
[...] 

Použití ve webovém serveru Nginx

Memcached je univerzální nástroj, jenž umí ukládat nejrůznější data, ale velmi často se používá hlavně v kombinaci s webovými aplikacemi. Jeho podporu najdeme ve všech populárních webových frameworcích nebo web serverech. Nejsme proto omezeni způsobem, jakým se rozhodneme komunikaci zrychlit.

V rámci tohoto článku jsem se rozhodl jako příklad použít cachování webového serveru Nginx. Ten se často používá jako proxy k jiným serverům. Memcached ale podporuje i webový server Apache, Lighttpd či další.

server {
  location / {
    set $memcached_key "$uri?$args";
    memcached_pass     localhost:11211;
    default_type       text/html;
    error_page         404 @fallback;
  }

  location @fallback {
    proxy_pass http://www.root.cz;
  }
} 

Když přijde na Nginx požadavek na nějakou stránku, Nginx nejdříve na základě $memcached_key zjistí, zda už stránka není v memcached, a pokud ji najde, vrátí tu. Pokud ne, přejde do @fallback sekce a získá ji v tomto případě z http://www.root.cz. Výsledek uloží do memcached a vrátí ho uživateli.

Shrnutí

Memcached je univerzální cachovací nástroj s jednoduchým protokolem a podporou tam, kde to má alespoň trochu smysl. Když se použije rozumně, dokáže výrazně urychlit aplikaci a snížit její nároky na výpočetní výkon. Výsledek ale závisí na povaze aplikace a také vaší šikovnosti.

Ohodnoťte jako ve škole:

Průměrná známka 2,67

Našli jste v článku chybu?
Zasílat nově přidané názory e-mailem
Vitalia.cz: Martin Kasa o byznysu s léky

Martin Kasa o byznysu s léky

Vitalia.cz: Falšované masné výrobky byly v Tescu i Lidlu

Falšované masné výrobky byly v Tescu i Lidlu

Lupa.cz: Jak EET vidí ajťák aneb Drahá vražda UX

Jak EET vidí ajťák aneb Drahá vražda UX

120na80.cz: Tady se vaří padělané léky

Tady se vaří padělané léky

Podnikatel.cz: Myšlenky Henryho Forda. Berte je za své

Myšlenky Henryho Forda. Berte je za své

Lupa.cz: Válka e-shopů. Alza končí s Heurekou

Válka e-shopů. Alza končí s Heurekou

DigiZone.cz: V RS7 ukončila vysílání Retro Music Television

V RS7 ukončila vysílání Retro Music Television

Podnikatel.cz: Internet věcí ušetří v podnikání peníze

Internet věcí ušetří v podnikání peníze

Vitalia.cz: Grilujte v parku i na loďce

Grilujte v parku i na loďce

Vitalia.cz: Tetanus v USA – i po odřeninách

Tetanus v USA – i po odřeninách

Podnikatel.cz: Šizený guláš na pultě. Jako Lidl to nedělejte

Šizený guláš na pultě. Jako Lidl to nedělejte

Vitalia.cz: Vydával se za český, prozradila ho DNA

Vydával se za český, prozradila ho DNA

Podnikatel.cz: Využijte v byznysu nulové tarify

Využijte v byznysu nulové tarify

Vitalia.cz: Taky ji kupujete? Je šizená

Taky ji kupujete? Je šizená

120na80.cz: Poznáte, který z léků je pravý?

Poznáte, který z léků je pravý?

120na80.cz: Jak si udržet zdravou vaginu

Jak si udržet zdravou vaginu

120na80.cz: 10 dezinfekcí: Vede „starý dobrý“ peroxid

10 dezinfekcí: Vede „starý dobrý“ peroxid

DigiZone.cz: Šlágr TV dostala pokutu 100 000 Kč

Šlágr TV dostala pokutu 100 000 Kč

Podnikatel.cz: Různé podoby lahve Coca–Coly. Úchvatné

Různé podoby lahve Coca–Coly. Úchvatné

DigiZone.cz: Konec geoblokace? Ani náhodou…

Konec geoblokace? Ani náhodou…