[Mono-dev] Size of thread in Mono (65MB per thread?)

james james at mansionfamily.plus.com
Sat Dec 21 14:38:30 UTC 2013

On 20/12/2013 09:27, Marek Habersack wrote:
> Unix systems work based on a bit different principle than the Windows 
> ones. Namely, as Nikita mentions in his other mail, the virtual memory 
> is nearly free of any limits - your process reserves the right to use 
> that much memory, but it doesn't actually use ("commit") it 
> physically. The virtual memory reservation is merely a hint of what 
> can be consumed by the program, should it need it.

I really think this ought to be challenged.  No least because I recently 
ran into an issue on some production RedHat servers which had 
memory_overcommit set to '2'.

Historically, UNIX systems DID behave like Windows.  And some of them 
still do.  They require that a request for VM can be satisfied from the 
free physical+virtual memory.

The default is now to allow lazy programming that treats virtual address 
space as free, as you note - but the flip side is that programs can ask 
the OS for memory, be given it without error, and then find that they 
are summarily terminated if they try to use it. Or that some other 
process is summarily terminated.

This mechanism came about in AIX first I believe, an Linux copied it.  
Solaris held out for a long time with 'proper' behaviour, I don't know 
whether it allows overcommit now.

Whether or not you think allowing overcommit is a good idea is very much 
dependent on whether you think a good return from malloc should allow 
you to use the memory you just asked for.

In fairness, the problem is typically worst in multi-threaded programs 
that can't handle segmented thread stacks - they have to reserve enough 
space for reasonable levels of stack depth and stack-local data so they 
have to reserve VM space to ensure that malloc doesn't place another 
block after the heap that's actually in use.  Laziness is actually 
allocating the space and relying on the OS to allow overcommit and not 
actually back such memory until needed, rather than just reserving a VM 
range and allocating on fault.

The prod servers I had showed no use of swap, about 6gig out of 32 
physical in use (with the rest as buffers) - and thread starts and 
allocs were failing.  Needless to say all the machines we'd used for 
dev, qa, and load testing had overcommit 0 and we got mugged as a result.

More information about the Mono-devel-list mailing list