HikariCP 적절한 커넥션 풀(Connection Pool) Size 설정하기

HikariCP란?

HikariCP의 기본 로고, 빛광

HikariCP는 Java 기반의 데이터베이스 커넥션 풀(DBCP) 라이브러리입니다. 또한 스프링부트에 기본으로 내장되어 있는 JDBC 데이터베이스 커넥션 풀(DBCP) 프레임워크이다.

적절한 DB Connection Pool은 고민하게 된 사연

물리장비로 운영하는 서비스에서, K8S 환경에서 서비스가 구동이 되면서 기존 물리장비의 설정들이 그대로 옮겨 오게 되었다. DB의 경우에는 성능과 안정성이 중요하고 스케일업을 하기 쉽지 않기 때문에, 여전히 물리 장비인 상태로 있었다. 이런 상황에서 서비스는 거의 무한히 확장이 될수 있고, 커넥션의 풀도 유동적으로 늘어나게 되었다. 그로 인해 DB Connection 의 수가 급격히 늘어나, 고갈의 위험이 시작되었습니다.

DB 커넥션이 부족해지면, 커넥션을 맺지 못하고 기다리는 현상이 발생할것이다. 심한 경우엔 타임아웃으로 서비스의 장애로 이어질 수밖에 없다. 그래서 불필요한 커넥션의 수를 줄이는 한편, 적절한 커넥션 풀의 크기(Connection Pool Size)를 유지하고자 적절한 커넥션에 대해서 알아 보게 되었습니다.

커넥션 풀 설정

HikariCP는 효율적인 커넥션 관리를 위한 데이터 베이스 커넥션 풀 라이브러리입니다. 커넥션 풀커넥션 풀(Connection Pool)의 갯수 설정에 대해서는 공식 위키 문서참조한 우아한 기술 문서(aka.배달의 민족)에서 자세한 정보를 확인할 수 있습니다. 하지만, 이 글에서는 제 경험을 바탕으로 간략하게만 전달하고자 합니다.

커넥션 풀커넥션 풀(Connection Pool)의 크기를 설정하는 공식 가이드는 다음과 같습니다.

pool size = Tn x (Cm - 1) + 1

여기서, Tn은 쓰레드의 최대 개수를, Cm은 동시에 사용하는 커넥션의 최대 개수를 나타냅니다. 이 공식을 사용하여 커넥션 풀의 크기를 계산할 수 있다고 합니다.

예를 들어, 특정 작업에서 select와 update를 수행하기 위해 2개의 커넥션을 사용한다고 가정 Tn이 100인 상황이라면, Cm을 2로 설정한다면, 커넥션 풀의 크기를 계산해보면 다음과 같습니다.

Tn = 100
Cm = 2
pool size = 100 * (2 - 1) + 1 = 101

따라서, Deadlock을 방지하기 위해서는 최소 101개의 커넥션 풀이 필요합니다. 우아한 기술문서의 나온 경우에는 Tn의 버퍼를 고려하여 커넥션 풀(Connection Pool)의 size를 151으로 설정하고 있습니다. 제가 관리하는 서비스에는 101보다 작은 사이즈로 운영했을때도 크게 문제가 없었기 때문에, 권장이상의 커넥션 풀(Connection Pool)은 메모리 낭비도 가져올수 있기 때문에 공식 가이드 수준에서도 충분한것 같습니다. 물론 여유가 된다면 커넥션 갯수를 더 크게 잡아도 상관 없겠죠.

결론

데이터 커넥션 풀의 사이즈 설정은 애플리케이션의 특정 작업 및 환경에 따라 다르게 설정되어야 한다. 물론 거거익선은 맞으나, 많은 커넥션(Connection)은 많은 메모리를 사용한다.라는 사실을 인지하면 좋을것 같다. Thread의 최대 개수(Tn)와 동시에 사용하는 커넥션(Connection)의 최대 개수(Cm)를 고려하여 커넥션 풀의 크기를 계산하고, Deadlock을 방지하기 위해 적절한 크기로 설정해야 합니다. 위에서 소개한 공식과 참고 문서들을 통해 자세한 내용을 학습하고, 실제 환경에서 테스트하며 최적의 커넥션 풀(Connection Pool) 크기를 설정하는 것이 좋습니다.

Leave a Comment