본문 바로가기
꿀팁

HikariCP? maximum-pool-size? minimum-idle?

by zho 2024. 11. 9.

개인 프로젝트를 진행하거나 테스트할 때는 몰랐지만, 이번 교내 프로젝트를 진행하면서 DB connection waiting 문제에 직면했다.

개발을 완료하고 유저테스트를 준비해 진행했다. 교내 같은 과 지인들에게 사용법과 유의사항 등과 함께 서비스를 내놓았다. 처음 사용자가 내가 만든 서비스에 들어와 테스트한다는 게 얼마나 떨리고 신나는 일인지 아마 직접 해본 사람들은 알 것이다. 순탄하게 진행되던 중 10명 정도의 사용자가 들어왔을 때 서버가 엄청나게 느려지더니 접속이 안되기 시작했다. '무슨 일이지?'라는 생각에 급하게 서버 로그를 확인했는데, HikariPool-1 - Connection is not available라는 에러 메시지를 확인했다. 처음 보는 에러 메시지에 당황했지만 빠르게 에러를 찾아봤다.

 

Q. GPT야 HikariCP가 뭐야?

더보기

HikariCP는 빠르고 가벼운 Java 기반 데이터베이스 커넥션 풀(Connection Pool)입니다. 주요 장점은 높은 성능과 낮은 지연 시간으로, 최소한의 리소스를 사용해 더 빠른 데이터베이스 연결을 제공합니다. HikariCP는 데이터베이스 커넥션 풀링에서 발생하는 오버헤드를 줄이고 성능을 최적화하여 높은 처리량을 유지하면서 안정적으로 동작할 수 있도록 설계되었습니다. 주로 Spring Boot와 같은 Java 프레임워크와 함께 사용되며, 다양한 설정을 통해 애플리케이션의 성능을 크게 향상할 수 있습니다.

문제의 원인은 HikariCP의 maximum-pool-size를 설정해주지 않아 기본 값인 10으로 설정이 되어있었던 것이었다. 따라서 application.properties 파일에 아래와 같은 설정을 추가해 줬다.

 

Q. 각 명칭은 어떤 뜻을 의미할까?

 

 

  • spring.datasource.hikari.maximum-pool-size=150
    • 최대 풀 크기: 커넥션 풀에서 유지할 수 있는 최대 커넥션 수를 설정합니다. 이 경우 최대 150개의 데이터베이스 커넥션을 동시에 활성화할 수 있습니다.
  • spring.datasource.hikari.minimum-idle=10
    • 최소 유휴 커넥션 수: 풀에서 유지하려는 최소 유휴 커넥션 수를 지정합니다. 유휴 커넥션 수가 이 값보다 낮아지면 HikariCP가 새로운 커넥션을 생성합니다. 여기서는 최소 10개의 유휴 커넥션을 유지합니다.
  • spring.datasource.hikari.idle-timeout=30000
    • 유휴 타임아웃: 커넥션이 풀에서 유휴 상태로 유지될 수 있는 최대 시간(밀리초)을 설정합니다. 커넥션이 30,000밀리 초(30초) 이상 유휴 상태이면 리소스를 절약하기 위해 닫힐 수 있습니다.
  • spring.datasource.hikari.max-lifetime=1800000
    • 최대 수명: 풀에서 커넥션의 최대 수명(밀리초)을 설정합니다. 1,800,000밀리 초(30분) 후에는 활동 여부와 관계없이 커넥션이 폐기되어 잠재적인 문제를 방지합니다.
  • spring.datasource.hikari.connection-timeout=20000
    • 커넥션 타임아웃: 애플리케이션이 풀에서 커넥션을 얻기 위해 기다릴 수 있는 최대 시간(밀리초)을 지정합니다. 20,000밀리 초(20초) 내에 커넥션을 얻지 못하면 커넥션 획득 실패 예외가 발생합니다.
  • spring.datasource.hikari.leak-detection-threshold=2000
    • 누수 감지 임계값: 누수 감지를 활성화하여 임계값(밀리초)을 설정합니다. 애플리케이션이 커넥션을 2,000밀리 초(2초) 이상 점유하고 반환하지 않으면 HikariCP가 잠재적인 커넥션 누수를 경고합니다.

 

 

 

서버를 실제 배포하고 많은 사용자가 몰릴 때 이러한 문제가 발생한다는 걸 알게 되었고, 해결 방법에 대해서도 알게 되어 좋은 경험이었다. 또한 원래는 connection 개수를 user마다 1개씩만 사용할 것이라고 생각을 했었는데, 각 쿼리마다 connection이 여러 개 사용될 수 있다는 사실을 알게 되었다. 따라서 이를 test 해보며 각 서비스마다의 최적의 값을 설정하는 것이 중요하다고 생각했다. 

728x90