Apache 进程和 CPU 负载异常

Apache 进程和 CPU 负载异常

在过去的几个小时里,我一直在尝试与我的服务器斗争,以使其在一些相当小的负载(50 个并发用户)下保持正常运行。

規格:

6 CPUs
12GB RAM

在此期间,内存使用量最大为 4GB,因此没有问题。

然而,Apache 变得疯狂,启动了超过 20 个正在运行的进程,占用了所有 6 个 CPU(600% 的 CPU 使用率),导致网站陷入瘫痪。

现在,在流量和并发用户完全相同的情况下,CPU 使用率从可用的 600% 下降到 40% - 没有任何变化。

我实在无法理解为什么 Apache 认为有必要启动 20 多个运行进程,而同时对于相同的流量只使用 1 个或 2 个进程。

我如何诊断这些 Apache 进程实际上在做什么?我知道可以通过 MaxClients 来限制这一点,但当服务器试图创建 20+ 个进程时,这仍然会成为瓶颈。

答案1

采用结构化和有条理的方法比四处乱窜要好得多。

我个人认为科学的方法(其他人称之为有些不同) 是系统管理工具包中诊断问题时可以使用的一个非常好的工具。

  1. 您真正想要解决的问题是什么?

在过去的几个小时里,我一直在努力与我的服务器抗争,让它在一些相当小的负载(50 个并发用户)下保持运行。1

  1. 现在我们知道了要解决的实际问题,我们有了一些方向。让我们收集一些信息来帮助我们找到解决方案。

    • 问题是否与时间有关?它是定期发生还是随机发生。
    • 检查您的日志,检查所有日志,而不仅仅是特定服务的日志,因为其他原因可能会导致问题。日志条目通常有时间戳,这是为了帮助您关联多个应用程序和服务之间的事件 - 使用它们。如有必要,也可以增加日志详细程度。
    • 观察你的系统在做什么。使用 top、vmstat、iostat、sar、ps、tcpdump apache mod_status 等工具,甚至使用完整工具监控系统

  2. 分析您收集到的信息。当问题明显时,系统上实际发生了什么?系统资源的状态如何?

  3. 采取适当的措施进行补救。希望您能清楚地知道发生了什么,内存不足,OOM 杀手开始发挥作用,您的交换活动太高,您的运行队列太长,您受到 iobound 等。如果情况不明显,那么您可能没有收集正确的数据 - 您知道该怎么做,请返回 2。

  4. 监控4.处引入的变更。

  5. 这些变化解决了问题吗?是好转了吗?还是恶化了?没有区别吗?接下来该怎么做取决于你发现了什么。你可能需要回到 2. 并收集更多相关数据,或者 3. 重新分析你拥有的数据,或者 4. 因为你已经确定了许多潜在的解决方案。

  6. 记录您的发现和所做的更改。

  7. 回到床上 / 下班回家 / 去酒吧。

1这可能是任何事情,例如‘我的服务器很慢’,‘我的服务器使用了太多内存’...

答案2

这可能不是一个完整的答案,但我希望提出的建议在完整的帖子中而不是评论中更具可读性。

我将启用由 以及/server-status实现的处理程序,然后定期查看页面以查看 Apache 正在做什么、正在处理多少请求以及它们运行了多长时间。甚至可能使用循环 shell 脚本记录它。mod_statusExtendedStatus on/server-status

我还会添加%D到您的访问日志格式中,以便您可以发布处理日志来查看哪些请求需要花费时间(如果有)。

希望这可以为您提供一些线索,让您知道应用程序的哪个部分占用了所有的 CPU 时间。

如果您正在使用 mod_(php/python/perl) 等,那么几乎肯定是这些代码使 CPU 繁忙,而 apache 本身通常只有在静态请求数量非常多时才会这样做。

相关内容