컬리, MySQL 커넥터 변경 후 발생한 DB Connection 누수 및 OOM 문제 해결
핵심 내용
컬리 팀이 MySQL 커넥터 변경 후 발생한 Connection 누수로 인한 OOM 문제를 Heap Dump 분석으로 해결했다.
자세히 보기
컬리 팀은 JDBC Driver를 MariaDB에서 MySQL로 변경한 후 AWS EC2 인스턴스에서 주기적인 Out Of Memory(OOM) 현상과 비정상 종료가 발생했다. 초기에는 트래픽 급증으로 오인되었으나, Heap Dump 분석을 통해 AbandonedConnectionCleanupThread가 메모리를 과도하게 점유하고 있음을 확인했다.
문제 원인 및 분석
메모리 누수의 핵심은 MySQL 커넥터의 AbandonedConnectionCleanupThread에 있었다. 이 스레드는 명시적으로 닫히지 않은 연결의 네트워크 자원을 정리하는 역할을 한다. 컬리 팀은 DB Failover 시 Slave로 빠르게 연결하기 위해 max-lifetime을 기본값(30분)보다 훨씬 짧은 50초로 설정했다.
하지만 이 스레드는 단일 스레드로 동작하며 TCP/IP 소켓 연결 확인 등 네트워크 I/O가 포함된다. 짧은 max-lifetime으로 인해 Connection 생성 속도가 CleanupThread의 처리 속도를 초과하면서, 처리되지 못한 PhantomReference 객체가 connectionFinalizerPhantomRefs에 계속 쌓여 메모리 누수를 유발했다.
해결 방안
컬리 팀은 mysql-connector-j 8.0.22 이상 버전으로 업그레이드한 후, JVM 옵션에 -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true를 추가하여 해당 스레드를 비활성화했다. HikariCP를 사용하는 일반적인 환경에서는 커넥터 풀이 네트워크 자원을 관리하므로 이 스레드의 비활성화가 안전하며, 배포 후 안정적으로 운영되고 있다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.