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

Joh*_*ohn 8 linux php memory web-server lighttpd

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

VPS 有 360MB 内存。我正在使用 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
Run Code Online (Sandbox Code Playgroud)
  • 有这么大的 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
Run Code Online (Sandbox Code Playgroud)

然而,free -m给出以下输出:

             total       used       free     shared    buffers     cached
Mem:           360        351          8          0         33        190
-/+ buffers/cache:        127        232
Swap:          255          0        255
Run Code Online (Sandbox Code Playgroud)
  • 我错过了什么吗?为什么使用的内存(没有缓冲区)低于主机上 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" 
  ))
)
Run Code Online (Sandbox Code Playgroud)

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

如果我可以提供任何其他数据,请告诉我。

任何帮助表示赞赏。这几天我一直在尝试解决这个问题。我已经没有想法了。

Apr*_*che 1

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

我建议你尝试的一件事是切换到 apache + mod_php。如果这可以正常工作而不会泄漏内存,则意味着您的问题与 CGI 有关。如果 mod_php 继续泄漏,那么代码中的某个地方可能存在内存泄漏。

你说你正在使用Drupal。您是否安装了任何类型的 Drupal 模块?我怀疑 Drupal 的稳定版本在核心中存在内存泄漏,因此问题最有可能发生在模块和其他第 3 方附加组件和自定义中。