premature ENOMEM

Brad Penoff penoff at cs.ubc.ca
Fri Feb 26 07:19:56 UTC 2010


Greetings,

I have a 32-bit machine with 2 GB running FreeBSD 8.  I have a complex
application that starts getting ENOMEM once the resident memory is
about 200 MB.  I adjusted the appropriate /boot/loader.conf and
/etc/login.conf settings resulting in an increase in the "limit"
values to around 2 GB, but still the complex application gives me
ENOMEM at 200 MB.  Including swap space, I should be able to handle 3
GB in an application.  I need help understanding how I can enable this
or why I cannot.

I had this same problem on FreeBSD 6.3 about a year and a half ago,
but I found an application-level work-around particular for FreeBSD
(the full thread is here http://markmail.org/message/5nsld7pb25m5bfja
; but we found no general solution unfortunately ).  This
application-level work-around is no longer sufficient so I wanted to
revisit the root of this problem I was seeing and hopefully ask this
community of smart hackers to give me a hand here...

I have created a simplified application that demonstrates this exact
same problem and made it easy to reproduce.  I was hoping that some
kind and helpful person could take a look at it and help me out.  It
doesn't require any editing of code or anything... In the end, I just
need to know how to configure my FreeBSD box with 2 GB of RAM to not
give me ENOMEM for this application when it is using only 200 MB,
something that never happened in the previous unresolved thread
reverenced above.

This simplified application has a deliberate memory leak but the goal
is for it to not give ENOMEM at 200 MB (I want to be able to use about
1.5 GB).  I have created a tarball... I think it may only work on a
32-bit machine.

download/wget http://cs.ubc.ca/~penoff/reslim.tgz
tar zxf reslim.tgz
cd reslim
gmake (or make on Linux)
sh ./myumem.sh

On my system, when this prints our an error message, in "top", I only
see about 200 MB of both "SIZE" and "RES" (they are a few numbers
off).  The goal is for "SIZE" to be 1.5 GB or higher; "RES" is up to
the OS.  For example, on Linux, "SIZE" (called "VIRT") goes as high as
2.8 GB before the system just becomes slow and unusable (never saw
ENOMEM).  For FreeBSD, what can I change to increase the possible
"SIZE" before I see ENOMEM?  I have tried increasing
/boot/loader.conf values to match my 2 GB RAM (kern.maxdsiz,
kern.maxssiz, kern.dfldsiz), as well as unlimited values in
/etc/login.conf, but still 200 MB seems a hard limit.  Any ideas?  Why
is it not going beyond 200 MB?  Resident memory is equal to memory
size used by the app so why is it never going to disk to swap before
ENOMEM comes up?

Thanks a million for any help or advice you could lend.  I would be
more than willing to help in any way, even providing a machine to try
this on (I could sponsor an emulab.net account).  Anxious to hear what
options exist.

Thanks again,
brad


More information about the freebsd-questions mailing list