프로그래밍 초식 : DB 커넥션 풀 설정

Donghun Seol·2023년 5월 6일
1

프로그래밍 초식

목록 보기
13/13

레퍼런스

DB 커넥션 풀

커넥션 풀의 종류

  • 유휴 커넥션
  • 사용 중 커넥션

커넥션 풀 사용 이유 : 성능

  • DB와 네트워크 연결하는 시간 생략하여 응답속도 향상 및 처리량 증가
  • 커넥션 개수를 일정 수준으로 제한하여 DB 포화를 방지하고, 일관된 DB 성능 유지 가능

풀 설정과 성능

성능향상 때문에 사용하는 커넥션 풀이지만 올바르게 설정하지 않으면 성능 저하 유발
따라서 설정과 성능의 관계를 이해하고 있어야 함

최대 개수 : maximumPoolSize

최대 커넥션 개수 = 사용 중 커넥션 + 유휴 커넥션
한 커넥션 당 쿼리 실행 시간과 목표 TPS를 알면
최대 TPS와 동시 커넥션 개수를 계산 가능하다.

  • 최대 TPS = 커넥션당 요청 처리 개수 X 동시 커넥션 개수
  • 동시 커넥션 개수 = 최대 TPS / 커넥션당 요청 처리 개수

계산 예시

가정

  • 한 웹 요청이 한개의 커넥션 사용
  • 쿼리 총 실행 시간은 0.1초 일 때
  • 목표 TPS는 100

계산

  • 동시 커넥션 개수가 10이면 목표 달성 가능
  • 다시말해서 커넥션 당 TPS가 10이고, 최대 커넥션 개수가 10개면 100TPS 처리 가능

현실적인 계산

평균 이상으로 튀는 개수나 비율 검토해야함.

  • 만약 1초 걸리는 쿼리가 동시에 5개 발생하면?
  • TPS가 100에서 55로 떨어짐
    따라서 느린 쿼리를 염두하고 최대 개수를 높여야 함

커넥션 대기 시간: connection timeout

풀의 모든 커넥션이 사용 중일때, 커넥션을 구하기 위해 대기하는 시간
기본값은 무려 30초. 30초는 너무 길다.(TypeORM 기준으론 10초, 기본 풀사이즈도 10)

  • 대기중 사용자에게 응답없는 상태가 지속된다.
  • 무응답보다 에러메시지라도 빨리 응답하는 것이 좋다.
  • 따라서 0.5 ~ 3초 로 설정하는 것이 바람직

커넥션 최대 유지 시간 : maxLifetime

커넥션을 유지하는 시간이다

  • 생성된 커넥션은 이 시간이 지나면 자동으로 닫히고, 풀에서 제거된다.
  • 제거된 자리에 새로운 커넥션을 생성한다.
  • 네트워크나 DB의 TCP 커넥션 유지 설정보다 작은 값을 사용해야 유효하다.

이 값이 관련 설정보다 크면

  • 이미 유효하지 않은 커넥션이 풀에 존재한다.
  • 커넥션을 획득한 시점에서 커넥션이 유효하지 않음을 발견하면 새로 커넥션을 생성해야 하므로 레이턴시가 증가한다.
  • 마침 트래픽이 몰리는 시점이면 성능저하의 주요한 원인이 된다.

커넥션 확인 주기 : keep alive time

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

  • 유휴 커넥션에 대해 커넥션을 확인한다.
  • 유효하지 않다면 풀에서 제거하고 새로운 커넥션 생성
    기본 규칙
  • 네트워크나 DB의 관련 설정보다 작은 값 사용

최소 유휴 커넥션 : minimumIdle

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

  • 설정하지 않으면 maximumPoolSize와 동일(고정 크기 풀로 설정된다.)
  • Hikari 공식문서 기준으로 설정하지 않는 것을 추천한다.

최대 유휴 시간 : idleTimeout

사용하지 않고 풀에 머무를 수 있는 시간
풀에서 이 시간동안 머무른 커넥션은 종료하고 풀에서 제거된다.

정리

maximumPoolSize : 최대 TPS 고려
connectionTimout: 일반적인 서비스에서 길면 안됨. 무응답 시간이 매우 길어짐
maxLifeTime : 일정 시간만 끝나고 커넥션이 종료되도록 처리
keepaliveTime : 끊길 만한 시간보다 짧은 주기로 검사

profile
I'm going from failure to failure without losing enthusiasm

2개의 댓글

comment-user-thumbnail
2023년 5월 24일


minimumIdle : 추천하지 않고, maximumPoolSize과 동일하게 설정
idleTimeout : 일반적으로는 사용하지 않는 커넥션들을 제거하여 풀의 유효한 커넥션 개수를 줄이는 역할

Summary:
This blog article provides an overview of connection pooling, including the types of connections, the benefits of using a connection pool, how to calculate the maximum TPS and connections, and the settings and performance associated with a pool. Additionally, the article provides examples of calculations and considerations when setting a connection pool, such as connection timeout, keep alive time and idle timeout.

Suggestions to Improve Article:
1. Provide a diagram or simple visual to illustrate the settings

답글 달기
comment-user-thumbnail
2023년 5월 24일


minimumIdle : 유휴 커넥션은 최대 연결수에서 제외하는 것을 추천함
idleTimeout : 풀로 유지하는 커넥션 시간

Summarize:
This blog article written by junior developer discusses the basics of configuring a connection pool when working with databases. It explains the different kinds of connections ( idle connections and active connections), why to use connection pools (to improve response time and increase throughput), and various parameters and settings for connection pools. It emphasizes the importance of correctly setting connection pool parameters as incorrect settings can lead to performance degradation. It also provides an example calculation of the maximum TPS with a given number of queries.

답글 달기