imposing memory limits in FreeBSD 8
While I am thrilled about the newfound zfs stability that upgrading to 8 has brought, one of the things that seems to have been dropped is support for process memory limits. I have a few servers that occasionally run out of swap due to runaway httpd daemons, and the ulimit -m settings in the startup scripts we use stopped working upon upgrading from FreeBSD 6. I've tried fiddling with the daemon class in login.conf to no avail either. About the only thing I haven't tried is running httpd under djb's softlimit executable. Here's my daemon class in login.conf: daemon:\ :memoryuse=1g:\ :datasize=1g:\ :stacksize=1g:\ :tc=default: and proof that `limits` groks the config: # limits -eHC daemon ulimit -t unlimited; ulimit -f unlimited; ulimit -d 1048576; ulimit -s 1048576; ulimit -c unlimited; ulimit -m 1048576; ulimit -l unlimited; ulimit -u unlimited; ulimit -n unlimited; ulimit -b unlimited; ulimit -v unlimited; ulimit -p unlimited; ulimit -w unlimited; Any tips from admins who have successfully imposed memory constraints in 8.x? ___ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org
Re: imposing memory limits in FreeBSD 8
On Sat, Apr 9, 2011 at 10:15 AM, Joe Schaefer joes...@gmail.com wrote: While I am thrilled about the newfound zfs stability that upgrading to 8 has brought, one of the things that seems to have been dropped is support for process memory limits. I have a few servers that occasionally run out of swap due to runaway httpd daemons, and the ulimit -m settings in the startup scripts we use stopped working upon upgrading from FreeBSD 6. I've tried fiddling with the daemon class in login.conf to no avail either. About the only thing I haven't tried is running httpd under djb's softlimit executable. Here's my daemon class in login.conf: daemon:\ :memoryuse=1g:\ :datasize=1g:\ :stacksize=1g:\ :tc=default: and proof that `limits` groks the config: # limits -eHC daemon ulimit -t unlimited; ulimit -f unlimited; ulimit -d 1048576; ulimit -s 1048576; ulimit -c unlimited; ulimit -m 1048576; ulimit -l unlimited; ulimit -u unlimited; ulimit -n unlimited; ulimit -b unlimited; ulimit -v unlimited; ulimit -p unlimited; ulimit -w unlimited; Any tips from admins who have successfully imposed memory constraints in 8.x? If I recall it correctly, in -8 malloc defaults to mmap for memory allocations, so RLIMIT_DATA no longer applies. You have to set RLIMIT_VMEM, but be careful as that would include everything mmapped in even if it does not use much of that. rpc.statd is one example of that -- it mmaps in ~256M but has only ~400K resident set size. Another option would be to make malloc() switch back to sbrk() with MALLOC_OPTIONS=D. This way datasize limit will still be in effect. --Artem ___ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org
Re: imposing memory limits in FreeBSD 8
On Sat, Apr 9, 2011 at 3:06 PM, Artem Belevich a...@freebsd.org wrote: On Sat, Apr 9, 2011 at 10:15 AM, Joe Schaefer joes...@gmail.com wrote: While I am thrilled about the newfound zfs stability that upgrading to 8 has brought, one of the things that seems to have been dropped is support for process memory limits. I have a few servers that occasionally run out of swap due to runaway httpd daemons, and the ulimit -m settings in the startup scripts we use stopped working upon upgrading from FreeBSD 6. I've tried fiddling with the daemon class in login.conf to no avail either. About the only thing I haven't tried is running httpd under djb's softlimit executable. Here's my daemon class in login.conf: daemon:\ :memoryuse=1g:\ :datasize=1g:\ :stacksize=1g:\ :tc=default: and proof that `limits` groks the config: # limits -eHC daemon ulimit -t unlimited; ulimit -f unlimited; ulimit -d 1048576; ulimit -s 1048576; ulimit -c unlimited; ulimit -m 1048576; ulimit -l unlimited; ulimit -u unlimited; ulimit -n unlimited; ulimit -b unlimited; ulimit -v unlimited; ulimit -p unlimited; ulimit -w unlimited; Any tips from admins who have successfully imposed memory constraints in 8.x? If I recall it correctly, in -8 malloc defaults to mmap for memory allocations, so RLIMIT_DATA no longer applies. You have to set RLIMIT_VMEM, but be careful as that would include everything mmapped in even if it does not use much of that. rpc.statd is one example of that -- it mmaps in ~256M but has only ~400K resident set size. Another option would be to make malloc() switch back to sbrk() with MALLOC_OPTIONS=D. This way datasize limit will still be in effect. Thanks for the tip. My concern is with runaway processes that are pushing the server into swap, so it's pretty easy to pick them out based on what top reports for their SIZE. I'll try the vmem limit and let you know how that works out. ___ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org
Re: imposing memory limits in FreeBSD 8
On Sat, Apr 9, 2011 at 3:17 PM, Joe Schaefer joes...@gmail.com wrote: On Sat, Apr 9, 2011 at 3:06 PM, Artem Belevich a...@freebsd.org wrote: On Sat, Apr 9, 2011 at 10:15 AM, Joe Schaefer joes...@gmail.com wrote: While I am thrilled about the newfound zfs stability that upgrading to 8 has brought, one of the things that seems to have been dropped is support for process memory limits. I have a few servers that occasionally run out of swap due to runaway httpd daemons, and the ulimit -m settings in the startup scripts we use stopped working upon upgrading from FreeBSD 6. I've tried fiddling with the daemon class in login.conf to no avail either. About the only thing I haven't tried is running httpd under djb's softlimit executable. Here's my daemon class in login.conf: daemon:\ :memoryuse=1g:\ :datasize=1g:\ :stacksize=1g:\ :tc=default: and proof that `limits` groks the config: # limits -eHC daemon ulimit -t unlimited; ulimit -f unlimited; ulimit -d 1048576; ulimit -s 1048576; ulimit -c unlimited; ulimit -m 1048576; ulimit -l unlimited; ulimit -u unlimited; ulimit -n unlimited; ulimit -b unlimited; ulimit -v unlimited; ulimit -p unlimited; ulimit -w unlimited; Any tips from admins who have successfully imposed memory constraints in 8.x? If I recall it correctly, in -8 malloc defaults to mmap for memory allocations, so RLIMIT_DATA no longer applies. You have to set RLIMIT_VMEM, but be careful as that would include everything mmapped in even if it does not use much of that. rpc.statd is one example of that -- it mmaps in ~256M but has only ~400K resident set size. Another option would be to make malloc() switch back to sbrk() with MALLOC_OPTIONS=D. This way datasize limit will still be in effect. Thanks for the tip. My concern is with runaway processes that are pushing the server into swap, so it's pretty easy to pick them out based on what top reports for their SIZE. I'll try the vmem limit and let you know how that works out. Sweet- if the expected behavior is to send the process a SIGABORT when it hits the limit, it's working perfectly. ___ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org