2010년 9월 23일 목요일

아파치 commons-pool 에서의 concurrent bug로 인한 resource leak

삽질방지위원회 및 개발자야근방지 위원회에서 알려드립니다. ㅋ

 

혹시 commons-pool 사용하시는 분들 중에 사이트에서의 DB쿼리가 엄청 많아서 tomcat 의 DBCP설정을 아무리 튜닝해봐도 문제해결이 안되는 분들이 있을겁니다.

load test를 해보면 DB서버의 CPU랑 리소스는 펑펑 놀고 있는데 아무리 동시접속을 늘려봐도 더이상 커넥션 갯수가 올라가지 않는다든지 하는 현상이 발견될텐데요, 혹시 그런 경우 사용하고 있는 commons-pool의 버전이 1.5 / 1.5.1 / 1.5.2 가 아닌지 확인해 보시기 바랍니다.

 

https://issues.apache.org/jira/browse/POOL-149 에서 확인할 수 있듯이 동기화 문제로 인한 resource leak이 발생하는 경우이고, 크리티컬한 환경일수록 자주 나타나게 됩니다.

 

1.5.2 의 소스코드를 보면 아래와 같은 부분이 있는데, 초록색으로 표시한 부분이 이 버그를 픽스할 수 있는 코드로써 임시적으로 추가를 해넣으시면 될 것이고, 그렇지 않다면 이 버그가 해결된 1.5.3 이후의 버전으로 라이브러리를 교체하면 됩니다.

 

if(maxWait > 0 && ((System.currentTimeMillis() - starttime) >= maxWait)) {

   synchronized(this) {

      if (latch.getPair() == null && !latch.mayCreate()) {

         _allocationQueue.remove(latch);

        } else {

         break;

         }

}

   throw new NoSuchElementException("Timeout waiting for idle object");

} else {

   continue;

}

 

그럼 이만.

댓글 없음:

댓글 쓰기

가장 많이 본 글