我们的专用服务器上有一个网站,该网站似乎引起了问题。
最近它使我们的专用服务器崩溃了——这非常烦人。它会随机崩溃。托管公司的技术支持团队表示,这是因为内存不足。他们增加了apache的maxclients设置,但没有效果。
所以最后可能发生的事情(我们已经将 mysql 和图像从服务器上移走了)是某处有一个 php 脚本正在使用大量内存。这是一个相当受欢迎的网站,当然不是按照堆栈溢出标准,但它相对受欢迎。
可能在某处存在内存泄漏,或者在某处或某处创建了某种无限循环。
如何查明哪些脚本使用的内存最多?
答案1
那是因为缺乏记忆。他们增加了 apache 的 maxclients 设置
寻找其他服务提供商。
如果您没有足够的内存来服务当前数量的客户端,那么增加客户端数量将使问题变得更糟。
第一件事是检查它是否正确记录 PHP 错误(即将它们写入网络服务器 error_log)。您可以通过简单地访问(故意)写得不好的脚本来测试这一点,例如
<?php
this_fn_does_not_exist();
内存不足错误将写入此错误日志 - 包括当时正在执行的脚本以及失败位置的详细信息。
您还可以添加代码来记录详细信息内存使用情况(例如使用自动前置脚本)而不是等待它失败。通过注册关闭函数来实现这一点是一个好主意。
这应该为您提供一些重构的优先级。
同时,作为一个单独的练习,您应该设置一个 cron 作业来开始记录 httpd 进程的数量和可用内存量,例如
#!/bin/bash
t=`date`
m=`free | grep '+'`
p=`ps aux | grep httpd | wc -l`
echo $t $m $p >> /var/log/webload
然后将结果绘制成图表,以了解在给定的内存量下可以服务多少个客户端(注意,良好的 I/O 性能取决于缓存,然后根据系统上发生的 I/O 情况,您可能想要目标是释放大约 50% 的内存)。
这也将提供一种衡量重构效果的机制。
增加每个 PHP 进程可用的最大内存只需更新 php.ini 文件即可。
请应用 PHP/网络服务器调整的常规流程 - 即检查缓存、压缩工作是否最佳、记录和分析数据库查询。
注意,有时您只需要更多硬件。