PHP's APC cache and how it relates to Apache Bloat

Compiling the Big Apache on a limited resource VPS can be a challenge for those of us who like to tinkle. On the last VPS I got I scrapped the packaged stuff and started on compiling an Apache for the machine. The problem is trying to meet your needs with the limited memory you usually get on these machines. Although I like lighttpd, I'm not ready to give it a go on a production server that is being monitored by the media all the time. I need something as guaranteed as I can get. Although lighttpd may be such a beast, I'm not going to test it out on this site at this time!

I sat down and started to go over all configuration option for Apache, PHP and APC to get a nice small package to do the job. I was surprised how much junk PHP has compiled in by default. Compile it once and execute a phpinfo() and you'll see. Just start with the "--disable" switches for anything you don't want.

After about a day of thinning out the size of my stack I slipped into TOP and used the SHIFT-A toggle to see the alternate views. I noticed something odd.....

3 PID %MEM VIRT SWAP RES CODE DATA SHR nFLT nDRT S PR NI %CPU COMMAND
24140 0.1 78592 69m 7228 504 2124 2952 6 0 S 16 0 0 httpd
11329 0.1 78408 69m 6908 504 1964 2736 2 0 S 16 0 0 httpd
24141 0.1 78564 70m 6752 504 2120 2492 0 0 S 16 0 0 httpd
24142 0.1 78564 70m 6732 504 2120 2476 0 0 S 16 0 0 httpd
27813 0.1 78560 70m 6684 504 2116 2432 0 0 S 16 0 0 httpd

Doesn't that seem like a lot of VIRT and SWAP for Apache2? Yes, it is. If you used the suggested 128 for apc.shm_size it will be a lot bigger too! I used 64M and you can see that at 78592 minus the 64M shared mem for the APC cache, the actual size is around 13M for apache with a 6.7M RES. That makes me feel better! I was so worried I had gotten something horribly wrong.

If you happen to run across this kind of thing in testing, simply set your apc.enabled in php.ini to '0' to disable it, restart Apache and check 'top' again. Likely nothing to worry about.

The machine I am running is only hosting 4 sites so 64M is a good starting point, but what you should do is copy the file 'apc.php' from your APC source directory into a folder on your webserver and visit it frequently to see how it behaves. Depending on your other settings like the cache lifetime and garbage collection, if you have a large portion of FREE and a small USED then you can probably set the apc.shm_size lower. If it makes you feel better :)