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.

Našli jste v článku chybu?
Vitalia.cz: Skutečně zdravá škola je ve 160 školách zdarma

Skutečně zdravá škola je ve 160 školách zdarma

DigiZone.cz: Jetelín končí. Prima ho vyřadila

Jetelín končí. Prima ho vyřadila

Lupa.cz: Elektronika tajemství zbavená. Jak s ní začít?

Elektronika tajemství zbavená. Jak s ní začít?

Vitalia.cz: Galerie: Strouhanka ze starých rohlíků? Kdepak

Galerie: Strouhanka ze starých rohlíků? Kdepak

Měšec.cz: Se stavebkem k soudu už (většinou) nemusíte

Se stavebkem k soudu už (většinou) nemusíte

Podnikatel.cz: Pozor na vykuky, imitují služby České pošty

Pozor na vykuky, imitují služby České pošty

DigiZone.cz: ČTÚ červenec: rušení trochu vzrostlo

ČTÚ červenec: rušení trochu vzrostlo

Podnikatel.cz: Youtuber? Za 15 tisíc dělat nebude

Youtuber? Za 15 tisíc dělat nebude

DigiZone.cz: ČTÚ zveřejnil aktualizovaný D-Book

ČTÚ zveřejnil aktualizovaný D-Book

Vitalia.cz: dTest vybral nejlepší pomerančový džus

dTest vybral nejlepší pomerančový džus

Měšec.cz: Do ostravské MHD bez jízdenky. Stačí karta

Do ostravské MHD bez jízdenky. Stačí karta

Lupa.cz: Co najdete uvnitř kosmické sondy?

Co najdete uvnitř kosmické sondy?

DigiZone.cz: Hodlá Markíza skončit v DVB-T?

Hodlá Markíza skončit v DVB-T?

Lupa.cz: Sdílíte veřejně běhání a jízdu na kole?

Sdílíte veřejně běhání a jízdu na kole?

Měšec.cz: Platíme NFC mobilem. Konečně to funguje!

Platíme NFC mobilem. Konečně to funguje!

Vitalia.cz: Ženy, které milují příliš, jsou neštěstí

Ženy, které milují příliš, jsou neštěstí

Měšec.cz: Ceny PHM v Evropě. Finty na úspory

Ceny PHM v Evropě. Finty na úspory

Vitalia.cz: Za její cukrovkou stojí rodiče

Za její cukrovkou stojí rodiče

120na80.cz: Kam umístit silikony?

Kam umístit silikony?

Podnikatel.cz: Novela zákoníku práce. Řeší homeworking

Novela zákoníku práce. Řeší homeworking