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

Edw*_*uay 1 vps memory

我有一个 VPS 包。

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

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

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

但随后它每分钟都在缓慢回升,到15 分钟时,它的大小达到127 MB并不断攀升。

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

根据经验,您认为导致这种快速记忆蔓延的原因是什么?

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

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

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

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

小智 6

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

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

ServerLimit 16一次允许的进程数(必须大于或等于 MaxClients/ThreadsPerChild)

StartServers 2启动apache时要启动多少个进程

MaxClients 150您可以同时处理多少个请求

MinSpareThreads 25 Apache 将尝试至少保持这么多线程空闲

MaxSpareThreads 75 Apache 将尝试保持少于这么多线程空闲

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

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


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

StartServers 20 启动 apache 时产生多少进程

MinSpareServers 10 Apache 将自动调整以保持至少这么多空闲进程在运行

MaxSpareServers 20 Apache 将自动调整以保持少于这么多空闲进程

ServerLimit 150 对于 prefork MPM,这应该等于 MaxClient

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

MaxRequestsPerChild 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 
Run Code Online (Sandbox Code Playgroud)

如果您正在运行 MPM prefork,这可能会更好:

StartServers 5  
MinSpareServers 2  
MaxSpareServers 8  
ServerLimit 10  
MaxClients 10  
MaxRequestsPerChild 1000
Run Code Online (Sandbox Code Playgroud)