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

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

我有一个 VPS 包。

我无法登录我的 lxadmin,因为它是“内存不足“。

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

当我重新启动 HyperVM 时,内存下降到2 兆字节

但随后,它每分钟都会慢慢地回升,15分钟它是在127 兆和攀岩。

我基本上有几个PHP 网站在网站的子目录中每分钟一次,这些网站有相当多的图形在他们身上,做相当多的文本解析每次击中,并使用sqlite数据库。

根据经验,您认为原因记忆力快速增长的原因是什么?

我可以做哪些事情来隔离原因是什么?

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

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

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

答案1

Apache 将生成多个进程,这是正常的。您可以在 Apache 配置中控制这一点。设置取决于您使用的 MPM(多处理模块)类型。

如果您使用 Apache MPM 工作器(http://httpd.apache.org/docs/2.0/mod/worker.html)你可以用以下设置来控制它:

服务器限制 16一次允许多少个进程(必须大于或等于 MaxClients/ThreadsPerChild)

启动服务器 2启动 apache 时要启动多少个进程

最大客户数 150您可以同时处理多少个请求

最小备用线程数 25Apache 将尝试保持至少这么多线程处于空闲状态

最大备用线程数 75Apache 将尝试保持少于这么多的线程处于空闲状态

每个子线程数 25每个进程有多少个线程(一个线程可以同时处理一个请求)

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


如果您使用 Apache MPM prefork (http://httpd.apache.org/docs/2.0/mod/prefork.html)你可以用以下设置来控制它:

启动服务器 20 启动 apache 时会生成多少个进程

最小备用服务器 10 Apache 将自动调整以保持至少这么多的空闲进程运行

最大备用服务器数 20 Apache 将自动调整以保持少于这么多的空闲进程

服务器限制 150 对于 prefork MPM,这应该等于 MaxClient

最大客户数 150 这是 apache 将生成的最大进程数

每个子项的最大请求数 10000 该进程在终止之前将处理多少个请求。

MaxRequestsPerChild 需要更多解释,假设您运行了许多不同的 PHP 脚本,其中有一两个脚本使用的内存比其他脚本多得多。一旦一个进程运行了该特定脚本,该进程将保持该内存使用量,直到它停止运行。使用此选项,您可以设置进程重新启动的频率。


那么你如何知道要调整这些值呢?首先,找出当 apache 未运行时有多少可用内存。其次,找出每个 httpd 进程平均需要多少内存。(从你的顶部看,大约需要 15Mb)

因此,如果在 apache 未运行时有 150Mb 可用,则应限制 apache 仅产生 150/15 = 10 个进程。

因此如果你运行 MPM worker 这可能会起作用:

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

答案2

登录 SSH shell 并运行top。这样您就可以了解哪些进程导致了问题。

答案3

尝试使用

pstree

找出哪个 Apache 进程启动了其他进程。我猜您在某个站点中有一个指令,它会分叉进程并生成多个实例。

答案4

这里有两个问题:

  • memory_limitPHP 中的大小。
  • mod_php加载以运行 PHP 的Apache 进程。

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

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


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

因此,我建议避免运行mod_phpPHP,而是将 PHP 作为 FastCGI 进程运行。

这样,您就可以控制为 PHP 提供服务的进程数量,并且所有 apache 进程都保持干净,内存使用量低。我的整个开发服务器在 250MB 以内运行,托管网站、数据库、电子邮件和 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

在某些时候,您可以选择更进一步,将 Apache 工作模型更改为线程(因为 PHP 现在已被排除在外),或者切换到轻量级服务器(如 nginx)。

相关内容