Re: podivné problémy s alokací paměti / CentOS 6.2 na VPS
Pavel Kankovsky
peak na argo.troja.mff.cuni.cz
Úterý Únor 28 23:56:26 CET 2012
On Tue, 28 Feb 2012, Tomas Vondra wrote:
> Chtěl bych vám poděkovat za navedení na správnou stopu - ukázalo se že
> jsem dosud žil v bludu ohledně fungování parametrů vm.overcommit_*
Moc neděkujte, protože jsem se Vás nejdřív pokoušel z té správné stopy
svést na scestí, když jsem v nějakém pominutí smyslů jako naprostý pitomec
sám sobě vsugeroval, že nejpřísnější nastavení je 0 a ne 2.
Jsem blbec. Jsem blbec. Jsem blbec. (Ale risknu to a připojím ještě další
komentář, třeba se mi podaří se projevit jako ještě větší trubka.)
> Totiž pokud se nastaví "vm.overcommit_memory = 2" tak se maximum
> použitelné paměti nastaví na
> swap + (RAM * vm.overcommit_ratio / 100)
> přičemž výchozí hodnota overcommit_ratio je 50. Tj. bez swapu se to
> omezí na 50% RAM (což je cca ta hranice kde to začalo dělat paseku).
Přesně tak.
> Aktuálně jsem tam nastavil
> vm.overcommit_memory = 2
> vm.overcommit_ratio = 100
> vm.swappiness = 0
>
> od čehož si slibuji že bude povoleno alokovat paměť odpovídající 100%
> fyzické RAM. Swap tam není, takže swappiness je tam spíš pro okrasu.
Nejsem si úplně jistý, zda je to rozumné nastavení.
vm.overcommit_memory má smysl nastavit na dvojku, pokud chcete
minimalizovat riziko, že paměť dojde neočekávaně v situaci, kdy to nelze
ošetřit jinak než vypuštěním OOM killera. Jádro se tedy snaží hned při
alokaci paměti (mmap(), brk()...) rezervovat potřebný prostor tak, aby při
výpadku stránky byl vždy k dispozici (to pochříchu nefunguje moc dobře
pro zásobník, který se může automaticky zvětšovat).
Ovšem jádro samo také potřebuje nějaký životní prostor pro své datové
struktury. Pokud nastavíte vm.overcommit_ratio na 100, tak už nenecháte
v RAM žádný prostor vyhrazený pro jádro a pravděpodobně vytváříte opět
podmínky pro vznik situace, které se mělo nastavením vm.overcommit_memory
předejít, protože -- jestli to dobře chápu -- alokace paměti prováděné
jádrem se tím, jaký prostor je rezervován pro userland, nenechávají moc
omezovat.
Imho je v případě vm.overcommit_memory=2 nejlepší mít přiměřeně velký swap
(byť by se skoro vůbec nepoužíval) a vm.overcommit_ratio nastavit na co
nejmenší hodnotu postačující k bootu a shutdownu. Pokud z nějakého důvodu
nechce mít ani kilobajt swapu, pak by bylo vhodné aspoň udělat nějaký
odhad toho, kolik zabírá jádro (afaik Slab + PageTables v /proc/meminfo),
a vm.overcommit_ratio nastavit tak, aby se součet držel s rozumnou
rezervou pod 100 % RAM.
--
Pavel Kankovsky aka Peak / Jeremiah 9:21 \
"For death is come up into our MS Windows(tm)..." \ 21st century edition /
Další informace o konferenci Linux