problem allocating large amount of memory

Lombard, David N david.n.lombard at intel.com
Thu Dec 4 10:39:24 EST 2003


From: Mark Hahn; Sent: Wednesday, December 03, 2003 9:50 PM
> 
> From: Roland Krause; Sent: Wednesday, December 03, 2003 6:25 PM
> > Here is what I _am_ able to do. Using a little test program that I
have
> > written I can pretty much get 3 GB of memory allocated in chunks.
The
> > largest chunk is 2,143 GBytes, then one of 0.939 GBytes size and
> > finally some smaller chunks of 10MBytes. So the total amount of
memory

The 2.143 GB chunk is above TASK_UNMAPPED_BASE and the 0.939 chunk is
below TASK_UNMAPPED_BASE.

> yes.  unless you are quite careful, your address space looks like
this:
> 
> 0-128M		zero page
> 128M + small	program text
> 		sbrk heap (grows up)
> 1GB		mmap arena (grows up)
> 3GB - small	stack base (grows down)
> 3GB-4GB		kernel direct-mapped area
> 
> your ~1GB is allocated in the sbrk heap (above text, below 1GB).
> the ~2GB is allocated in the mmap arena (glibc puts large allocations
> there, if possible, since you can munmap arbitrary pages, but heaps
can
> only rarely shrink).

Right.

> interestingly, you can avoid the mmap arena entirely if you try
(static
> linking,
> avoid even static stdio).  that leaves nearly 3 GB available for the
heap
> or stack.

Interesting, never tried static linking.  While I worked with an app
that needed dynamic linking, this is an experiment I will certainly try.

> also interesting is that you can use mmap with MAP_FIXED to avoid the
> default
> mmap-arena at 1GB.  the following code demonstrates all of these.  the
> last time
> I tried, you could also move around the default mmap base
> (TASK_UNMAPPED_BASE,
> and could squeeze the 3G barier, too (TASK_SIZE).  I've seen patches
to
> make
> TASK_UNMAPPED_BASE a /proc setting, and to make the mmap arena grow
down
> (which lets you start it at a little under 3G, leaving a few hundred
MB
> for stack).

Prior to RH 7.3, you could use one of the extant TASK_UNMAPPED_BASE
patches to address this problem.  I always used the patch to move
TASK_UNMAPPED_BASE UP, so that the brk() area (the 0.939 chunk above)
could get larger.  I could reliably get this up to about 2.2 GB or so
(on a per-process basis). The original requestor would want to move
TASK_UNMAPPED_BASE DOWN, so that the first big malloc() could be larger.


Starting at RH Linux 7.3, Red Hat prelinked glibc to the fixed value of
TASK_UNMAPPED_BASE so that moving TASK_UNMAPPED_BASE around only caused
heartache and despair, a.k.a., you app crashed and burned as you
trampled over glibc.

I have rebuilt a few pairs of RH kernels and glibc's to add the kernel
patch and not prelink glibc, thereby restoring the wonders of the
per-process TASK_UNMAPPED_BASE patch.  But, this must be done to both
the kernel and glibc.

So, the biggest issue in an unpatched RH world is not the user app, but
glibc.

> finally, there is a patch which does away with the kernel's 1G chunk
> entirely
> (leaving 4G:4G, but necessitating some nastiness on context switches)

This is something I want to look at, to quantify how bad it actually is.

-- 
David N. Lombard

My comments represent my opinions, not those of Intel.
_______________________________________________
Beowulf mailing list, Beowulf at beowulf.org
To change your subscription (digest mode or unsubscribe) visit http://www.beowulf.org/mailman/listinfo/beowulf



More information about the Beowulf mailing list