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?
Lupa.cz: Kolik platí stát za nájmy? Úřad otevřel data

Kolik platí stát za nájmy? Úřad otevřel data

120na80.cz: Jak se zbavit nadměrného pocení?

Jak se zbavit nadměrného pocení?

Měšec.cz: Udali ho na nelegální software a přišla Policie

Udali ho na nelegální software a přišla Policie

120na80.cz: SOS aneb spálená pokožka

SOS aneb spálená pokožka

DigiZone.cz: DAB už i z Košic. A překvapivě!

DAB už i z Košic. A překvapivě!

DigiZone.cz: Ve Varech představeni i noví "Četníci"

Ve Varech představeni i noví "Četníci"

DigiZone.cz: Android TV: s jakým pracuje rozlišením?

Android TV: s jakým pracuje rozlišením?

Vitalia.cz: Bio vejce nepoznají ani veterináři

Bio vejce nepoznají ani veterináři

Měšec.cz: Kurzy platebních karet: vyplatí se platit? (TEST)

Kurzy platebních karet: vyplatí se platit? (TEST)

Podnikatel.cz: Profese budoucnosti? Úředník nepřežije

Profese budoucnosti? Úředník nepřežije

Podnikatel.cz: Tahle praktika stála šmejdy přes milion

Tahle praktika stála šmejdy přes milion

Podnikatel.cz: Prodej na Alibabě? Malí hráči utřou nos

Prodej na Alibabě? Malí hráči utřou nos

Vitalia.cz: Paní výčepní: Holka, co mluví chlapům do piva

Paní výčepní: Holka, co mluví chlapům do piva

Vitalia.cz: Pepsi Cola mění sirup za cukr

Pepsi Cola mění sirup za cukr

DigiZone.cz: Sat novinky: Skylink skončil s kanály ČT

Sat novinky: Skylink skončil s kanály ČT

Vitalia.cz: Největší chyby při podávání vína?

Největší chyby při podávání vína?

Měšec.cz: Banky umí platby na kartu, jen to neříkají

Banky umí platby na kartu, jen to neříkají

DigiZone.cz: Jsou obchody připraveny na DVB-T2/HEVC?

Jsou obchody připraveny na DVB-T2/HEVC?

Lupa.cz: eIDAS: Nepřehnali jsme to s výjimkami?

eIDAS: Nepřehnali jsme to s výjimkami?

Měšec.cz: Investice do drahých kovů - znáte základní chyby?

Investice do drahých kovů - znáte základní chyby?