诊断 Apache“繁忙服务器”数量过高的原因

诊断 Apache“繁忙服务器”数量过高的原因

对于这个问题稍微冗长一点,我提前表示歉意。

我们提供 J2EE Web 应用程序的托管和应用程序管理。技术堆栈为 CentOS 5.9 64 位、Apache 2.2.17、Tomcat 5、JBoss 4.2.2。(虚拟)服务器有 6 GB RAM。我们通常在工作时间内看到大约 2500 个并发用户,并且通常环境运行良好(我们甚至曾破解过 3300 个并发用户,而没有任何性能问题)。最近我们遇到了一些短暂的中断,我们不确定根本原因。中断仅持续几分钟 - 足够长的时间从监控软件获取警报电子邮件,验证应用程序是否不可用,打开服务器的终端,并重新启动服务 - 大约 2-3 分钟。

与停电相关的一些信息:

  • 所有服务仍在运行 - 没有发生任何崩溃,也没有生成任何堆转储
  • 浏览器中未出现任何错误消息
  • 尝试访问该网站时,浏览器中什么都无法加载,而且它似乎要花很长时间思考,就像“原地打转”一样
  • 最初重新启动 Apache 恢复了访问;但在 2 小时内发生第 4 次中断后,我们重新启动了 JBoss。这似乎解决了问题。
  • 在停机期间,并发性相当低 - 远低于工作时间内的平均水平

我们分析了日志文件、监控报告、GC 日志等。我们可以肯定地说,在发生中断时,监控软件报告有大量 Apache 繁忙服务器。我不确定什么是繁忙服务器,但在发生中断时,这个值会飙升到 150 到 200 之间。繁忙服务器的平均值约为 5,很少超过 10。我们还可以从 GC 日志中看到,在发生中断时似乎存在内存问题,例如:

4967.376: [Full GC [PSYoungGen: 17576K->0K(656384K)] [PSOldGen: 3131794K->628760K(3145728K)] 3149370K->628760K(3802112K) [PSPermGen: 157485K->157485K(315008K)], 2.6067200 secs]

JVM 选项包括:

JAVA_OPTIONS="${JAVA_OPTIONS} -Xms4096m -Xmx4096m -XX:NewRatio=3 -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=4"
JAVA_OPTIONS="${JAVA_OPTIONS} -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -XX:+DisableExplicitGC -XX:+UseLWPSynchronization"
JAVA_OPTIONS="${JAVA_OPTIONS} -XX:+PrintClassHistogram -XX:+HeapDumpOnOutOfMemoryError -Xloggc:sabagc.log -XX:+PrintGCDetails"

我们认为发生的原因是 Permgen 空间不足,这反过来导致 Tomcat 停止接受请求(来自 Apache,通过 mod_jk)。这导致 Apache 开始排队请求,因此繁忙服务器数量很高。重新启动 Apache 是一个短期修复,因为它实际上并没有解决内存问题。当我们重新启动 JBoss 时,内存被释放了。

根据现有信息,这听起来合理吗?解决方案是增加 XX:PermSize 和 XX:MaxPermSize 的内存吗?

相关内容