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
_______________________________________________
freebsd-performance@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-performance
To unsubscribe, send any mail to "[EMAIL PROTECTED]"