我来这里是因为我已经搜索并尝试了不同的优化但没有找到任何答案。
我们有一个服务器托管了四个网站。访问量不是很高(我们确信问题不在于访问量)。
我们采用 LAMP 架构(Centos 6.4、Apache、MySQL 和最新版本的 PHP)。我们还使用 eaccelerator。在最近的服务器上有 16GB DDR3、Intel Xeon E3(4 核 @3.1 GHz)。
Apache 具有基本配置,其中禁用了一些模块,并尝试解决我们的问题。MaxClients = 150 和 MaxRequestsPerChild = 100。
我们的问题是,某些 Apache 进程的重量膨胀到几 GB(我见过一个 12GB 的进程!!!它从 15 分钟前启动)。大多数进程存活的时间越长,它们的 CPU 使用率就越高……然后监控重新启动 Apache……
我不知道问题出在哪里。Apache 日志没有显示任何异常。这个问题在白天和晚上都会发生,而且似乎是随机的。
感谢您的帮助。
答案1
多个运行时可以作为 apache 进程内插件运行,其中 mod_php 是最常见的。
在这种情况下,PHP 使用的任何内存都由 Apache 分配。通常,一旦进程增长到给定大小,它就不会缩小。在 PHP 脚本执行完成后,包含它的 Apache 进程仍然可以保留分配的内存。假设下一个 PHP 页面请求命中不同的apache 进程,您可能会发现 apache 占用的内存比必要的多得多。
我首先要查看的是 PHP 的最大允许内存大小,请记住,该值可以在运行时由 PHP 脚本更改。限制是有原因的;将限制设置为合理的值,请记住,总内存消耗将是正在运行的进程数乘以每个进程的限制。
一个可行的长期解决方案是将 PHP 从 Apache 进程中移除;例如,使用 mod_fcgid 在 fastCGI 下运行。这允许您指定 PHP 进程数量的限制,即降低比 apache 进程数多。由于 apache 不仅用于服务 PHP,因此可能需要比 PHP 更多的进程,因此将两者分开可以让您更有效地利用手头的资源。