websphere应用挂起原因及解决方法
现象:
当登陆用户达到比较高的并发数量的时候,应用服务器的JVM使用的内存逐渐上升,最终达到了允许的最大值,同时应用服务器的CPU占用率达到了100%,不再响应页面访问请求。
分析:
[11-10-14 10:55:41:172 CST] 4a0e4513 ThreadMonitor W WSVR0605W: 线程“Servlet.Engine.Transports : 11”(75d80516)已活动了 602,719 毫秒,可能被挂起。服务器中可能被挂起总计 7 个线程。
[11-10-14 10:55:41:297 CST] 4a0e4513 ThreadMonitor W WSVR0605W: 线程“Servlet.Engine.Transports : 9”(619b8510)已活动了 601,297 毫秒,可能被挂起。服务器中可能被挂起总计 8 个线程。
[11-10-14 10:55:41:297 CST] 4a0e4513 ThreadMonitor W WSVR0605W: 线程“Servlet.Engine.Transports : 10”(7531c516)已活动了 615,484 毫秒,可能被挂起。服务器中可能被挂起总计 9 个线程。
[11-10-14 10:55:42:141 CST] 4a0e4513 ThreadMonitor W WSVR0605W: 线程“Servlet.Engine.Transports : 7”(66e64512)已活动了 730,406 毫秒,可能被挂起。服务器中可能被挂起总计 10 个线程。
通过以上可以看出JVM内存已满,线程被挂起。
随着应用程序同时操作的用户增多,JVM内存占用逐渐增高,垃圾收集器的内存收集跟不上内存增长的速度,最后导致内存耗尽,应用服务器不再响应。
分析可能原因:
1、数据库连接池设置失误
当前生产机器数据库连接池最大允许连接数,如果连接数设置过小,或者数据库查询非常耗时,那么就会立刻导致数据库连接不够用,那么后续的访问请求就会统统挂起等待空闲的数据库连接池。由于当前软件系统是在EJB里面访问数据库,那么一旦登陆系统的用户达到很高的数量,那些访问数据库的EJB线程统统被挂起等待,并且这些EJB的全局容器事务也被统统挂起等待,而调用这些EJB的Servlet线程也统统挂起等待。其结果就是,一旦并发访问的用户数量比较多的时候,数据库连接池就满了,接下来所有的Servlet线程,EJB容器事务,EJB实例统统挂起,最后导致JVM内存溢出,系统宕机。数据库连接池设置数量过小,是导致性能故障最重要的原因
解决方法:
1、看一下连接数是多少,在应用服务器上面修改数据库连接池最大数量为100或者更多,当然也不能是无限大。
2、检查一下是否有大数据量报表或运算比较耗时的报表,如果这种报表并发比较大,响应的时间会比较慢,也有可能是导致服务挂起的原因
3、检查一下数据源连接情况,重点检查有没有连接不释放的情况或者有无不合理的查询语句。
4、出现CPU利用率100%,线程挂起,一般不是内存的问题,程序中很可能存在死线程。典型的就是程序中的死循环导致线程一直存在。