Hi, I had hoped that FreeBSD would be immune, but it seems not. I have been bashing it with http_load and all of a sudden(after a LOT of bashing and swaping) all of my processes had zero shared. It did take me days of fiddling to run into this though.
Thanks, Eric At 04:16 PM 3/16/02 -0500, Ed Grimm wrote: >I believe I have the answer... > >The problem is that the parent httpd swaps, and any new children it >creates load the portion of memory that was swaped from swap, which does >not make it copy-on-write. The really annoying thing - when memory gets >tight, the parent is the most likely httpd process to swap, because its >memory is 99% idle. This issue aflicts Linux, Solaris, and a bunch of >other OSes. > >The solution is mlockall(2), available under Linux, Solaris, and other >POSIX.1b compliant OSes. I've not experimented with calling it from >perl, and I've not looked at Apache enough to consider patching it >there, but this system call, if your process is run as root, will >prevent any and all swapping of your process's memory. If your process >is not run as root, it returns an error. > > >The reason turning off swap works is because it forces the memory from >the parent process that was swapped out to be swapped back in. It will >not fix those processes that have been sired after the shared memory >loss, as of Linux 2.2.15 and Solaris 2.6. (I have not checked since >then for behavior in this regard, nor have I checked on other OSes.) > >Ed > >On Thu, 14 Mar 2002, Bill Marrs wrote: > >> >It's copy-on-write. The swap is a write-to-disk. >> >There's no such thing as sharing memory between one process on disk(/swap) >> >and another in memory. >> >> agreed. What's interesting is that if I turn swap off and back on again, >> the sharing is restored! So, now I'm tempted to run a crontab every 30 >> minutes that turns the swap off and on again, just to keep the httpds >> shared. No Apache restart required! >> >> Seems like a crazy thing to do, though. >> >> >You'll also want to look into tuning your paging algorithm. >> >> Yeah... I'll look into it. If I had a way to tell the kernel to never swap >> out any httpd process, that would be a great solution. The kernel is >> making a bad choice here. By swapping, it triggers more memory usage >> because sharing removed on the httpd process group (thus multiplied)... >> >> I've got MaxClients down to 8 now and it's still happening. I think my >> best course of action may be a crontab swap flusher. >> >> -bill > http://www.kwinternet.com/eric (250) 655 - 9513 (PST Time Zone)