mmap()

Michael Conlen m at obmail.net
Thu Nov 24 10:05:52 PST 2005


On Nov 23, 2005, at 5:21 PM, Robert Watson wrote:

>
> On Wed, 23 Nov 2005, Michael Conlen wrote:
>
>> Sorry if this is the wrong place for this, but I haven't been  
>> getting answers elsewhere.
>>
>> I'm trying to tune the system to allow very large mmap()'s in a  
>> single process space, something on the order of 1.5 GB so I can  
>> pass very large values for -Xms and -Xmx to java. I know I had  
>> been able to do this on FreeBSD in the past but recent versions of  
>> either Java or FreeBSD aren't playing nicely.  currently..
>
> BTW, you may find it useful to use procfs to inspect the address  
> space layout of your process.  You can d:
>
>   mkdir /proc
>   mount -t procfs proc /proc
>   cd /proc/pid
>   dd if=map of=/dev/stdout bs=20k
>
> This can help you look for fragmentation of process address space,  
> among other things.

Thanks. I forgot when you mmap you have to have contiguous space... ...

0x8048000 0x8049000 0 0 0xc3c79630 r-x 1 0 0x0 COW NC vnode /tmp/foo
0x8049000 0x804a000 1 0 0xc5ad718c rw- 2 0 0x2180 NCOW NNC default -
0x804a000 0x804c000 2 0 0xc5ad718c rwx 2 0 0x2180 NCOW NNC default -
0x87f49000 0x87f69000 32 0 0xc10406b4 r-x 80 29 0x4 COW NC vnode / 
libexec/ld-elf

That looks like about 2 GB of space between the last two lines. The  
rest is as follows

0x87f69000 0x87f6a000 1 0 0xc5ae1d68 rw- 1 0 0x2180 COW NNC vnode / 
libexec/ld-elf.so.1
0x87f6a000 0x87f6f000 5 0 0xc3b4db58 rw- 2 0 0x2180 NCOW NNC default -
0x87f6f000 0x87f77000 7 0 0xc3b4db58 rwx 2 0 0x2180 NCOW NNC default -
0x87f77000 0x88041000 108 0 0xc3b3bd68 r-x 1 0 0x2180 COW NNC vnode / 
lib/libc.so.5
0x88041000 0x88042000 1 0 0xc5ad6840 r-x 1 0 0x2180 COW NNC vnode / 
lib/libc.so.5
0x88042000 0x88047000 5 0 0xc5ad418c rwx 1 0 0x2180 COW NNC vnode / 
lib/libc.so.5
0x88047000 0x8805c000 6 0 0xc5ad75ac rwx 1 0 0x2180 NCOW NNC default -
0xbfbe0000 0xbfc00000 3 0 0xc3c9718c rwx 1 0 0x2180 NCOW NNC default -

If I change from using mmap to malloc() I get the following first  
four lines show malloc() on the heap

0x8048000 0x8049000 1 0 0xc3b2c318 r-x 1 0 0x0 COW NC vnode /tmp/foo
0x8049000 0x804a000 1 0 0xc5ae3108 rw- 2 0 0x2180 NCOW NNC default -
0x804a000 0x3fc4c000 2 0 0xc5ae3108 rwx 2 0 0x2180 NCOW NNC default -
0x87f49000 0x87f69000 32 0 0xc10406b4 r-x 83 31 0x4 COW NC vnode / 
libexec/ld-elf

and it looks like a smaller mmap() shows up at the end


0x88041000 0x88042000 1 0 0xc5adcce4 r-x 1 0 0x2180 COW NNC vnode / 
lib/libc.so.5
0x88042000 0x88047000 5 0 0xc5ad6420 rwx 1 0 0x2180 COW NNC vnode / 
lib/libc.so.5
0x88047000 0x8805b000 5 0 0xc5ae1ce4 rwx 3 0 0x2180 NCOW NNC default -
0x8805b000 0xbfb5b000 0 0 0xc5ae1ce4 --- 3 0 0x2180 NCOW NNC default -
0xbfb5b000 0xbfb5c000 1 0 0xc5ae1ce4 rwx 3 0 0x2180 NCOW NNC default -

I presume the stack is coming up from the bottom.  The end looks  
about 5 MB short of 3 GB.

In all it looks like about 1 GB off the top (kernel I presume), the  
heap, followed by the libraries which IIRC are mmap()'ed coming down  
after the end of the heap and I presume the stack coming up from the  
bottom.

If I reduce the limit for the datasize locally using limit it doesn't  
seem to actually free up space for the stack. If I change loader.conf  
to reduce the datasize then the space is freed up to do the mmap().  
If I leave the max datasize and reduce the default to 1 GB I don't  
get any change in the memory map at all.

So here's the problem, I've got a DB server that needs a large  
datasize and a tomcat server which occasionally needs to use a lot of  
memory, which java allocates from a memory mapped space. Any ideas  
how to get the system to allow processes to have either/or?

--
Michael Conlen


More information about the freebsd-performance mailing list