본문으로 이동
99%가 모른다는 DB Connection 누수 문제
문서

99%가 모른다는 DB Connection 누수 문제

김동호 컬리 · 컬리 기술 블로그

원문 보기

AI 핵심 요약

MariaDB JDBC 드라이버를 MySQL로 바꾼 뒤 EC2에서 OOM이 반복되자, 팀은 Heap Dump를 분석해 AbandonedConnectionCleanupThread가 보유한 PhantomReference와 Connection 객체가 누적된 것을 확인했습니다. 이 스레드는 ReferenceQueue를 감시하며 버려진 Connection의 네트워크 자원을 정리하지만, 단일 스레드가 한 번에 하나씩 처리해 네트워크 병목이 생길 수 있습니다. HikariCP의 max-lifetime을 50초로 짧게 설정한 탓에 Connection 재생성 속도가 정리 속도를 앞질렀고, mysql-connector-j를 8.0.22 이상으로 올린 뒤 정리 스레드를 비활성화하는 JVM 옵션을 적용했습니다. 적용 후 Heap Dump에서 해당 메모리 점유가 사라졌고, 장애 분석에는 트래픽 지표뿐 아니라 Heap Dump와 객체 참조 관계를 살펴보는 것이 중요하다는 교훈을 얻었습니다.

  • OOM이 발생하면 트래픽 증가만 의심하지 말고 Heap Dump에서 메모리를 점유하는 객체와 참조 경로를 확인하세요.
  • mysql-connector-j의 AbandonedConnectionCleanupThread는 PhantomReference와 ReferenceQueue를 이용해 Connection의 네트워크 자원을 정리합니다.
  • 단일 스레드가 네트워크 자원을 하나씩 정리하므로 Connection 재생성 속도가 처리 속도를 앞서면 참조 객체가 누적될 수 있습니다.
  • Connection의 max-lifetime을 짧게 설정할 때는 장애 조치 요구와 정리 작업의 부하를 함께 고려해야 합니다.
  • mysql-connector-j 8.0.22 이상에서는 -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true 옵션으로 정리 스레드를 비활성화할 수 있습니다.

소개

DB Connection과 Garbage Collector의 관계를 중심으로 mysql-connector-j 사용 시 발생할 수 있는 메모리 누수를 탐지하고 해결한 경험을 공유합니다.

비슷한 학습 자료

문서 박지원

Spark Connect 서버에 세션이 몰리면, 무거운 작업이 다른 사용자까지 느리게 만들고 그 서버가 죽는 순간 모두가 실패합니다. 이 문제들을 어떻게 풀었는지 공유합니다.

데브옵스 · 인프라 클라우드

문서 강민주

토스페이먼츠 정산 플랫폼에서 많은 양의 정산 데이터 처리 과정에서 생긴 지연 이슈를 처리한 방법을 소개해요.

백엔드 데이터베이스 네트워크

문서 호선우

COMMIT, MVCC 그리고 SET AUTOCOMMIT

데이터베이스

문서 박제희

DB에 저장을 했는데, 조회가 안 돼요

백엔드 데이터베이스

문서 김소라

Kafka Connect와 JDBC 커넥터를 이용해 DB 데이터를 쉽게 Kafka로 전송하는 방법과 발생 가능한 문제를 해결하는 방법을 공유합니다.

데이터베이스 데브옵스 · 인프라

컨퍼런스 당근 밋업

DB 서버의 전문 지식을 가지고 있지 않더라도, 빠르게 DB에서 문제가 되는 쿼리 확인 및 원인 분석할 수 있는 도구를 살펴보고, 요즘 Hot한 Claude MCP를 활용하여 데이터베이스 서버 이슈 진단 방법도 같이 확인 하실 수 있어요. 🥕 개발자를 위한 DB 분석 도구와 방법 (이기현) 👉 당근 채용공고 보기: https://about.daangn.com/jobs/

데이터베이스 AI 코딩