我怎么知道我的PHP应用程序是否使用了太多内存?
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?
我正在开发一个PHP Web应用程序,让用户可以相互联网,预订事件,并互相发送消息。 只有大约100个用户。 p>
我使用Ubuntu 9.10,apache2,mysql 5和php 5在VPS上设置应用程序。我有360 Mb的RAM,但升级到720 MB。 p>
最近,由于内存使用过多,我的Web应用程序一直在中断。 从我在错误日志中可以看出,似乎服务器自动杀死占用过多内存的apache进程。 因此,我将内存从360 MB升级到720 MB作为一种权宜之计。 p>
所以我的问题是,如何解决这些中断问题? 我怎么知道我的网站是否需要更多的内存是由于代码不好或者它是否是网站自然增长的一部分? 确定哪些PHP脚本消耗最多内存的最有效方法是什么? p> div>
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"] . "
");
}
(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.
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.
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.