提前道歉稍微罗嗦的问题。
我们提供J2EE Web应用程序的托pipe和应用程序pipe理。 技术堆栈是CentOS 5.9 64位,Apache 2.2.17,Tomcat 5,JBoss 4.2.2。 (虚拟)服务器有6 GB RAM。 我们通常在工作时间内看到大约2500个并发用户,并且通常环境运行正常(我们甚至已经破解了3300个并发用户,没有任何性能问题)。 最近我们有一些短暂的中断,我们不确定的根本原因。 中断只能持续几分钟 – 足以从监视软件获取警报电子邮件,validation应用程序不可用,打开服务器的terminal并重新启动服务 – 大约2-3分钟。
有关中断的一些信息:
我们已经分析了日志文件,监控报告,GC日志等等。我们可以肯定的是,在停电的时候,监控软件报告说有一堆Apache Busy Server。 我不确定什么是繁忙的服务器,但在停电的时候,这个值在150到200之间。繁忙服务器的平均值大约是5,很less超过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时,内存被释放了。
根据现有的信息,这听起来似乎合理吗? 是解决scheme来增加XX的内存:PermSize和XX:MaxPermSize?