Skip to content

[BE] DB 커넥션 풀 max‐pool‐size 튜닝 설정 값 및 이유

hiiro edited this page Oct 19, 2023 · 1 revision

maximum-pool-size

  • 10(기본)

배경

스프링 부트 2.0 이후부터 자바 기반 환경에서 사용하는 DB 커넥션 풀 라이브러리인 HikariCP를 기본적으로 사용하고 있습니다. HikariCP는 다른 DB 커넥션 풀 라이브러리들과 비교했을 때 가장 빠른 속도와 성능을 보여주면서도 추가적인 외부 라이브러리 종속성 없이 매우 가볍게 동작하므로 하루스터디 프로젝트에서는 HikariCP를 사용하기로 결정했습니다.

이 때 HikariCP를 더 효율적으로 사용하기 위해서는 애플리케이션 서비스의 특성에 맞춰 max-connection-pool 사이즈를 튜닝해줘야 하는데 근거는 다음과 같습니다.

  • 너무 큰 max-pool-size 를 설정하는 경우
    • 애플리케이션에서 필요로 하는 것보다 더 많은 데이터베이스 연결을 유지하게 되어 메모리와 데이터베이스 리소스를 더 많이 사용하게 됩니다. 이로 인해 불필요한 서버의 리소스 낭비가 발생할 수 있습니다.
    • 또한 DB 서버에서 처리할 수 있는 허용 범위를 넘어가 과부하가 걸릴 수 있습니다.
  • 너무 작은 max-pool-size 를 설정하는 경우
    • 금방 DB 커넥션 풀에 생성되어 있는 커넥션을 모두 사용하게 되고, 추가로 요청이 들어오면 그 요청은 커넥션이 사용 가능해질 때까지 기다려야 합니다.
    • 이로 인해 애플리케이션에서 DB에 접근하여 수행하는 로직에 대한 동시 요청 처리에 제한을 받게 되어 애플리케이션의 응답 시간이 길어질 수 있습니다.

목표

하루스터디 서비스에 목표로 하는 동시 사용자 요청 수를 처리하는데 최적화된 HikariCP max-pool-size 설정값을 탐색하고 튜닝을 진행합니다.

  • 하루스터디 서비스에서 목표로 잡은 동시 사용자 요청 수는 ~~~ DAU 입니다. 목표로 잡은 DAU가 하루스터디 서비스를 사용한다는 가정하에 동시에 요청이 몰릴 수 있는 경우와 트래픽을 예상하고 해당 상황에서 HikariCP max-pool-size 를 휴리스틱하게 튜닝합니다.
  • 튜닝 과정에서 max-pool-size 에 따라 병목현상이 발생하는지 확인하고 하루스터디 서비스의 목표 사용자 동시 요청 처리량을 맞추기 위해 기본 max-pool-size 설정값인 10에서부터 점진적으로 변경하며 진행합니다.

과정

목표 사용자 동시 요청 처리량을 설정하고 부하테스트 진행

  • 하루스터디에서는 비슷한 학습 관련 플랫폼인 인프런을 목표로 잡고 MAU를 설정하고자 했습니다. 조사 결과 인프런의 MAU는 100만 정도였기에 저희 또한 MAU를 동일하게 100만으로, DAU는 33만 정도로 설정했습니다.
  • 이 DAU와 Google Analytics 에서 측정된 데이터를 기반으로 피크 시간대의 하루스터디 서비스 이용자 수를 DAU의 6.62%인 2207명으로 산정했습니다. 또한 하루스터디 실 사용자들의 평균 잔류 시간과 피크 시간 대 분당 사용자 수를 기반으로 대략 240명이라는 VUSER 수를 산정하게 되었습니다.

스터디 동시 진행 기능이 추가되면서 가장 많이 사용하게 될 API는 폴링 API일 것이라고 추정했습니다. 정상 사용자 플로우에서 필히 이를 사용하게 되며 적절히 DB 조회도 포함하며 호출 주기가 3초 정도로 예상되었습니다.

따라서 폴링 API에 대해 목표 VUSER 수치보다 조금 높은 250 정도로 30분 정도 테스트를 진행하고 결과를 확인해 보았습니다.

locust1

locust2

테스트 결과는 다음과 같았습니다. TPS는 83 정도로 측정되었고, 이는 VUSER 250명이 3초에 1번 요청을 보내므로 평균적으로 초당 80 정도의 요청을 송신하는 것으로 해석할 수 있었고 Failure는 없었습니다.

결과적으로 평균 30ms, 하위 5%의 사용자에서는 130ms정도의 응답 시간이 발생하였음을 알 수 있었습니다.

예상보다 트래픽을 잘 받아내 VUSER를 점차 증가시켜 테스트를 진행해보기로 했습니다. VUSER가 1000까진 300ms 내의 요청이 거의 확실시되었고 아래처럼 VUSER 1500 수준의 요청(TPS 500)을 보냈을 때 요청의 처리는 실패 없이 일어나지만 하위 5%에서 200ms 전후에서 요동치는 응답 시간을 보여주었습니다.

locust3

결과적으로 목표했던 응답 속도는 대략 300~500TPS 선에서는 나와주는 것을 확인하였습니다. 예상외로 HikariCP의 기본 max-pool-size 설정값을 사용해도 저희가 목표로 하는 동시 사용자 요청 수를 처리할 수 있음을 확인했습니다.

목표 사용자 동시 요청 처리량을 처리하는데 큰 이상이 없는 이유

  • HikariCP 공식 문서에 따르면, max-pool-size 를 기본 값인 10으로 설정해서 사용하는 경우 6000 TPS 정도의 성능을 낼 수 있다고 합니다.
  • 저희 하루스터디 서비스에서 목표로 잡은 TPS는 기본 max-pool-size 설정값으로도 충분히 감당할 수 있는 처리량이기에 기본 값을 사용하는 것으로 결정했습니다.
Clone this wiki locally