Apache httpd进程和PHP内存不足

我有一个VPS在Centos上运行apache-php-mysql,并安装了一个drupal网站。 VPS有256MB的RAM(可能是我所有问题的根本原因…也许我只是需要更多)。 每当我尝试从多个浏览器标签(大约8 …不是800)一次打开我的网站,Apache崩溃! 我在日志上有这个:

[致命错误] [客户端xxx] PHP致命错误:内存不足(分配28049408)(试图分配201335字节)在xxx行2139,referer:xxx

我在这里读了许多许多post,但我认为有一些基本的东西是我缺less的 – 如果我理解正确的话,一些php脚本在分配28MB后试图分配200K,并且没有这样做。

第一个问题是:这应该导致Apache崩溃?

接下来,我尝试着看“顶”命令,而我做我的小testing。 事实上,我看到7个httpd进程,每个预留大约30MB – 这就解释了为什么我的RAM耗尽。

如何防止apache创build新的进程,直到内存不足?

我尝试像这样configuration/etc/httpd/conf/httpd.conf:

<IfModule prefork.c> StartServers 1 MinSpareServers 1 MaxSpareServers 1 ServerLimit 1 MaxClients 1 MaxRequestsPerChild 100 </IfModule> 

但得到了同样的确切结果!

我错过了什么?

非常感谢!

更新:

我的PHP memory_limit是128M(由drupalpipe理页面确认…)free -m的输出:

  total used free shared buffers cached Mem: 256 226 29 0 0 0 -/+ buffers/cache: 226 29 Swap: 0 0 0 

我能做些什么来使apache消耗更less的内存? 我不能以较慢的响应为代价节省内存吗?

取决于您的Drupal版本:Drupal 6核心要求PHP的memory_limit至less为16MB。 Drupal 7核心需要32MB。

根据错误和你的post分配了28MB,请在php.ini文件中确认memory_limit设置正确。 确保重新启动Apache以对php.ini进行任何更改。

另一个要考虑的方面是服务器上运行的其他服务,Apache,MySQL等,这些服务总共需要256MB。

要了解当前的内存使用情况,您可以键入:

 free -m 

-m标志以MB为单位输出数据。 -b开关显示以字节为单位的内存量; -k开关(默认设置)以千字节显示。

你会得到像这样的输出:

 total used free shared buffers cached Mem: 24031 22512 1518 0 1614 8082 -/+ buffers/cache: 12815 11215 Swap: 31999 485 31514 

根据可用内存的不同,您可以开始将问题缩小到PHP,或者您已经超出/超出了VPS。

编辑

@Ofri,

Apacheconfiguration没有确切的科学知识。它归结为了解机器的规格,主要是试验和错误。 在正在进行的试验和错误期间监视服务器的性能非常重要,因此您可以看到正面/负面的影响。

我会停止Apache,根据下面的值编辑httpd.conf,看看服务器的行为:

  • MaxKeepAliveRequests 100
  • KeepAliveTimeout 15
  • MinSpareServers 5
  • MaxSpareServers 10
  • StartServers 5
  • MaxClients 150
  • MaxRequestsPerChild 300

请记住Drupal是一个系统pipe理员,你最终可能会将VPS升级到512MB。

-Brendan