TaskManager故障分析解决

1.错误
TaskManager,频繁崩溃。
tomcat崩溃日志,几次基本相似

java.lang.OutOfMemoryError: requested 441240 bytes for Chunk::new. Out of swap space?

blocked线程数达到4000了
老生代95%


catalina.out错误记录有多种:

java.lang.OutOfMemoryError: unable to create new native thread
不能创建线程,怀疑线程过多。

java.lang.NullPointerException: javax/servlet/jsp/SkipPageException
jsp编译成的java文件中
if (!(t instanceof SkipPageException)){这句话;
怀疑目前发现每个工程WEB-INF/lib/下都多出了javaee.jar包,其内容与tomcat的jsp-api.jar部分重复,javaee包应该包含了jsp-api内容,比如SkipPageException等类,javaee也与tomcat的 serverlet-api.jar部分内容重复,可能产生冲突。
这个jar包应该是maven自动加到工程包中的。


jvm启动参数:
-Xms1524m -Xmx1524m -Xloggc:./logs/gc.log -XX:MaxNewSize=1024m -XX:PermSize=512m -XX:MaxPermSize=1024m




2.状况
TaskManager是任务调度服务,其他系统注入任务,TM负责调度给其他系统TaskProcessor运行计算。

一台4G内存的机器,一个tomcat部署4个TM实例,每个TM实例有5个以上tp。

tp每5秒请求一次,每次请求携带20个任务信息,每个任务信息最小大约2K,最大可达1M
jso格式,需要解析处理。,每次请求都要作多次mysql读写。

3.解决过程:
tomcat启动参数增大为
-Xms2024m -Xmx2024m  -Xss1024K -XX: PermSize=1024m -XX:MaxPermSize=1524m
不好用

改为
-Xms3g -Xmx3g -Xmn2g -XX:PermSize=256m -XX:MaxPermSize=256m
效果不大。

观察gc.log,增长很快不释放。

后来发现
com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.

c3p0线程池有关。

将线程数改大,线程释放时间改小(原来3600改为180)

实时观察线程数变小,113左右。

实时观察gc,长的很快,没半分钟GC,由2g左右gc到600多M,
cleanup最少能到100多M

Full GC 的机会很低


看来瓶颈在c3p0线程池太小,久久不能释放,导致连接过多不释放,内存一直占用不释放,出现各种错误。

猜你喜欢

转载自aiou.iteye.com/blog/1408380