Apache httpd 进程和 PHP 内存不足

Apache httpd 进程和 PHP 内存不足

我有一个在 centos 上运行 apache-php-mysql 的 VPS,并且安装了一个 drupal 网站。该 VPS 有 256MB 的 RAM(可能是我所有问题的根源……也许我只是需要更多)。每当我尝试同时从多个浏览器选项卡(大约 8 个……而不是 800 个)打开我的网站时,apache 就会崩溃!我的日志中有以下内容:

[2012 年 10 月 24 日星期三 11:26:31] [错误] [客户端 xxx] PHP 致命错误:内存不足(已分配 28049408)(试图分配 201335 字节)位于 xxx 第 2139 行,引用者:xxx

我已经阅读了这里的很多帖子,但我认为我忽略了一些基本的东西——如果我理解正确的话,一些 php 脚本在分配 28MB 后试图分配 200K,但失败了。

第一个问题是:这会导致 Apache 崩溃吗???

接下来,我尝试在进行小测试时查看“top”命令。我确实看到 7 个 httpd 进程,每个进程保留了大约 30MB 的空间 - 这就解释了为什么我的 RAM 耗尽了。

如何防止 apache 在内存不足之前创建新进程?

我尝试像这样配置 /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(经 drupal 管理页面确认...) free -m 的输出:

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

我该怎么做才能让 Apache 消耗更少的内存?我不能以降低响应速度为代价来节省内存吗?

答案1

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

根据错误和您已分配 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,

Apache 配置没有精确的科学依据。归根结底,它就是了解机器的规格,主要是反复试验。在持续的反复试验期间监控服务器的性能非常重要,这样您就可以看到积极/消极的影响。

我将停止 Apache,根据以下值编辑 httpd.conf 并查看服务器的行为:

  • 最大KeepAliveRequests 100
  • KeepAliveTimeout 15
  • 最小备用服务器数 5
  • 最大备用服务器数 10
  • 启动服务器 5
  • 最大客户数 150
  • 每个孩子的最大请求数 300

请记住,Drupal 占用的系统空间很大,您最终可能需要将 VPS 升级到 512MB。

-布伦丹

相关内容