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
프로그래밍 초식: 커넥션풀 설정를 정리한 글입니다.