我正在尝试在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随附的库存。
请让我知道我是否可以提供其他数据。
任何帮助表示赞赏。我一直在尝试解决这一问题。我的想法已经用完了。