我有一个 PHP/MySQL Web 应用程序,每月点击量约为 600,000 次。过去几个月它运行良好,但最近服务器出现 OOM 和崩溃。内存崩溃之间的间隔时间较少,但现在它在过去两天内崩溃了两次。运行时它运行得非常快,我不能让网站如此频繁地宕机。
有谁知道如何解决我的问题,或者对其他可以解决此问题的网络主机有任何建议吗?
我的服务器设置:非托管 VPS(512MB 专用内存)它运行 CentOS、Apache2 和 PHP 5.2。我只运行使用 PHP 和 MySQL 的 Web 应用程序。我常用的应用程序使用 cakePHP。我在这里托管其他网站,但它们的点击量不高。我需要自动备份。
答案1
似乎您遇到了不可预测的峰值,并且 apache 的 MaxClients 指令大于您的服务器可以处理的范围。
如果您使用 mpm_prefork,每个请求将由单独的 apache 子进程处理,并且每个子进程都会消耗内存。
来自 apache 文档:“此 MPM 具有很强的自我调节能力,因此很少需要调整其配置指令。最重要的是MaxClients 足够大以处理您期望接收的尽可能多的同时请求,但足够小以确保所有进程都有足够的物理 RAM。“(http://httpd.apache.org/docs/2.0/mod/prefork.html)
检查每个 apache 进程消耗的内存大小,并尝试调整 MaxClients、MinSpareThreads 和 MaxSpareThreads 指令以适应可用内存。
此外,您可以将 MaxRequestsPerChild 指令设置得较低,这样当您的应用程序导致内存泄漏时,您就避免收到 OOM 错误。不要将其设置得太低。如果这样做,您将遇到 CPU 瓶颈,因为子进程会频繁被终止和创建。
此外,较大的 KeepAliveTimeout 可能会让您的 apache 子进程不必要地忙于处理已经完成的请求。我肯定会在您的 apache 配置中检查这一点。有关 apache keep alive 指令的更多信息,请阅读http://httpd.apache.org/docs/2.0/mod/core.html。
最后,考虑购买更多 RAM。
总而言之,我认为您需要对 Apache 进行调整/微调。现在,不要责怪网络托管公司……