Question

I'm working on a PHP web application that let's users network with each other, book events, and message eachother. There's only about 100 users.

I set up the application on a VPS with Ubuntu 9.10, apache2, mysql 5 and php 5. I had 360 Mb of RAM, but upgraded to 720 MB.

Lately, my web application has been experiencing outages due to excessive memory usage. From what I can tell in error logs, it seems the server automatically kills apache processes that consume too much memory. As a result, I upgraded memory from 360 MB to 720 MB as a stop-gap measure.

So my question is, how do I go about resolving these outage issues? How do I know if my website's need for more memory is due to poor code or if it's part of the website's natural growth? What's the most efficient way to determine which PHP scripts consume the most memory?

Was it helpful?

Solution

There's no simple answer to this, although I would suspect that it may a problem in your code.

What is the memory_limit setting in your php.ini file? Typically I'd recommend at least 4Mb, and usually 16. How many concurrent hits are you fielding? Is the site doing a lot of heavy reporting of stats? Or rendering of images via PHP? Do you use file_get_contents() anywhere?

You really need to set up some custom logging to report for each URL, the size of the log file at exit. e.g. you could auto-prepend:

<?php
register_shutdown_function('log_mem');

function log_mem()
{
   fputs(STDERR, '[' . date('c') . '] ' . memory_get_usage() . ' ' 
     . $_SERVER["REQUEST_URI"] . "\n");
}

(Note - no closing tag) This will write out the memory used by each PHP page to the error_log so you can isolate the problem more easily.

HTH

C.

OTHER TIPS

Another thing you can do if your process size is small is turn down your httpd settings to have min spare servers of 1, and max spare servers of 3. If you only have 100 users, this should be fine, as you won't care about the overhead of starting processes for only a few users.

Here is a tool that supports profiling PHP: http://xdebug.org/docs/profiler

Depending on your version of httpd & php, httpd could be holding on to segments of memory that it doesn't need, and growing the running process size unnecessarily. I have a box that does this, and I've solved the issue by doing an httpd restart on a nightly basis like so:

30 00 * * *     /httpd/sbin/apachectl restart
31 00 * * *     /httpd/sbin/apachectl start
35 00 * * *     /httpd/sbin/apachectl start
40 00 * * *     /httpd/sbin/apachectl start

As you can see, I follow up my restart with 3 trailing starts, just in case apache fails to come back to life after the restart. 3 is probably overkill, but on the other hand, it doesn't hurt anything, so why not.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top