변수의 기록
(데이터베이스) 실전에서의 DBCP 설정 최적화: 병목 분석까지 본문
실전에서의 DBCP 설정 최적화: HikariCP 튜닝부터 병목 분석까지
1. 개요: DBCP란 무엇인가?
DBCP(Database Connection Pooling)는 DB 연결(Connection)을 매번 생성·종료하지 않고 재사용하도록 설계된 구조이다. Java/Spring 환경에서는 HikariCP가 가장 널리 사용되는 DBCP 구현체다.
- 매 요청마다 TCP 3-way/4-way handshake를 반복하는 것은 불필요한 I/O 및 컨텍스트 스위칭 비용을 유발한다.
- 따라서 HikariCP 같은 커넥션 풀을 사용하면 성능 최적화 및 리소스 안정성 확보에 유리하다.
2. HikariCP 핵심 설정
✅ maxLifetime
- 커넥션 객체의 최대 수명 (ms 단위)
- 유휴 상태일 경우 바로 제거되고, 사용 중일 경우 반환된 후 제거
- DB 서버의 connection timeout보다 몇 초 짧게 설정해야 함
(예: DB wait_timeout=300s → HikariCP maxLifetime=270000ms)
✅ connectionTimeout
- 커넥션을 가져오기 위해 풀에서 기다리는 최대 시간
- 지정 시간 내 사용 가능한 커넥션이 없으면 예외 발생
- 대개 3~10초 수준으로 설정하며, RPS가 높아질수록 이 값을 줄이고 풀 크기를 확장하는 방향으로 조정
3. 커넥션 풀 크기 결정 절차: 실전 접근
✅ 1단계: 모니터링 환경 구축
- APM 도구: Pinpoint, New Relic, Datadog
- 주요 지표: RPS(Requests per second), ART(Average Response Time), Active Threads, Active DB Connections
✅ 2단계: 부하 테스트 진행
- 도구: nGrinder, JMeter, Gatling 등
- 목적: 동시 접속, 요청 수 증가에 따른 병목 탐지
✅ 3단계: 지표 분석
- RPS 증가에 따라 ART도 상승하면 병목 의심
- 병목 지점이 WAS인지, DB인지 판단 필요
✅ 4단계: 커넥션 풀/DB 병목 구분
시나리오 | 의미 | 조치 |
Active Thread 수 < Pool Size | DB 대기 없음 | 문제 없음 |
Active Thread 수 = Pool Size | 커넥션 부족 | maximumPoolSize 증가 고려 |
Pool Size < RPS 대비 부족 | 커넥션 경합 발생 | 백엔드 서버 증설 또는 DB 튜닝 필요 |
4. 커넥션 풀 크기 설계 전략
❗️커넥션 풀은 많다고 좋은 게 아니다
- 커넥션 수가 많아지면 DB의 max_connections 리소스 한계에 부딪히고,
- 동시에 쿼리 처리 성능이 낮아져 DB 병목을 유발할 수 있다
설계 가이드라인
1. 리소스 사용률 확인.
2. 어느 구간에서 병목인지 확인 (WAS,DB)
위 상황에서 DB에서 오버헤드가 크다면 DB 쪽에서 시스템 확충 필요
1. secondary (select쿼리가 많다)
2.cache layer (db가 직접적인 부하를 받는거를 방)
3.sharding
* DB 관련 서버 확충에 대해서는 나중에 다른 글로 더 깊게 정리할 예
3. WAS , DB에 대한 리소스 사용률에는 큰 이슈 없으나 RPS,ART에서 병목이 모니터리 될때
*thread per request 모델이라면 activeThread 수 확인
원인1. (was poolsize)
1. WAS maximumpoolsize가 5이고 , acive Therad도 5라면 maximumpoolsize 가 부족한 것을 의심할 필요 있다.
원인2. (db max_connections)
active Therad가 50/100 으로 maximumpoolsize가 여유가 있는데 병목이 있다면?
1. DBCP의 max_connections 수 확인 필요
2. max_connections 수가 active Thread와 동일하다면 늘려줄 필요 있다
항목 | 예시 |
DB 서버의 max_connections | 60 |
백엔드 서버 수 | 3대 |
HikariCP maximumPoolSize | 15 |
합계 | 15 * 3 = 45 < 60 (적절) |
👉 팁: WAS가 4대가 될 가능성이 있다면?
- 현재: 3대 * 15 = 45
- 예비로 1대 더 확장할 경우 여유 고려하여 60까지 확보 필요
- 또는 동적으로 커넥션 풀을 확장하거나, DB를 수평 확장(Sharding, Replica)
6. 병목 대응 시나리오 정리
병목 위치 | 원인 | 대응 |
WAS | 스레드 수 부족 / 커넥션 부족 | maximumPoolSize 조정, WAS 수 증가 |
DB | 커넥션 경합, 처리 지연 | max_connections 증가, 쿼리 튜닝 |
전체 병목 | 아키텍처적 한계 | Cache Layer, Read Replica, Sharding 등 구조 개선 |
7. 고도화된 대응 전략
✅ DB 성능 향상
- Secondary Read Replica로 읽기 분산
- Redis 등 Cache Layer 도입
- Table 파티셔닝, 인덱싱 튜닝
✅ WAS 확장
- 서버 수 수평 확장
- 부하 분산을 위한 L4 스위칭
🔚 마무리: 설정은 데이터 기반으로
HikariCP 설정은 단순한 수치 조정이 아니라 트래픽, 아키텍처, DB 성능을 고려한 종합적인 조정이 필요하다.
설정 기준:
- maxLifetime < DB wait_timeout
- connectionTimeout: 서비스 SLA에 맞게 설정 (3~10초)
- maximumPoolSize: 요청 패턴 및 WAS 수 고려하여 산정
- Active Thread 수 = Pool Size일 경우 → 병목 발생 중
측정하지 않은 튜닝은 의미가 없다.
데이터 기반 튜닝과 병목 추적이 실전 DBCP 설정의 핵심이다.
사진 출처 - 유튜브 쉬운코드
'CS지식 > 데이터베이스 (Database)' 카테고리의 다른 글
(데이터베이스) B-Tree : 구조, 작동 원리, DB에서의 활용 (0) | 2025.05.31 |
---|---|
(데이터베이스) Redis와 MongoDB의 공통점/차이점, 장단점 비교 (1) | 2025.05.30 |
(데이터베이스) DBCP 왜 쓸까? 안쓰면 뭐가 안좋아질까? + DBCP 관련 정리 (0) | 2025.05.30 |
(데이터베이스) DBCP (Database Connection Pool) 정리 (1) | 2025.05.30 |
(데이터베이스) 파티셔닝(Partitioning),샤딩(Sharding),레플리케이션(Replication) (0) | 2025.05.29 |