php-cgi进程的内存使用量稳步增长

我正在尝试在VPS上设置一个Web服务器。 我的问题是,即使网站没有收到任何stream量,php-cgi进程的内存使用量也随着时间增加。 (暂时在防火墙后面)

VPS有360MB RAM。 我使用的是Debian Lenny 32bit及其lighttpd和php5-cgi软件包。 除了一些configuration更改(下面列出),我正在使用Debian的股票设置。

该网站基于Drupal。 使用Drupal的开发模块,我可以看出PHP脚本的内存使用量平均小于20KB,并且从不超过8MB。

以下是ps aux输出的相关部分:

 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND www-data 29871 0.0 1.7 54552 6368 ? Ss Aug12 0:00 /usr/bin/php-cgi www-data 29873 0.0 7.4 65808 27468 ? S Aug12 0:00 /usr/bin/php-cgi www-data 29874 0.0 3.7 55808 13736 ? S Aug12 0:00 /usr/bin/php-cgi www-data 29875 0.0 4.3 58040 16204 ? S Aug12 0:00 /usr/bin/php-cgi www-data 29876 0.0 4.4 57444 16288 ? S Aug12 0:00 /usr/bin/php-cgi www-data 29877 0.0 1.7 54552 6368 ? Ss Aug12 0:00 /usr/bin/php-cgi www-data 29879 0.0 9.6 67140 35684 ? S Aug12 0:26 /usr/bin/php-cgi www-data 29880 0.0 6.6 59172 24492 ? S Aug12 0:23 /usr/bin/php-cgi www-data 29881 0.0 7.1 59784 26388 ? S Aug12 0:22 /usr/bin/php-cgi www-data 29882 0.0 7.4 60880 27440 ? S Aug12 0:23 /usr/bin/php-cgi 
  • 有这么大的php-cgi是否正常?
  • 有没有可能根据设置来估计php-cgi的内存使用情况?
  • 有关减lessphp-cgi进程的内存消耗的技巧?

search已知的内存泄漏错误没有产生任何相关的。 如果默认的Debian软件包/ config有这么明显的内存泄漏,我会感到惊讶。 同一主机上的其他用户没有这个问题。

到目前为止,我所做的是将PHP_FCGI_MAX_REQUESTS设置为一个较低的值,以便php-cgi进程可以快速回收。 当我用ab来模拟高负载时,这个效果非常好。 进程在高于10MB之前快速死亡。 但是,在中低负载的情况下,所有进程稳步增长(由于负载均衡),其中大部分进程同时消耗28MB +,使我的VPS面临交换风险。 请注意,即使没有任何stream量,stream程也会稳步增长。

我可以减lessphp-cgi进程的数量,但是这感觉像是一个解决方法而不是解决方法。 如果php-cgi通常像这样成长,我会感到惊讶。

另外,总结php-cgi进程的RSS总数,得出:

 $ ps -C php-cgi -o rss= | awk '{s+=$1}END{print s/1024}' 195.738 

然而, free -m提供了以下输出:

  total used free shared buffers cached Mem: 360 351 8 0 33 190 -/+ buffers/cache: 127 232 Swap: 255 0 255 
  • 我错过了什么吗? 如何使用的内存(无缓冲区)低于主机上的php-cgi进程的总驻留内存?

我有以下的PHP扩展:

php5-cgi php5-common php5-curl php5-gd php5-mysql php5-xcache

xcache.size被设置为24M。 它曾经是32M,但减less它并没有帮助。 xcache.var_size被设置为0.其余的插件正在使用库存configuration。 xcachepipe理页面显示xcache使用less于1MB。

PHP的memory_limit被设置为32M。

这是我的FastCGIconfiguration:

 fastcgi.server = ( ".php" => (( "bin-path" => "/usr/bin/php-cgi", "socket" => "/tmp/php.socket", "max-procs" => 2, "idle-timeout" => 20, "bin-environment" => ( "PHP_FCGI_CHILDREN" => "4", "PHP_FCGI_MAX_REQUESTS" => "1000" ), "bin-copy-environment" => ( "PATH", "SHELL", "USER" ), "broken-scriptfilename" => "enable" )) ) 

我正在使用Debian附带的或多或less的lighttpd.conf

请让我知道,如果有任何其他数据,我可以提供。

任何帮助表示赞赏。 我一直试图排查这个问题。 我已经用完了想法。

尝试降低var_size。 如果我们的价值在64MB,几个小时后就开始交换了很多,在接下来的几个小时之后,它完全崩溃了。 尝试保持在32M的原始设置,也许这​​应该会帮助你很多 – 我们在我们的旅游网站有同样的问题Xcache仍然是很多bug软件:(

设置最大请求是正确的想法。 当存在内存泄漏时,这是保持系统内存不被填满的方法。

我build议你尝试的一件事是切换到Apache + mod_php。 如果这样做没有泄漏记忆,那么这意味着你的问题是CGI相关的。 如果它继续与mod_php泄漏,那么代码中可能有内存泄漏。

你说你正在使用Drupal。 你有没有安装任何types的Drupal模块? 我怀疑Drupal的一个稳定版本在内核中有内存泄漏,所以问题很可能发生在模块和其他第三方附件和定制中。

很多时候,这些麻烦都是由于某些操作码caching(如XCache)或应有的memcached PHP扩展引起的。

从/etc/php5/apache2/conf.d中删除未使用的库。 可能你不需要pdo.ini和pdo_mysq.ini或mysqli.ini这将节省几兆的Ram