티스토리 뷰

카테고리 없음

Hikari ConnectionPool 튜닝

미니대왕님 2023. 9. 11. 22:35
1. maximum-pool-size :  100개  
2. connection-time out :  30,000  (30초) 
3. max-lifetime :  240,000 (240초) 4분 (커넥션을 생성후 커넥션을 닫고 풀에서 제거한 뒤 커넥션을 새로 생성한다)
4. - keepalive TIME
5. minimum-idle : 10개
6. idle - timeout : 200,000 (200초) 3분 30초
7. validation - timeout = 5,000    (  5초) 


1. maximum-pool-size: Connection Pool에 유지 가능한 최대 커넥션 개수
2.connection-timeout: Pool에서 Connection을 구할 때 대기시간, 대기시간안에 구하지 못하면 Exception
3. max-lifetime: Connection의 최대 유지 가능 시간
4. keepalive TIME : 커넥션이 살아있는지 확인하는 주기
5. minimum-idle: Connection Pool에 유지 가능한 최소 커넥션 개수

6. idle-timeout: Connection이 Poll에서 유휴상태(사용하지 않는 상태)로 남을 수 있는 최대 시간

Hikari ConnectionPool 튜닝

1. 최대 커넥션 개수 - maximumPoolSize

1. ConnectionPool이 제공할 수 있는 최대 커넥션 개수를 말한다.

   이는 사용중인 Connection과 유휴 커넥션을 합친 값을 의미한다.

2. 설정하기 전에 목표 TPS 값이 필요하다.
   단순 계산식으로 아래처럼 계산할 수 있다.

 

[목표  TPS 설정 ] 동시 접속자 2만명, 2초 

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

최대 개수 고려사항

SlowQuery를 잡아야한다. 평균 이상으로 실행 시간이 튀는 개수나 비율 검토.

쿼리 실행시간이 2이 평균인데 , 2초 걸리는 쿼리가 순간적으로 5개가 발생하면?

  • 2초 / 2초 * 5개 : 0.2 TPS

느린 쿼리를 염두하고 최대 개수를 높여야 한다.
물론 부하테스트를 진행하면 조금 더 정확한 값을 얻어낼 수 있다. 


테스트 환경

  • Baremetal 서버 : CPU 40core , Memory 512GB

maxPoolSize = 10 / TPS 368

maxPoolSize = 50 / TPS 336

2. 최대 커넥션 대기시간 - ConnectionTimeOut

 



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

최대 커넥션만큼 사용 중일 때 커넥션을 가져오려고 했을 때 대기하는 시간이다.

기본값은 30초인데 너무 길다.

사용자는 응답없는 상태로 30초를 기다려야한다.

따라서 기본 값 대신에 0.5~3초 이내로 설정하는 것을 권장한다.

응답이 없는 것보다는 빨리 에러 화면이라도 응답해주는게 낫기 때문이다.

3. 커넥션 최대 유지 시간 - maxLifeTime

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

  • 기본 규칙
    • 네트워크나 DB 관련 설정 값보다 작은 값 사용
      ex) 네트워크 장비의 최대 TCP 커넥션 유지 시간

만약, 이 값이 관련 설정보다 크면 이미 유효하지 않은 커넥션이 풀에 남게 된다. 요청이 유효하지 않은 커넥션을 받아오면 유효성 검증과중 중에 커넥션을 새로 생성한다. 트래픽 몰리는 시점일 경우 성능이 저하된다.

예시

DB의 TCP 유지시간이 10분인데 maxLifeTime을 15분으로 주게되면 ConnectionPool에서는 해당 커넥션이 5분동안 유효하지 않은 상태로 살아있게 된다. 해당 Connection을 사용할 때 검사하고 유효하지 않은 경우 커넥션을 생성한다.

4. 커넥션 확인 주기 - keepAliveTime

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

  • Idle 커넥션에 대해 커넥션 확인
  • 유효하지 않은 커넥션 풀에서 제거
  • 제거하 뒤 커넥션을 새로 생성
  • 기본 규칙
    • 네트워크나 DB의 관련 설정값보다 작은 값 사용
      ex) DB의 미활동 커넥션 대기 시간

예를 들어 DB에서 10분동안 안쓰는 커넥션을 끊는다면 그것보다 작은 값을 사용하자.

5. 최소 유휴 커넥션 - minimumIdle

풀에서 유지할 최소 유휴 커넥션 개수
기본값은 maximumPoolSize와 동일하고 HikariCP는 이 값을 바꾸지 않는 것을 권장한다.
용도는 트래픽 적은 시간대 DB 자원 사용을 주링기 위함이다.


1. maximumPoolSize가 10이고 minimumIdle이 5라면 처음에는 5개의 커넥션만 만들어진다.
2. 동시에 요청이 4개가 오면 idleConnection의 개수는 1개가 된다.

minimulIdle은 요청이 없을 경우 유지하는 connection을 말하는 것 같다. 개인적으로 minimumConnection이 더 나은 워딩이라고 생각한다.

6. 최대 유휴 시간 - idelTimeOut

사용되지 않고 풀에 머무를 수 있는 시간
풀에서 이 시간동안 머무른 커넥션은 종료하고 풀에서 제거
minimuIdle을 따로 설정했을 경우에 적용
이 시간이 지났다고 바로 빠지지는 않는다. 문서에서는 15초정도 시간이 걸린다고 한다.

  • 기본 규칙
    • 트래픽이 빠지는 시간 간격

 

 

댓글