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)
搜索已知的内存泄漏错误并没有产生任何相关的结果。如果默认的 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 扩展:
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 附带的库存。
如果我可以提供任何其他数据,请告诉我。
任何帮助表示赞赏。这几天我一直在尝试解决这个问题。我已经没有想法了。
设置最大请求是正确的想法。这是在内存泄漏时防止系统 RAM 被填满的方法。
我建议你尝试的一件事是切换到 apache + mod_php。如果这可以正常工作而不会泄漏内存,则意味着您的问题与 CGI 有关。如果 mod_php 继续泄漏,那么代码中的某个地方可能存在内存泄漏。
你说你正在使用Drupal。您是否安装了任何类型的 Drupal 模块?我怀疑 Drupal 的稳定版本在核心中存在内存泄漏,因此问题最有可能发生在模块和其他第 3 方附加组件和自定义中。