Disassembler

Artificial intelligence is no match for natural stupidity.
20srpna2012

Vyprázdnění Linuxové kernel cache


Linuxové jádro má memory management implementován docela slušně a tak si může dovolit využívat „nevyužitou“ RAM jako mezipaměť pro urychlení různých I/O operací s tím, že když bude paměť potřebovat nějaký jiný proces, je kernel téměř okamžitě schopen data uložit na persistentní úložiště a požadavku procesu vyhovět. Někdy se ovšem může stát, že tahle cache nabobtná do olbřímích rozměrů a kernel usoudí, že je moc sexy na to, přidělovat paměť nějakým podřadným procesům.

Hra na schovávanou


Empty kernel cache? What do you mean?
Empty kernel cache? What do you mean?

Výše uvedené odmítnutí přidělení paměti by si kernel sice dovolovat neměl, ale občas je v mezipaměti bordelu tolik, že jej kernel nestihne dostatečně rychle zapsat na disk a netrpělivý proces si řekne, že se na nějaké čekání může vykašlat, což se stávalo třeba u OpenSuse 11 a Mandrivy 2010. Ale i u ostatních poslušných dister se může vysypání cache hodit, třeba když si chcete vyrobit konzistentní prostředí pro benchmarky.

Co si ale vlastně kernel schovává?

  1. Page cache - stránková cache. Někdy též ne úplně správně označovaná jako disková cache. V té si kernel ukládá bloky virtuální paměti, náležící k procesům a souborům, se kterými se zrovna pracuje, aby kvůli každé blbině nemusel lézt do fyzického umístění a šoupat s otřesně pomalým diskem.
  2. Dentry cache - schovka pro directory enties, tedy adresářovou strukturu. Kernel vnitřně pracuje s virtuálním souborovým systémem (VFS), který je nezávislý na souborovém systému použitém na fyzickém úložišti a touhle mezipamětí si vypomáhá při práci s adresáři, aby nemusel jak trubka pořád honit požadavky tam a zpátky mezi fyzickým umístěním a logickým vyjádřením.
  3. Inode cache - indexové uzly, tedy ukazatele na soubory, adresáře, symlinky a podobné filesystémové zhůvěřilosti. Mimo jiné i zařízení v /dev, které by nebylo úplně dobré za běhu zapomenout. Práce s nimi opět probíhá na úrovni VFS a poskytují jednoduchý přístup k r/w operacím.

Úklid


Vyčištění cache spočívá v předání patřičného příkazu manažeru virtuální paměti, což v praxi znamená zásah do /proc/sys/vm a je proveditelné na kernelech 2.6.29 a vyšších. Pro uvolnění co největšího množství paměti je třeba nejprve dirty pages vysypat na disk, aby nebylo potřeba je nadále cachovat. To se provede pomocí starého známého sync. Pak už jen stačí do /proc/sys/vm/drop_caches zapsat patřičnou hodnotu. Jedničku pro vysypání page cache, dvojku pro page cache a dentry cache a trojku pro page, dentry i inode cache. Oneliner pro vysypání kernel cache a uvolnění maxima paměti bude tedy vypadat takto

sync && echo 3 > /proc/sys/vm/drop_caches

Operace není nijak destruktivní, protože veškerá rozdělaná práce se uloží a mezipaměť je „mezi“ právě proto, že pouze bufferuje to, co fyzicky existuje někde jinde a to tam samozřejmě bude existovat i nadále.