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