podivné problémy s alokací paměti / CentOS 6.2 na VPS

Tomas Vondra tv na fuzzy.cz
Středa Únor 29 02:14:53 CET 2012


On 28.2.2012 23:56, Pavel Kankovsky wrote:
> On Tue, 28 Feb 2012, Tomas Vondra wrote:
>
>> 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.

Ano, to zní rozumně. Neuvědomil jsem si že vm.overcommit_memory se týká
jenom userspace procesů a nikoliv samotného jádra.

> 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.

Hmmm, podle meminfo zabírají Slab a PageTables 54444 kB. Podle free je v
systému k dispozici 502728 kB, takže jádro potřebuje ~ 11%. Nastavil jsem

   vm.overcommit_ratio = 87

což dává ~ 2% (10MB) rezervu pro jádro což je myslím tak akorát.

S tím swapem nevím - já ho tam pokud možno nechci, pokud to nebude
nutné. Uvažuji ho tam sice udělat ale jenom 64MB a nastavit
overcommit_ratio=76, což odpovídá 382MB (resp. 446MB při započtení
toho swapu). Takže pro jádro zůstává ~50MB fyzické RAM a ještě 64MB
na swapu pro případ nouze. To je možná výhoda oproti tomu řešení bez
swapu, ta větší rezerva ...

T.


Další informace o konferenci Linux