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
A este davno predtym sa to volalo compcache a je aj v jadre co ma Ubuntu 9.04. Tam som to zapina takto:
v /etc/initramfs-tools/initramfs.conf u polozky COMPCACHE_SIZE="25%"
To znamená 25% z RAM.
A potom este prikaz sudo update-initramfs -u
Pri novších jadrach sa da pouziť na čokolvek, nie len na swap a vola sa zram. Ale vidim, ze tu nieke ziadny navod ako to spojazdnit, tak tu je navod moj:
#Nahrat
modprobe zram #Poprípade zram num_devices=2 ak chceme mat dva akoze disky
#toto vytvorí zariadenie /dev/zram0 #Poprípade aj zram1
#Nastaviť velkost disku napr na 250MB
echo $((250*1024*1024)) > /sys/block/zram0/disksize
#Ak uz su tam nejake udaje, nedaju sa potom prepisat, treba pouzit "reset"
#Default velkosť je 25% RAM
#Tvorba swap
mkswap /dev/zram0
swapon /dev/zram0 -p100 #Vyssia priorita
#Tvorba tmp, ale neodporucam. Tmpfs niekedy treba fakt velky, napriklad pri rozbalovan iso a pod..
mkfs.ext4 /dev/zram1
mount /dev/zram1 /tmp
Statistika sa nachádza v /sys/block/zram
Reset: echo 1 > /sys/block/zram0/reset
No a to hlavne, aby sa to nastartovalo pri kazdom spusteni, tak tento script zapisať do /etc/rc.local
Tot vsjo. Som s tymto laborovaním stravil asi 2dni, tak mam uz ako tak skusenosti a spravil som si nastastie aj poznamky a teraz vam ich sem predavam.
Ja osobne to len ODPORUCAM!!! Je to fajn vec!! Mam to na dvoch pc s 512MB RAM (compcache) a na 2GB RAM (zram)
Řekl bych že v oficiálním jádře ramzswap nebylo, viz první odstavec zde:
http://lwn.net/Articles/397574/
Last year, Nitin Gupta was pushing the compcache patch, which implemented a sort of swap device which stored pages in main memory, compressing them on the way. Over time, compcache became "ramzswap" and found its way into the staging tree. It's not clear that ramzswap can ever graduate to the mainline kernel, so Nitin is trying again with a development called zcache. But zcache, too, currently lacks a clear path into the mainline.
Takže pokud to někdo měl dřív, tak podle mě z externích patchů, což je u komerčních distribucí celkem běžné, u mnou oblíbeného Slackware ofšem nikoliv.
[01:16:54] 1 ;( harvie@insomnia bin.git $ modprobe -l | grep zram
kernel/drivers/staging/zram/zram.ko.gz
[01:17:20] 0 ;) harvie@insomnia bin.git $ modprobe -l | grep cache
kernel/lib/lru_cache.ko.gz
kernel/fs/cachefiles/cachefiles.ko.gz
kernel/fs/mbcache.ko.gz
kernel/fs/fscache/fscache.ko.gz
hmm asi pudu este omrknout co delaj tyhle 4 dalsi moduly s "cache" v nazvu...
V 2.6.38 bol v jadre iba zram, ktory vedel komprimovat iba swap (diskovu cache nie).
"Takže při sekvenčním čtení velkého souboru (řádově většího, než RAM) to bude dělat co? Zbytečně vytěžovat procesor kompresí něčeho, co se pak hned stejně zahodí?"
To iste to robilo aj doteraz (pokial bola volna pamat), akurat bez komprimacie...
Tohle bylo kdysi implementávo na Windows 98 od firmy Quadreck. Nakonec se to neujalo. Linuxovýmu swapu chybí spekulativní swapování ... tedy spekulativně odkládat dirty bloky do swapu, kdyby je bylo třeba rychle uvolnit ... a s tím změna představy paměti jako storage. Paměť RAM by měla být považována za diskovou cache bez ohledu na to, jestli se tam cachují soubory, nebo swapfile.
[6] Zahazování nejdéle nepoužitého bloku v cache by bylo poměrně nevýhodnou strategií, proto se nepoužívá. Sekvenční čtení souboru systém cache nenaruší, protože tyto bloky se zahazují bez komprese hned při výpadku.
Zjednodušeně: Pokud se cache rozhoduje, který blok má vyhodit, prvně se rozhoduje mezi těmi, které byly použity pouze jednou.
http://www.root.cz/clanky/architektury-vyrovnavacich-pameti/#k07
Tak jsem si prošel zdrojáky a zjistil následující:
zcache závisí na CONFIG_CLEANCACHE nebo CONFIG_FRONTSWAP (alespoň jedno musí být zapnuto), nicméně ani jedno není v jádru 2.6.39. Ty jsou až v následující verzi kernelu.
Zcache bylo tedy do jádra přidáno v 2.6.39, ale dá se zapnout až teprve v jádru 3.0.
Opravil jsem to v blog postu.
Tomáš je autorem několika více či méně známých projektů jak z oblasti operačních systémů, tak internetu. V současnosti samozvaný expert na Linux, Bash, PHP a MySQL.
Přečteno 25 543×
Přečteno 23 848×
Přečteno 19 406×
Přečteno 18 170×
Přečteno 12 805×