Apache 导致服务器负载过大

Apache 导致服务器负载过大

我的服务器上运行着 apache2。
今天有很多 http 请求(但并不罕见),不知何故平均负载上升到 200 以上(!!!)。显然网站瘫痪了(无法访问)。

在此处输入图片描述

停止 Apache 会导致负载相对较快地下降,但当我再次启动它时,负载在几秒钟内就超过了 100。
奇怪的是,CPU 和 MEM 工作负载正常甚至很低,好像系统没有“意识到”有很多进程需要处理。

更奇怪的是,所有核心的 CPU 负载突然达到 100%: 在此处输入图片描述

从那时起,负载在几分钟内恢复正常(<1)并且网站突然再次可以访问。

我真的无法解释这种行为。有人能帮我防止以后再发生吗?

答案1

两个猜测:

1) 文档根目录通过 NFS 或其他网络文件系统或集群文件系统提供服务,其响应速度很慢甚至没有响应。

2)您的 Apache(和 PHP 脚本或其他)正在等待数据库或其他外部资源。

我的第一个猜测是 1),因为一切都在很短的时间内恢复正常。如果是这种情况,请检查您的网络或文件服务器。

答案2

作为对 @Janne Pikkarainen 第一个猜测的补充,

另外,请检查错误日志消息,特别是默认消息(如果虚拟主机上有多个日志文件),了解有关(internal dummy connection)签名的信息。详情请点击此处

在某些 apache2 版本中,这些信号表明 apache 内部连接设置为强制执行正常重新加载或垃圾收集。它们将发送给所有活动子进程,并由您的默认虚拟主机(apache2 -S 中的第一个虚拟主机)管理。如果您的默认虚拟主机资源密集,则此突然峰值也会产生此类不良影响,而不仅仅是日志垃圾。

如果您的 NFS 或数据库 —— 或任何其他阻塞物 —— 受到这些问题的影响,那么一个简单的解决方法就是拥有一个真正的虚拟默认虚拟主机(“它起作用了”)。

答案3

prefork MPM 完全不适合高性能生产部署。启动额外进程的代价非常高,每个进程(线程)很容易占用 30MB 的空间。

相反,考虑使用 worker MPM 或(运行现代 apache 时)Event MPM。

在内存占用不变的情况下,可以轻易地将线程数增加 10 倍。

答案4

查看您的 Apache 配置,并注意以下指令:

这些的默认配置可能不合适。我的情况就是如此,当服务器受到的攻击比平时更多时,Apache 会使用大量内存。我的问题通过减少这些值得到解决。

确保您了解生产 Apache 的配置 - 默认配置用于测试。

相关内容