본문 바로가기
공부/서버운영관리

[서버운영관리] ajp-nio-0.0.0.0-8009-exec-524 ....parking to wait...

by kyoung-ho 2024. 7. 5.
반응형
"ajp-nio-0.0.0.0-8009-exec-524" #12060 daemon prio=5 os_prio=0 tid=0x00007fc61c166000 nid=0x7a49 waiting on condition [0x00007fc5e3704000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000c1b15ca0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at org.apache.tomcat.dbcp.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:1285)
	at org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:313)
	at org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:233)
	at org.apache.tomcat.dbcp.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:141)
	at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:710)
	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:246)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:461)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:277)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:62)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
	at kipo.cmmn.menu.service.impl.MenuServiceImpl$$EnhancerBySpringCGLIB$$c2300b65.selectMenuInfo(<generated>)
	at kipo.cmmn.menu.service.impl.MenuServiceImpl$$FastClassBySpringCGLIB$$207d9cfe.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
	at kipo.cmmn.menu.service.impl.MenuServiceImpl$$EnhancerBySpringCGLIB$$56b3ef82.selectMenuInfo(<generated>)
	at kipo.cmmn.utl.MenuUtil.getMenuInfo(MenuUtil.java:72)
	at sun.reflect.GeneratedMethodAccessor229.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.el.parser.AstFunction.getValue(AstFunction.java:186)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
	at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:129)
	at org.apache.jsp.WEB_002dINF.jsp.kipo.include.cmmn_jsp._jspx_meth_c_005fset_005f0(cmmn_jsp.java:388)
	at org.apache.jsp.WEB_002dINF.jsp.kipo.include.cmmn_jsp._jspService(cmmn_jsp.java:199)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:200)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:641)
	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:517)
	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:460)
	at org.apache.taglibs.standard.tag.common.core.ImportSupport.acquireString(ImportSupport.java:296)
	at org.apache.taglibs.standard.tag.common.core.ImportSupport.doEndTag(ImportSupport.java:161)
	at org.apache.jsp.code404_jsp._jspx_meth_c_005fimport_005f0(code404_jsp.java:447)
	at org.apache.jsp.code404_jsp._jspService(code404_jsp.java:236)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:200)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:641)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:417)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:347)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:284)
	at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:377)
	at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:237)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:166)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:670)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:165)
	at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:317)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
	at org.apache.coyote.ajp.AjpProcessor.service(AjpProcessor.java:424)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1786)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
	at java.lang.Thread.run(Thread.java:750)

   Locked ownable synchronizers:
	- <0x00000000fbb053f8> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
	- <0x00000000fbd87b48> (a org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker)

 

위의 스레드 덤프는 ajp-nio-0.0.0.0-8009-exec-524 스레드가 WAITING 상태에 있으며, java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject의 await 메소드에서 대기 중임을 나타냅니다. 이는 대기 상태로 진입한 이유와 해결 방법에 대한 분석을 필요로 합니다.

주요 정보 및 분석

  1. 스레드 상태:
    • java.lang.Thread.State: WAITING (parking): 이 스레드는 LockSupport.park 메소드를 통해 대기 상태에 있습니다. 이는 다른 스레드에서 신호를 받을 때까지 대기 중임을 의미합니다.
  2. 대기 원인:
    • parking to wait for <0x00000000c1b15ca0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject): 이 스레드는 특정 조건 객체에서 신호를 기다리고 있습니다.
    • 대기 중인 코드의 흐름은 데이터베이스 커넥션 풀에서 커넥션을 빌려오기 위해 대기 중입니다. 이는 GenericObjectPool.borrowObject 메소드에서 발생합니다.
  3. 문제 원인:
    • 데이터베이스 커넥션 풀 부족: 데이터베이스 커넥션 풀의 모든 커넥션이 사용 중일 때 발생할 수 있습니다. 이는 커넥션 풀이 충분히 크지 않거나, 커넥션이 적절히 반환되지 않아서 발생할 수 있습니다.
    • 트랜잭션 처리 지연: 트랜잭션이 정상적으로 종료되지 않거나, 데이터베이스에서의 긴 쿼리 처리 시간 등으로 인해 커넥션이 반환되지 않을 수 있습니다.

해결 방법

  1. 데이터베이스 커넥션 풀 크기 조정:
    • server.xml 또는 데이터베이스 커넥션 풀 설정 파일에서 커넥션 풀 크기를 증가시켜야 할 수 있습니다.
    • 예를 들어, maxTotal, maxIdle 등의 값을 조정하여 커넥션 풀 크기를 늘립니다.
  2. 쿼리 및 트랜잭션 최적화:
    • 데이터베이스 쿼리 시간을 분석하고, 오래 걸리는 쿼리를 최적화합니다.
    • 트랜잭션 관리 설정을 검토하여 트랜잭션이 적시에 종료되도록 합니다.
  3. 스레드 덤프 분석:
    • 추가로 다른 스레드 덤프를 분석하여 유사한 상태의 스레드가 있는지 확인합니다. 이를 통해 특정 부분에서 병목 현상이 발생하는지 파악할 수 있습니다.
  4. 로그 분석 및 모니터링:
    • 서버 로그를 추가로 분석하여 다른 관련 에러 메시지나 경고 메시지가 있는지 확인합니다.
    • 모니터링 도구를 사용하여 실시간으로 서버 상태를 모니터링하고, 문제 발생 시 신속히 대응할 수 있도록 합니다.
반응형

댓글