【发布时间】:2014-05-10 19:48:57
【问题描述】:
运行脚本以筛选抓取网页时,我得到“zend_mm_heap 损坏”。请告诉我,如何解决此问题。
【问题讨论】:
标签: php
运行脚本以筛选抓取网页时,我得到“zend_mm_heap 损坏”。请告诉我,如何解决此问题。
【问题讨论】:
标签: php
我假设您正在使用带有 mod_php 的 Apache 来回答这个问题。
当 apache 生成太多实例耗尽所有 RAM 时,我收到此错误,然后尝试使用磁盘交换,然后响应将继续减慢,直到最终崩溃,它会 SEGFAULT。重新启动 apache 服务将使一切恢复正常,直到几分钟或几小时后再次沸腾。
这篇文章对我的情况有所帮助: https://servercheck.in/blog/3-small-tweaks-make-apache-fly
基本上,看看每个apache进程使用了多少(可能是你服务器上的httpd或nginx):
ps aux | grep 'apache' | awk '{print $6/1024 " MB";}'
找出每个进程的平均 MB 使用量,在我的例子中,每个进程大约是 ~40MB。
接下来找出您的 apache 有多少 RAM 可用。我的服务器有大约 3.8GB 的 RAM 可供 Apache 使用。所以我将 3800 MB 除以 40 MB,得到 95。所以我将 MaxClients 设置为 95。到目前为止,我还没有看到 apache 在我的服务器上失控,因为我已经实现了这些更改。当它是 150 时,它每 8 小时左右崩溃一次,当它在 250 时它每半小时就下降一次。
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 95
MaxRequestsPerChild 100
</IfModule>
按照其他人的建议,我尝试将输出缓冲从 4K 调高到 128K,但错误并没有太大改善。如果您没有任何正在运行的进程,也请尝试关闭“超时”参数。在我的网络中,处理和交付的时间应该不会超过几秒钟。高(恕我直言)默认值 300 已减少到 15 秒,这也有助于任何停止的实例。
在此之前,我会看到负载接近 130 左右,系统应该没有响应,但其他一切都很好。您的问题可能是您的 Apache mod_php 设置对您的服务器来说过于激进。
希望这会有所帮助!
【讨论】:
尝试增加 php.ini 中的 output_buffering
参考这个问题output_buffering
【讨论】:
1)你能给我们一些代码吗?
2)在php.ini 中增加output_buffering 可以做到这一点,并确保您删除所有不需要的引用。
【讨论】: