본문 바로가기
IBM - old/WAS 문제&해결

Hang 현상 발생(대부분의 Thread 가 createOrWaitForConnection 에서 waiting)

by freeman98 2016. 5. 30.

1. WAS 버전 : WAS ND

2. OS : All

3. Error 발생 시점 : 운영 중에 Hang 현상 발생
                           Connection pool 이 Max 까지 사용되고 있으나 DB 작업은 거의 수행되지 않고 있음(DB 정상)
                           javacore 생성 후 분석해보면 대부분의 Thread 가 createOrWaitForConnection 에서 waiting 중임

4. Error message :
Caused by: com.ibm.websphere.ce.cm.ConnectionWaitTimeoutException: Connection not available, Timed out waiting for 180618
    at java.lang.Throwable.<init>(Throwable.java:67)
    at java.sql.SQLException.<init>(SQLException.java:101)
    at java.sql.SQLException.<init>(SQLException.java:71)
    at com.ibm.websphere.ce.cm.PortableSQLException.<init>(PortableSQLException.java:51)
    at com.ibm.ws.rsadapter.AdapterUtil.toSQLException(AdapterUtil.java:1498)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:685)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:635)


5. 예상 이유 :
 하나의 Thread 에서 concurrent connection 이 두 개 이상 사용되고 DB Connection pool 이 충분하지 않는다면 Deadlock 이
발생할 수 있음. 즉, 100 개의 Thread 가 동시에 수행되어 100 개가 Max 인 Connection pool 을 타이밍상 한번에 사용한다면
해당 개별 Thread 는 connection 을 하나 사용하고 반환하지 않은 채 다른 connection 을 달라고 요구하기 때문에
이미 100 개의 Connection pool 을 다 사용한 상태에서 줄 수 있는 connection 이 없으므로 Thread 모두 hang 상태에 빠집니다.
이후 180초 timeout 에 걸려서 상단과 같은 error 발생


6. 조치 방안 :
 - Connection pool 의 Connection 공유를 제어하기 위하여 globalConnectionTypeOverride 옵션을 shared 에서 unshared 로 변경
 - Connection pool 의 개수를 하단의 공식을 통해서 설정(T 는 Max Thread pool, C 는 thread 당 concurrent connection 개수)
     T * (C - 1) + 1     ->  만약 Thread Max 가 100 이고 2 개의 connection 을 동시에 사용한다면 : 100 * (2 - 1) + 1 = 101

http://pic.dhe.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/tdat_conpoolman.html
http://orebmann.blogspot.kr/2013/06/connection-pool-usage-with-local.html

댓글