运行轻负载 Apache HTTPD 2.0 的应用程序偶尔会遇到一个(或多个?)Apache 进程占用 100% CPU 的问题。我们目前运行的是 HTTPD 2.2,我可能在 2.2 中也看到了这一点。我不确定。在某些情况下,CPU 使用率会阻止对托管 HTTPD 的 Windows 服务器的除控制台访问之外的所有访问。我一直无法找到导致 Apache 这样做的原因。
环境是 Apache HTTPD 直接提供静态内容,使用 mod_rewrite 但没有太多其他自定义配置。HTTPD 通过mod_jk
(1.2.25) 与 Apache Tomcat (5.x) 对话。
有没有其他人遇到过这个并解决了它?我们安装的解决方法是使用以下配置将每个 Apache HTTPD 子进程限制为最大请求数:
MaxRequestsPerChild 1000
其中因为应用程序使用 HTTP/1.1,这实际上是每个子进程 1000 多个请求,更像是每个子进程 100,000 个请求。
锁定很可能发生在模块中,而不是 Apache 本身。您的设置听起来很小,所以我怀疑
mod_jk
是罪魁祸首。如果限制MaxRequestsPerChild
解决了问题,那么我会说这是一个可以接受的解决方法。模块中的错误可能仅在很长时间或多次请求后才触发,除非您真的热衷于追踪此问题,否则将其消除可能就足够了。如果您想跟踪它,那么首先要做的就是配置
CoreDumpDirectory
指向服务器用户可以写入的某个位置。如果您可以让违规过程留下核心文件,那么它应该可以帮助您找到问题的原因。您可以在Apache Debugging Guide中找到有关执行此操作的一些提示。当我看到这个时,这是因为: - 托管应用程序或脚本导致了问题。例如,它有一个无限循环或其他东西 - 由于锁定或其他一些问题,操作系统变得不稳定,重新启动暂时解决了问题。
我的建议: - 重新启动机器。- 等待并查看是否再次发生这种情况 - 重新启动服务器而不使用 mods 等。- 开始一一开启每个模组,每次观察使用情况。
限制 MaxRequestsPerChild 将有助于内存使用,但它不应该像您所说的那样影响 cpu。可能发生的是您的 mod_jk 正在崩溃,并且由于它是一个 apache 模块,因此它显示在 httpd 进程下。
当您有一个不存在的日志目录时,我实际上已经看到这种情况发生。我不确定他们为什么不能更好地处理它,但您可能想确保所有日志目录都在那里并且进程可以写入它们。
为 apache 安装 mod_proctitle
RLimitCPU 并不总是有帮助,因为并非 apache 代码的所有部分都对其进行了检查。
MaxRequestsPerChild 可能也无济于事,因为我在相对“新鲜”的孩子身上看到了这一点。
就我而言,我怀疑这与我们正在使用的模块(mod_perl)有关,也可能与套接字连接断开有关。我们似乎只在浏览器连接时看到这个问题,而不是来自 wget 或 curl(我们大量用于“数据传递”)。
在找出问题的根本原因之前,我也面临着同样的问题......
问题:目前,我的网站在 Windows 云服务器上使用 XAMPP 在 Wordpress 上运行,CPU 使用率达到 100%
解决方案:检查我的 Apache 日志文件(access.log),有人不断尝试访问 xmlrpc.php 文件和每秒 10 个请求,这使得 Apache 服务器忙于处理传入请求,所以在这里我建议你阻止传入从您的 .htaccess 文件访问 xmlrpc.php 文件,也阻止了我的托管服务提供商的 IP,因此 CPU 使用率现在最大为 3-5%。
注意:此解决方案适用于运行 Wordpress 的网站
http://devslounge.com/htaccess/can-cause-apache-httpd-use-100-cpu-indefinitely/
https://wordpress.org/support/topic/xmlrpcphp-attack-on-wordpress-38