DB Connection 누수, OOM의 주범을 찾아라!
by DD
1년 전
조회수 10
MySQL Connector/J 사용 중 OOM(Out Of Memory) 발생으로 인한 서비스 중단 문제 발생
AbandonedConnectionCleanupThread의 단일 스레드 구조와 짧은 max-lifetime 설정으로 인한 Connection 누수 확인
AbandonedConnectionCleanupThread 비활성화 옵션 적용 후 메모리 사용량 감소 및 서비스 안정화 달성
AbandonedConnectionCleanupThread의 작동 원리
AbandonedConnectionCleanupThread는 Connection 종료 시 네트워크 리소스를 해제하는 역할을 담당한다. 구체적으로 PhantomReference를 사용하여 GC가 Connection을 회수하기 전에 리소스를 정리한다. 따라서 메모리 누수 방지에 기여한다.
max-lifetime 설정의 중요성
짧은 max-lifetime 설정은 DB failover에 유리하지만, AbandonedConnectionCleanupThread의 처리 속도를 초과할 수 있다. 반면, 단일 스레드 구조는 병목 현상을 유발하여 Connection 누수를 악화시킨다. 따라서 적절한 설정이 서비스 안정성에 중요하다.
Connection 누수 해결을 위한 실전 가이드
문제 해결을 위해 mysql-connector-j 8.0.22 이상 버전으로 업그레이드하고, AbandonedConnectionCleanupThread를 비활성화한다. 따라서 -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true 옵션을 적용하여 메모리 누수 문제를 해결한다. 결과적으로 OOM 발생 빈도 감소를 기대할 수 있다.