我有一个在 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。
-布伦丹