我有一个服务器上运行的apache2。
今天有很多的http请求(但并不罕见),不知何故平均负载超过200(!!!)。 很明显,该网站已closures(无法访问)。
停止Apache将导致负载相对较快的下降,但只要我再次启动,负载在几秒钟内超过100。
奇怪的是,CPU和MEM的工作量是正常的甚至是低的,就好像系统没有“意识到”有很多进程需要处理。
更奇怪的是,突然之间,所有核心的CPU负载突然变为100%:
从那里,负载在几分钟内恢复正常(<1),网站又突然到达。
我实在无法解释自己这种行为。 任何人都可以帮助我在将来防止它?
两个野生猜测:
1)文件根目录是通过NFS或其他networking文件系统,或一个响应缓慢或根本没有的群集文件系统。
2)你的Apache(和PHP脚本或其他)正在等待数据库或其他外部资源。
我的第一个猜测是1),因为一切都很快恢复正常。 如果是这种情况,请检查您的networking或文件服务器。
补充@Janne Pikkarainen先猜,
另外检查错误日志消息,特别是默认的,如果你有几个日志文件在虚拟主机上,关于(internal dummy connection)签名。 细节在这里
在一些apache2版本上,这些信号指示apache内部连接被设置为执行gracefull重载或垃圾收集。 他们发送给所有活着的孩子,并由您的默认虚拟主机(第一个来自apache2 -S)pipe理。 如果你的默认虚拟主机是资源密集的,这个突然的高峰也可能产生这样的坏效果,不仅会造成日志垃圾。
如果你的NFS或者数据库 – 或者任何其他阻塞的东西 – 被这些提示所击中,那么一个简单的解决办法就是拥有一个真正的虚拟默认虚拟主机(虚拟主机)。
prefork MPM是荒谬的不适合高性能生产部署。 启动额外的进程是非常昂贵的,每个进程(线程)可以容易地占用30MB。
相反,考虑使用工作者MPM或者(当运行现代apache时)事件MPM。
在相同的内存占用情况下,可以将线程数减less10倍。
看看你的Apacheconfiguration,并注意以下指令:
这些的默认configuration可能不合适。 这是我的情况,导致Apache在服务器比平常更受打击时使用大量内存。 我的问题是通过降低这些值来解决的。
确保你了解你的Production Apache的configuration – 默认值是用来testing的。