resin access log导致的锁问题一例

线上遇到的一个case,应用结构是nginx—–>resin—java,其中nginx做lb,resin做为java的容器。在nginx层面做http code的监控,发现有4xx比例高的的报警:

分析nginx日志,发现是由于499比例高导致

xxxxxxxx-[29/Oct/2012:04:10:03+0800]”GET/GetConfiguration.jsp?peer_version=2.3.0.4779&peer_id=E00B3B81B458D7D5A3C2E2BD85865354HTTP/1.0″4990″-“”-“”-“”-“xxxxx:8080″”-“”0.001″xxxxxxxxxx-[29/Oct/2012:04:10:03+0800]”GET/GetConfiguration.jsp?peer_version=2.3.0.4779&peer_id=E00B3B81B458D7D5A3C2E2BD85865354HTTP/1.0″4990”-“”-“”-“”-“”xxxx:8080″”-“”0.000”

499一般是由于后端响应超时造成,但是这里的499响应时间都在毫秒以内,证明不是超时导致,而是后端直接不能响应抛出。对于java应用来说会有两种情况,一是线程锁导致,另一个是堆栈导致。

使用jstack打印出堆栈分析,发现有类似下面的这种线程被锁:

“http-0.0.0.0:8080-65096$1864960835″daemonprio=10tid=0x000000004c169800nid=0x4bf8waitingformonitorentry[0x0000000043e8e000..0x0000000043e8ed10]java.lang.Thread.State:BLOCKED(onobjectmonitor)atcom.caucho.server.log.AccessLog.log(AccessLog.java:345)-waitingtolock<0x00002aaab522a638>(ajava.lang.Object)atcom.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:223)atcom.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:265)atcom.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:273)atcom.caucho.server.port.TcpConnection.run(TcpConnection.java:682)-locked<0x00002aab3a6542f8>(ajava.lang.Object)atcom.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:730)atcom.caucho.util.ThreadPool$Item.run(ThreadPool.java:649)atjava.lang.Thread.run(Thread.java:619)

这其实是一个bug,在resin 3.1.9和3.1.11中日志翻转会遇到access log锁问题,,导致同步锁不能正常释放线程被锁住。

bugid:

?id=3509

?id=4821

解决方法也比较简单:

1.升级resin到4.0.2以上的版本

2.如果不care resin的日志,可以diable掉记录日志的功能

本文出自 “菜光光的博客” 博客,请务必保留此出处

与其在那里苦苦挣扎,碍于面子硬撑,倒不如微笑着面对,

resin access log导致的锁问题一例

相关文章:

你感兴趣的文章:

标签云: