1. 미들웨어이야기/01. JVM

WAS Hang-up 장애

OSSW(Open Source System SoftWare 2009. 6. 3. 15:43

통상적으로 시스템이 느려지거나 멈추는 현상을 Hang up이라고 한다.
-. Hang up : Server Instance는 실행되고 있으나, 아무런 응답이 없는 상황
-. Slowdown : Server Instance의 response time이 아주 급격히 떨어지는 상태
Hang up이나 slowdown 현상은 대부분이 Network, User Application, WAS(Servlet Engine), JVM, RDBMS 다섯가지 요소 중 하나이상의 병목으로 인해서 발생을 합니다. 이 장에서는 WAS의 Hang up이나 slowdown에 대해서만 설명을 하겠습니다.

1) dead lock
Java는 Multi Threading을 지원합니다. 이 경우 공유 영역을 보호하기 위해서 Synchronized method를 사용합니다.(통상 Locking이라고 합니다.) 두개 이상의 Thread가 서로 Lock을 잡고 기다리는 상태, 서로 Lock이 풀리지 않고 무한정 대기하는 상태를 말합니다. 이러한 문제의 유형은 로드가 많은 경우에만 나타날 수가 있습니다. -. 동기화된 java 클래스가 불필요하게 사용되는 경우 -. 응용 프로그램에 동기화된 Object에 메소드 호출이 포함되어 있는 동기화된 메소드가 있는지 확인해야 합니다.
-. 장기간 실행되는 복잡한 코드 앞뒤에서 동기화가 사용되었는지 확인해야 합니다.
-. 스레드가 사용 가능하지 않는 리소스를 기다리고 있는지 확인해야 합니다.

2) JDBC로 인한 Server Hang
응용 프로그램 또는 JDBC Connection Pool을 사용할 경우 JDBC DeadLock 또는
JEUS인스턴스 Hang 상태를 초래하는 JDBC호출이 발생할 수 있습니다.
JDBC로 인한 Server Hang의 일반적인 경우 -. JDBC 코드에 DriverManager.getConnection()을 사용한 경우
-. DataBase에 대한 SQL 쿼리 결과가 너무 오래걸리는 경우
-. DeadLock으로 인해 모든 thread가 Hang인 경우
-. 느리거나 오버헤드가 발생한 네트워크로 인해 Database 호출이 느리거나 Hang인경우

3) 일반적인 Server Hang
WAS는 다양한 이유로 Server Hang을 발생시킬수가 있습니다. 일반적으로 서버는 리소스 부족으로 인해 Hang이 발생합니다. 리소스가 부족하면 서버가 요청을 처리할 수 없습니다. 예를 들어, 교착 상태(dead lock)나 대량의 요청으로 인해 작업 수행에 사용할 수 있는 실행 스레드(execute thread)가 없을 수 있습니다. 즉, 모든 스레드가 요청을 처리하기 위해 바쁜 상태입니다. 일반적인 Server Hang인 경우
-. 가비지 콜렉션에 너무 많은 시간이 소요되는 경우 -. 스레드가 모두 사용되어 새 작업에 사용할수 있는 스레드가 없는 경우 -. 응용 프로그램 교착상태(DeadLock)
-. 과도한 JSP 컴파일 로드로 인한 Server Hang

JEUS상의 문제 분석 방법
1) JEUS Server log 확인

Server 상태의 정확한 원인을 파악하기 위해서 JEUS Server log 및 access log를 점검합니다.
만약, deadlock이나 server hang 상태는 log가 없겠지만, 어떤 AP를 호출하다가 hang이 걸렸는지 유추할수 있는 자료가 됩니다.

Found one Java-level deadlock:
========================================
"ServiceHandler-140 (ebswas01(219.240.12.12:39785)--(9745))": waiting to lock monitor 0x000b9d60 (object 0xa053bb90, a java.lang.Object), which is held by "jeus.server.session.SessionServerImpl$Timer" "jeus.server.session.SessionServerImpl$Timer": waiting to lock monitor 0x000b9e08 (object 0xa053bb48, a java.util.Hashtable), which is held by "ServiceHandler-140 (ebswas01(219.240.12.12:39785)--(9745))" Java stack information for the threads listed above:
"ServiceHandler-140 (ebswas01(219.240.12.12:39785)--(9745))": at jeus.server.sessionmgr.SessionManagerImpl.dumpBackup(SessionManagerImpl.java:304) - waiting to lock <0xa053bb90> (a java.lang.Object) - locked <0xa053bb48> (a java.util.Hashtable) at jeus.server.sessionmgr.ServiceHandler.dumpBackup(ServiceHandler.java:628) at jeus.server.sessionmgr.ServiceHandler.service(ServiceHandler.java:203) at jeus.server.sessionmgr.ServiceHandler.receivePacket(ServiceHandler.java:74) at jeus.server.sessionmgr.ServiceHandler.run(ServiceHandler.java:136) "jeus.server.session.SessionServerImpl$Timer": at java.util.Hashtable.remove(Hashtable.java:434) - waiting to lock <0xa053bb48> (a java.util.Hashtable) at jeus.server.sessionmgr.SessionManagerImpl.passivateSession(SessionManagerImpl.java:272) - locked <0xa053bb90> (a java.lang.Object) at jeus.server.sessionmgr.SessionServerImpl$Timer.run(SessionServerImpl.java:232)
===================================================

2) webadmin, dbpooladmin check
webadmin을 통하여 현재 상태의 thread를 점검합니다.
>>>>>>>> ebswas02_servlet_engine1 <<<<<<<<
-- Thread State [WebListener6-hth0] --
[WebListener6-hth0-w0][active , rt=23781291 ms, uri=/ebs/jsp/atz/atzAsRequest.jsp]
[WebListener6-hth0-w1][active , rt=11292997 ms, uri=/ebs/jsp/atz/atzAsRequest.jsp]
[WebListener6-hth0-w2][active , rt=44752729 ms, uri=/ebs/jsp/atz/atzAsRequest.jsp]
[WebListener6-hth0-w3][active , rt=9302010 ms, uri=/ebs/jsp/atz/atzAsRequest.jsp]
[total : 4 active : 4 idle : 0 blocked : 0 reconnecting : 0]
-- Thread State [WebListener4-hth0(219.240.13.151:9900)] --
[WebListener4-hth0-w0][active , rt=28484389 ms, uri=/ebs/jsp/atz/atzAsRequest.jsp]
[WebListener4-hth0-w1][active , rt=20362532 ms, uri=/ebs/jsp/atz/atzAsRequest.jsp]
[WebListener4-hth0-w2][active , rt=16424301 ms, uri=/ebs/jsp/atz/atzAsRequest.jsp]
[WebListener4-hth0-w3][active , rt=8131548 ms, uri=/ebs/jsp/atz/atzAsRequest.jsp]
[total : 4 active : 4 idle : 0 blocked : 0 reconnecting : 0]
dbpooladmin을 통하여 현재 상태의 Connection을 점검합니다.
ebswas01_container1>info
===========================================================
id name min max current idle waiting working
===========================================================
1 jdbc/CPDSawv 20 20 20 20 true true
2 jdbc/CPDShpb 5 5 5 5 true true
3 jdbc/CPDSdia 20 20 20 6 true true
4 jdbc/CPDSlms 30 30 30 30 true true
5 jdbc/mailPool 5 5 5 5 true true
6 jdbc/CPDSportal 40 40 40 39 true true
===========================================================