正题:java服务,cpu高,内存高,telnet不通排查及分析
主题:java服务,cpu高,内存高,telnet不通排查及分析Thread-23?prio10?tid0x00007f19f022e000?nid0x19a
主题:java服务,cpu高,内存高,telnet不通排查及分析
"Thread-23"?prio=10?tid=0x00007f19f022e000?nid=0x19ac?waiting?for?monitor?entry?[0x00007f19a0958000]?????java.lang.Thread.State:?BLOCKED?(on?object?monitor)??????????at?org.apache.log4j.Category.callAppenders(Category.java:204)??????????-?waiting?to?lock?<0x0000000749823ca8>?(a?org.apache.log4j.spi.RootLogger)??????????at?org.apache.log4j.Category.forcedLog(Category.java:391)??????????at?org.apache.log4j.Category.log(Category.java:856)??????????at?org.slf4j.impl.Log4jLoggerAdapter.error(Log4jLoggerAdapter.java:498)??????????at?com.chinahh.app.user.common.UserInfoData_Sync.setUserInfo(UserInfoData_Sync.java:508)??????????at?com.chinahh.app.user.common.UserInfoData_Sync.writeAsync(UserInfoData_Sync.java:681)??????????at?com.chinahh.app.user.common.UserInfoData_Sync.access$000(UserInfoData_Sync.java:45)??????????at?com.chinahh.app.user.common.UserInfoData_Sync$5.run(UserInfoData_Sync.java:140)??????????at?com.chinahh.app.user.common.UserInfoData_Sync$5.run(UserInfoData_Sync.java:136)??????????at?com.chinahh.util.ThreadProc.dequeueAction(LazyQueue.java:234)??????????at?com.chinahh.util.ThreadProc.run(LazyQueue.java:190)??
?
通过该输出和代码的跟踪,定位到java应用的队列的代码是队列中的对象在等待出列,通过java应用逻辑来反推,对象出列时进行数据库操作,由于 数据库数据量较大,在访问量较大的情况下可能会导致响应变慢。该队列是一个ConcurrentLinkedQueue非阻塞队列,初始容量是6W多,同 时运行5个队列就是30多W个对象在队列中,并且单个对象也比较大,可以想象对内存的占用会相当大。到这里,问题就可以定位了。接下来就是问题的解决,具 体步骤如下:
?
1.增大heap空间。
减轻GC线程的压力,看看是否有效。配置参数如下:
su - java -c "java -Xmx2g -Xms2g -verbose:gc -Xloggc:/var/log/java/test/gc/test_gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -jar /www/run/test-0.0.1-SNAPSHOT.jar nolocalcache & "
?
修改参数后,观察了一段时间发现,内存的使用基本控制住了,稳定在不到12G*20%,大概减少用了600M多的内存,对于我们那苦逼的服务器:12G内存,跑着10个java服务来说,应该说是不小的资源了。CPU的占用也有缩减,但不如内存那么明显,下周再继续跟踪。
2.减小队列的长度。
下周尝试将队列长度从6W缩小到3W,先看看效果。
?
对于telnet 不响应的分析,通过tcpdump查看该端口的请求,发现tcp的请求还一直在过来,但为什么本机telnet 测试报错呢:
telnet: connect to address : Connection timed out
?
是否由于GC太多频繁导致请求不响应,还是由于访问量较大(该服务日访问量峰值是4000多W),导致端口被使用殆尽呢,下周继续跟踪,期待能再有进展。
?