运行轻负载 Apache HTTPD 2.0 的应用程序偶尔会出现问题,其中一个(或多个?)Apache 进程占用了 100% 的 CPU。我们目前运行的是 HTTPD 2.2,我可能在 2.2 中也看到过这种情况。我不确定。在某些情况下,CPU 使用率很高,以至于阻止了对托管 HTTPD 的 Windows 服务器的所有访问,但允许控制台访问。我一直无法找到导致 Apache 出现这种情况的原因。
该环境是 Apache HTTPD 直接提供静态内容,使用 mod_rewrite,但没有太多其他自定义配置。HTTPD 通过 (1.2.25) 与 Apache Tomcat (5.x) 通信mod_jk
。
还有人遇到过这个问题并解决了吗?我们安装的解决方法是使用以下配置将每个 Apache HTTPD 子进程限制为最大请求数:
MaxRequestsPerChild 1000
因为应用程序使用 HTTP/1.1,所以每个子进程实际上有超过 1000 个请求,甚至每个子进程有 100,000 个请求。
答案1
最有可能的是,锁定发生在模块中,而不是 Apache 本身。您的设置听起来非常简单,所以我怀疑mod_jk
是罪魁祸首。如果限制MaxRequestsPerChild
可以解决问题,那么我会说这是一个可以接受的解决方法。模块中的错误可能仅在很长时间或许多请求后才会触发,除非您真的很想追踪这个问题,否则让它消失可能就足够了。
如果您想追踪它,那么要做的第一件事就是配置CoreDumpDirectory
指向服务器用户可以写入的某个位置。如果您可以让有问题的进程留下一个核心文件,那么它应该可以帮助您追踪问题的原因。您可以在以下位置找到一些提示Apache 调试指南。
答案2
我看到这种情况的原因是:- 托管应用程序或脚本导致了问题。例如,它有一个无限循环或类似的东西 - 由于锁定或其他问题,操作系统变得不稳定,重新启动可以暂时解决问题。
我的建议: - 重新启动机器。 - 等待并观察是否再次发生这种情况 - 重新启动没有模块的服务器等。 - 开始逐个打开每个模块并每次观察使用情况。
答案3
限制 MaxRequestsPerChild 将有助于减少内存使用,但不会像您所说的那样影响 CPU。可能发生的情况是您的 mod_jk 崩溃了,而且由于它是一个 apache 模块,因此它会出现在 httpd 进程下。
答案4
为 apache 安装 mod_proctitle