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


8

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

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

该网站基于Drupal。使用Drupal的devel模块,我可以知道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内存使用情况?
  • 有什么技巧可以减少php-cgi进程的内存消耗?

搜索已知的内存泄漏错误不会产生任何相关信息。如果默认的Debian软件包/配置有如此明显的内存泄漏,我会感到惊讶。同一主机上的其他用户没有此问题。

到目前为止,我所做的事情都设置PHP_FCGI_MAX_REQUESTS为一个较低的值,以便php-cgi进程可以快速回收。当我ab用来模拟高负载时,这很好。进程在增长到10MB以上之前会很快消失。但是,在中低负载下,所有进程都稳定增长(由于负载平衡),并且大多数进程同时消耗28MB +,这使我的VPS面临交换风险。请注意,即使没有任何流量,该过程也会稳定增长。

我可以减少php-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,但减少它并没有帮助。xcache.var_size设置为0。其余插件使用的是股票配置。xcache管理页面显示xcache使用的内存少于1MB。

PHP的memory_limit设置为32M。

这是我的FastCGI配置:

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" 
  ))
)

我或多或少地lighttpd.conf使用了Debian随附的库存。

请让我知道我是否可以提供其他数据。

任何帮助表示赞赏。我一直在尝试解决这一问题。我的想法已经用完了。

Answers:


2

尝试降低var_size。如果我们拥有64MB的价值,那么几个小时后它开始大量交换,而在接下来的几个小时后它完全崩溃了。尝试将原始设置保持在32M,也许这应该对您有很大帮助-我们在旅行网站上遇到了同样的问题,Xcache仍然是很多越野车软件:(


1

设置最大请求数是正确的想法。这是防止内存泄漏时系统RAM填满的方法。

我建议您尝试的一件事是切换到apache + mod_php。如果该方法在不泄漏内存的情况下起作用,则表明您的问题与CGI有关。如果继续使用mod_php泄漏,则代码中某处可能存在内存泄漏。

您说您正在使用Drupal。您是否安装了任何Drupal模块?我怀疑Drupal的稳定版本在内核中是否存在内存泄漏,因此问题很可能发生在模块以及其他第三方附加组件和定制中。


感谢您的回答。所有的Drupal模块都是众所周知的,并且devel模块不会报告Drupal中的任何内存泄漏。此外,即使根本没有命中,也会发生内存泄漏。至于尝试Apache,当我没有主意时,我将把它作为最后的选择。再次感谢。
约翰,2009年

我遇到了同样的问题...完成后如何杀死PHP-CGI进程?我只是在Wordpress中使用相同的设置,而这几乎杀死了我的256mib切片。
凯尔2010年

使用Nginx,因为它比两个服务器都小,并且没有PHP导致的内存泄漏。Wordpress和其他大型网站都在使用它。
Xeoncross

0

很多时候,这类麻烦是由于某些操作码缓存(例如XCache)或由于memcached PHP扩展引起的。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.