什么可能导致VPS上的内存蠕变?

我有一个VPS包。

我无法login到我的lxadmin,因为它是“ 内存不足 ”。

在HyperVM中,我看到我的VPS正在使用240 MB的256 MB。

当我重新启动HyperVM时,内存下降到2 MB

但是随着时间的推移,它逐渐缓慢地回升,到了15分钟,它就达到了127MB,并且正在攀升。

我基本上有几个PHP网站网站上的子目录每分钟获得一个命中 ,这些网站上有相当多的graphics ,在每一个命中做了不less文本parsing ,一个使用SQLite数据库。

从经验来看,你认为这种快速记忆蠕变的原因是什么?

我能做些什么来隔离原因?

这里是top的结果,好像所有的apache实例都加起来了,这是什么意思?

替代文字http://tanguay.info/web/external/lxadminMemoryProblemTop.png

替代文字http://tanguay.info/web/external/lxAdminMemoryProblem.jpg

Apache会产生多个进程,这是正常的。 你可以在apacheconfiguration中控制这个。 这些设置取决于您正在使用的MPM(多处理器模块)的types。

如果您使用的是Apache MPM worker( http://httpd.apache.org/docs/2.0/mod/worker.html ),则可以使用以下设置进行控制:

ServerLimit 16同时允许多less个进程(必须大于或等于MaxClients / ThreadsPerChild)

StartServers 2启动Apache时需要启动多less个进程

MaxClients 150您可以同时提供多less个请求

MinSpareThreads 25 Apache会尽量保持这么多的线程空闲

MaxSpareThreads 75 Apache将尽量保持less许这么多的线程空闲

ThreadsPerChild 25每个进程有多less个线程(一个线程可以服务于一个请求)

因此,如果您没有足够的内存来运行所有这些进程,请尝试降低MaxClients和ServerLimit。


如果您正在使用Apache MPM prefork( http://httpd.apache.org/docs/2.0/mod/prefork.html ),则可以使用以下设置进行控制:

StartServers 20启动apache时会产生多less个进程

MinSpareServers 10 Apache将自动进行调整,以保持这许多空闲进程的运行

MaxSpareServers 20 Apache将自动调整以保持less许空闲进程

ServerLimit 150这应该等于用于prefork MPM的MaxClient

MaxClients 150这是Apache产生的最大进程数

MaxRequestsPerChild 10000进程在终止之前将处理多less个请求。

MaxRequestsPerChild需要一些更多的解释,比如说你有很多不同的PHP脚本在运行,其中一个或两个使用了更多的内存。 一旦一个进程运行了特定的脚本,进程将停留在内存使用状态直到它死亡。 使用此选项,您可以设置您希望进程重新启动的频率。


那么你怎么知道调整这些价值呢? 首先,找出当apache没有运行时有多less空闲内存。 其次,弄清楚每个httpd处理请求者在内存上有多less内存。 (从你的顶部看起来像是15Mb左右)

所以,如果你的Apache没有运行时你有150Mb的空闲空间,你应该限制apache只产生150/15 = 10个进程。

所以如果你运行MPM工作者这可能工作:

ServerLimit 10 StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 

如果你正在运行MPM prefork这可能会更好地工作:

 StartServers 5 MinSpareServers 2 MaxSpareServers 8 ServerLimit 10 MaxClients 10 MaxRequestsPerChild 1000 

login到SSH shell并运行top 。 这会给你一个特别是什么进程在这里造成问题的想法。

尝试使用

 pstree 

找出哪个apache进程启动其他。 我想你在一个网站有一个指令,分叉进程和产生多个实例。

Apache是​​一个内存猪,我认为这是正常的,看到阿帕奇采取像你这样的stream量使用这么多ram。

我的build议是升级你的VPS。 或者,如果你想得到最好的回报,沟通Apache和使用php-fpm的nginx / lighttpd。 我个人在我的VPS上使用Litespeed Web服务器标准版,而且它很危险。 唯一的缺点是,如果您的网站超过了Litespeed的限制(150个并发连接),您将不得不为企业版付费或切换到其他networking服务器。

这里有两个问题:

  • PHP中的memory_limit大小。
  • 加载mod_php来运行PHP的Apache进程。

要解决第一个问题,您必须在php.ini设置memory_limit大小,或者可能会覆盖默认值的.htaccess文件。 您看到的错误消息可能很容易由PHP的内存限制设置引起,而不是VPS限制。

您可以轻松地增加限制。 真正修复它需要修复应用程序代码。


第二个问题是mod_php更复杂,并且需要改变你的Apache设置。 mod_php扩展为每个启动PHP服务的Apache进程增加了内存使用。 起初,您拥有提供文件的原始Apache进程,以及一些为PHP服务的进程。 当请求数量增加时,更多陈旧的进程开始加载PHP。 在某些时候,你不必要地消耗大量的内存。

因此,我会build议避免运行mod_php ,而是运行PHP作为FastCGI进程。

通过这种方式,您可以控制为PHP提供服务的进程数量,并且所有的apache进程都保持清洁,内存使用率低。 我的整个开发服务器运行在250MB以内,托pipe网站,数据库,电子邮件和redmine。

Apache conf文件需要具有以下内容:

 <IfModule fcgid_module> FcgidIPCDir /var/lib/apache2/fcgid/ FcgidProcessTableFile /var/lib/apache2/fcgid/shm FcgidMaxProcessesPerClass 1 FcgidIOTimeout 600 AddHandler fcgid-script .fcgi <FilesMatch "\.php$"> AddHandler fcgid-script .php Options +ExecCGI FcgidWrapper /srv/www/cgi-bin/php5-wrapper.sh .php </FilesMatch> # Added explicitly, by default it was added by mod_php.conf DirectoryIndex index.php </IfModule> 

php5-wrapper.sh脚本如下所示:

 #!/bin/sh #export PHPRC=/etc/php/fastcgi/ export PHP_FCGI_CHILDREN=5 export PHP_FCGI_MAX_REQUESTS=5000 exec /usr/bin/php-cgi5 

在一些发行版中, php-fastcgi是一个与php-cgi分开的软件包。

在某些情况下,您可以select更进一步,并将Apache工作模型更改为线程(因为PHP现在被忽略),或切换到轻量级服务器(如nginx)。