Hlavní navigace

Swapování do RAM s zcache

12. 6. 2011 20:06 (aktualizováno) Tomas Matějíček

Moje praktické zkušenosti s klasickým diskovým swapem na serverech jsou veskrze negativní. Pokud serveru dojde paměť RAM a začne swapovat na disk, všechno se natolik zpomalí, že server přestane stíhat vyřizovat další požadavky, zahltí se, a je s ním konec úplně. Proto na žádném svém serveru nemám aktivní swapovací diskový oddíl, a má-li dojít RAM, tak ať raději oom-killer zabije nějaké procesy, než aby se zhroutil celý systém.

Swapování do RAM … novinka v kernelu 2.6.39

Nedávno vydané Linuxové jádro 2.6.39 přináší novou featuru, takzvanou Transcendentní paměť, a na ní postavený mechanizmus vyrovnávací paměti zcache, která spojuje výhody swapu s rychlostí paměti RAM.

Trancendentní paměť (nedokážu název lépe přeložit) je speciální typ paměti s následující charakteristikou:
- nikdo nezkouká jak je veliká
- zápis do ní nemusí vůbec proběhnout
- zapsaná data můžou zmizet dřív, než budou kdy zase čtena

Na první pohled se může takový typ paměti jevit nepoužitelným, ale v reálné implementaci, kdy je jako transcendentní paměť namapováno kus RAM, jde o velmi důmyslnou pomůcku, jak implementovat zcache a zmírnit množství vstupně výstupních operací s úložnými zařízeními. (Poznámka: Trancendentní paměť nemusí být nutně vždy jen v RAM)

Co je to zcache

Laicky řečeno je zcache komprimovaný swap v RAMce. Do tohoto prostoru se mohou ukládat jak delší dobu nepoužívané bloky page cache (ty mohou kdykoli svévolně zmizet), tak i bloky RAM určené k odswapování (ty se samozřejmě ztratit nesmějí). Samotný přesun z RAM do RAM by moc smysl nedával, ale zcache je plně komprimovaná (používá rychlou kompresi lzo1×), data jsou před přesunem tedy zmenšena a po přesunu je k dispozici více RAM paměti, než bylo před ním.

Příklad jak to celé funguje:

Pracuje-li naše aplikace s diskem, volá systémové funkce read() a write(). Systém daná data z disku přečte a uloží do paměti RAM do takzvané page cache. Přistupuje-li pak naše nebo i cizí aplikace ke stejným datům na disku, systém už nic ze zařízení nečte, a rovnou vrací data z page cache. Protože je ale RAM malá a celý disk se nacachovat nedá, je nutné čas od času některou cache zahodit, a uložit si místo ní nově načtená data z jiného místa na disku, se kterými se pracuje právě teď. Budou-li právě zahozená data některou aplikací opět požadována, musí se znovu načíst z disku (a to stojí čas).

Díky zcache však nejdojde k okamžítému zahození dat z paměti, ale k jejich kompresi a přesunu. Tím se uvolní místo pro data nová, a při případném požadavku na data předchozí není nutné je číst z disku, ale jednoduše se přečtou (dekomprimují) ze zcache. A právě tím se ušetří I/O (vždy pomalé vstupně výstupní operace s diskem, které jsou mnohem větší brzda než ta trocha procesorového výkonu, která se použije pro kompresi či dekompresi dat u zcache).

Obdobně zcache slouží jako mezistupeň pro paměť, kterou je nutné swapnout na disk, tj nejprve se systém pokusí uložit komprimovaný blok do zcache a tím uvolnit paměť, a teprve když to neprojde tak se zapisuje do swap oddílu na disku.

Konfigurace:

Zcache je ve vanila Kernelu od 2.6.39, ale reálně zapnout se dá až od verze 3.0 (kvůli čemusi, na čemž závisí). V make menuconfig se konfiguruje volbou:
Device drivers → Staging drivers → [Y] Dynamic compression of swap pages and clean pagecache pages