Otázka :Co jsou špinavé stránky a jaký je jejich účel?
Kdykoli proces aplikace/databáze potřebuje přidat virtuální stránku do fyzické paměti, ale nezůstanou žádné volné fyzické stránky, OS musí vymazat zbývající staré stránky.
Nyní, pokud stará stránka nebyla vůbec napsána, pak tuto není třeba ukládat, lze ji jednoduše obnovit z datového souboru. Pokud však již byla stará stránka upravena, musí být někde uchována, aby aplikace/databáze mohla být později znovu použita – tomu se říká špinavá stránka.
OS ukládá takové špinavé stránky do odkládacích souborů (takže je lze odstranit z fyzické paměti, aby bylo možné uložit další „novou“ stránku do fyzické paměti) Pokud bude z mezipaměti stránek do oblasti špinavých stránek odstraněno velké množství dat – může to způsobit značné IO úzké místo, pokud je skutečné odkládací zařízení umístěno na místním disku ( sda ) a navíc způsobí další problémy, pokud místní disk používá i místní kořenový ( OS ) disk.
Mezipaměť stránek v Linuxu je pouze disková mezipaměť, která přináší OS další výkon, což pomáhá s intenzivním vysokým čtením/zápisem na soubory.
Jako „sub“ produkt mezipaměti stránky je špinavá stránka – což bylo vysvětleno ve výše uvedeném příkladu. Špinavé stránky lze také pozorovat, kdykoli bude aplikace zapisovat do souboru nebo vytvářet soubor – k prvnímu zápisu dojde v oblasti mezipaměti stránek – proto vytvoření souboru, jehož 10MB soubor může být opravdu rychlý:
# dd if=/dev/zero of=testfile.txt bs=1M count=100 10+0 records in 10+0 records out 10485760 bytes (100 MB) copied, 0,1121043 s, 866 MB/s
Je to proto, že tento soubor je vytvořen v oblasti paměti, nikoli na skutečném disku – doba odezvy je tedy opravdu rychlá. V operačním systému bude taková věc uvedena v /proc/meminfo a více v 'Dirty:
Před provedením výše uvedeného příkazu – poznamenejte si řádek /proc/meminfo a ‚Dirty‘:
# more /proc/meminfo | grep -i dirty Dirty: 96 kB
Po provedení příkazu:
# more /proc/meminfo | grep -i dirty Dirty: 102516 kB
OS nebo aplikace/databáze bude pravidelně inicializovat synchronizaci, která zapíše skutečný soubor testfile.txt na disk:
# more /proc/meminfo | grep -i dirty Dirty: 76 kB
Nyní například Oracle Database neumožňuje provádět takové zápisy do oblasti paměti, jako kdyby došlo k selhání OS nebo selhání SAN LUn – data budou kompromitována. To je důvod, proč Oracle Database vyžaduje, aby data byla „synchronizována“, a proto musí být všechny zápisy potvrzeny backendem, jako je disk/lun, než bude databáze generovat další požadavky na zápis.
Normálně databáze/aplikace periodicky zahazují mezipaměť, a proto se nečisté stránky zapisují na disk po malých kouscích. V některých případech může velikost špinavých stránek narůstat, protože aplikace/databáze možná správně nenakonfigurovaly mechanismus mezipaměti stránek.
Nečisté stránky tak mohou zapisovat do odkládacích souborů ( Swap area ), ale také do speciální oblasti na disku ( LUN/file-system ). Pokud například vytvoříme více než 100 MB odkládací soubor, který bude později znovu použit z odkládacího souboru, můžeme způsobit zbytečné IO problémy na odkládacím zařízení. Podnikové systémy ukládají odkládací soubory a odkládací oblast na OS pod SSD (Solid State Drive) nebo vyhrazenou LUN, takže výkon místního disku nebude ovlivněn (jak je normálně odkládací oblast vytvořena na místním disku)
V některých případech může aplikace/databáze mít interně problémy a nečisté stránky budou zapsány jako odkládací soubory, ale nebudou nikdy znovu použity, což způsobí nárůst odkládací oblasti a zbytečné IO na místním disku a povede k velkému využití swapu pod OS.
Chcete-li zjistit, v jaké fázi se OS pokusí uložit špinavé stránky zpět na diskovou vrstvu, podívejte se na oficiální dokumentaci jádra týkající se virtuální paměti zde a vyhledejte nastavení jako:
vm.dirty_background_ratio vm.dirty_ratio vm.swappiness
a
dirty_background_ratio dirty_ratio dirty_background_bytes dirty_expire_centisecs
Výše uvedená nastavení je třeba vyladit podle požadavků na databázi/aplikaci, protože OS pro ně nemá žádné „nejlepší postupy“ – jsou vyladěny podle zatížení/konfigurace DB/APP.
Kdykoli bude aplikace/databáze vyžadovat, aby byly stránky paměti volné ve fyzické paměti – OS má tendenci uchovávat vše v mezipaměti stránek – OS proto bude muset některé stránky znovu alokovat a označit je jako nečisté. Tento proces funguje dobře, pokud je konec aplikace/databáze správně vyladěn a škálován – jinak to způsobí skutečně agresivní swappiness – protože OS bude muset zapsat všechny špinavé stránky zpět na odkládací disk – to lze ovládat pomocí nastavení vm.swappiness.
Pokud bude aplikace/databáze provádět souhlasné swapování, může to způsobit vážné IO zápisy na odkládací zařízení a vést k vážnému zablokování systému – vždy se ujistěte, že aplikace/databáze jsou správně nakonfigurovány z hlediska správy paměti.
Jak bylo vysvětleno, ne všechny stránky budou označeny jako špinavé – většinou nepoužité stránky budou spíše vyřazeny než označeny jako špinavé (vše závisí na tom, zda stránky, které již jsou přiděleny, byly změněny nebo ne)
Pro ověření, které PID používají swap area – lze použít níže uvedený příkaz:
for file in /proc/*/status do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file done | sort -k 2 -n -r
Uvolnění „spotřebovaného“ odkládacího prostoru je opravdu omezené, normálně, pokud PID skončí správně nebo se jednoduše vypne, swapovací prostor bude znovu nárokován, ale zabití PID nebo pokud skončí abnormálně jako segfault může stále zanechat odkládací prostor spotřebovaný. Další možností je restart, protože provádění příkazů swapoff a swapon může způsobit vážné problémy nebo dokonce vést k panice systému.