Connection Pool

개념

  • DB와 네트워크 연결 시간 단축 -> 처리량 증가
  • DB 접근시 사용되는 커넥션 개수를 일정 수준으로 제한 -> DB 포화 방지 -> 일관된 DB 성능 유지

설정과 성능

  • 올바르게 설정하지 않으면 오히려 성능 문제 유발
  • 설정이 성능에 주는 영향을 알아야함

maximumPoolSize

최대 거넥션 개수

  • 풀이 제공할 수 있는 최대 커넥션 개수 (사용 중 + 유휴)
  • 이 설정에 따라 TPS가 달라짐

계산에 필요한 항목

  • 한 커넥션 당 쿼리 실행 시간
  • 최대(목표) TPS

단순 계산식

  • 최대 TPS = 1개 커넥션의 초당 처리할 수 있는 요청 개수 * 동시 커넥션 개수
  • 동시 커넥션 개수 = 최대 TPS / 1개 커넥션의 초당 처리할 수 있는 요청 개수
  • 동시 커넥션 개수 = 최대 TPS / (1초 / 쿼리 실행 시간)

  • 한 웹 요청이 한 개의 커넥션을 사용한다고 가정
  • 한 웹 요청이 실행하는 쿼리 총 실행 시간이 0.1초
  • 목표는 TPS
    동시에 필요한 커넥션 개수를 단순하게 계산하면
  • 동시 커넥션 개수 = 목표 TPS / (1초 / 쿼리 실행시간) = 100 / (1초 / 0.1초) = 10
  • 즉, 커넥션 풀 최대 개수가 10이고 한 요청에 평균 0.1초 소요되면 100 TPS 처리 가능

고려 사항

  • 평균 이상으로 실행 시간이 튀는 개수나 비율 검토
  • 느린 쿼리르 염두하고 최대 개수를 높여야 함

connectionTimtout

풀에서 커넥션을 구하기 위해 대기하는 시간

풀의 모든 커넥션이 사용중일 때 대기 발생

고려 사항

  • 기본 값이 너무 크면, 순간적인 트래픽 증가서 스리드 풀 기반 WAS는 모든 쓰레드가 대기할 수 있음. 그렇게 되면, 사용자는 응답 없는 상태 지속
  • 기본 값을 0.5 ~ 3초 이내로 설정. 응답 없는 것보다 빨리 에러 화면이라도 보여주는게 나음

maxLifetime

커넥션의 최대 유지 시간

  • 커넥션을 생성한 이후 이 시간이 지나면 커넥션을 닫고 풀에서 제거
  • 제거한 뒤 커넥션을 새로 생성

기본 규칙

  • 네트워크나 DB의 관련 설정 값보다 작은 값 사용
  • 관련 설정 예: 네트워크 장비의 최대 TCP 커넥션 유지 시간.

이 값이 관련 설정보다 크면

  • 이미 유효하지 않은 커넥션이 풀에 남게 됨
  • 풀에서 유효하지 않은 커넥션을 구하는 과정에서 커넥션을 새로 생성
  • 트래픽이 몰리는 시점일 경우 성능 저하 유발

keepaliveTime

커넥션이 살아 있는지 확인하는 주기

  • 유휴 커넥션에 대해 커넥션 확인
  • 유효하지 않은 커넥션은 풀에서 제거
  • 제거한 뒤 커넥션을 새로 생성

기본 규칙

  • 네트워크나 DB의 관련 설정 값보다 작은 값 사용
  • 관련 설정 예: DB의 미활동 커넥션 대기 시간

minimumIdle

풀에 유지할 최소 유휴 커넥션 개수

설정하지 않으면 maximumPoolSize와 동일

기본 규칙

설정하지 않는 것 추천

  • maximumPoolSize와 동일 크기 추천
  • 이 값이 작으면 급격한 트래픽 증가 시, 커넥션을 만들어야 하므로 성능 저하 일으킬 가능성
  • 트래픽이 특정 시점에 급격히 증가 -> 설정하지 말것

설정할 경우

  • 트래픽이 서서히 증가 -> 최소 시점 TPS 기준
  • 트래픽 적은 시간대 DB 자원 사용 줄이기 위함함

idleTimeout

최대 유휴 시간.

사용되지 않고 풀에 머무를 수 있는 시간

  • 풀에서 이 시간동안 머무른 커넥션은 종료하고 풀에서 제거
  • minimumIdle < maximumPoolSize 인 경우에 적용
  • 이 시간이 지났다고 바로 빠지진 않을 수 있음

기본 규칙

  • 트래픽이 빠지는 시간 간격

Reference

프로그래밍 초식: 커넥션풀 설정를 정리한 글입니다.