Hlavní navigace

Memcached: zrychlete svůj web pomocí cache

7. 12. 2012
Doba čtení: 4 minuty

Sdílet

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ší.

CS24_early

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.

Byl pro vás článek přínosný?

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.