진행 중인 프로젝트에서 서버 성능을 향상 시키기위해 커넥션 풀을 늘리는 작업을 진행했다.
관련해 공부한 내용을 정리해봤다.
서버 성능을 향상시킬 때 중요한 지표는 처리량과 응답시간이다.
응답시간이 짧을수록 처리량이 높아질수록 성능이 좋아진다.
처리량을 높이는 방법 중에 커넥션 풀을 늘리는 방법이 있는데 오늘은 이에 대해 포스팅 해보려고한다.
DB connection?
WAS는 http 요청에 따라 쓰레드를 생성해 비즈니스 로직을 수행한다.
이때 비즈니스 로직 수행을 위해 DB 서버로부터 데이터를 얻어와야하는데
DB 접속을 위해 드라이버를 로드한 후 디비 커넥션 객체를 생성해 물리적으로 DB 서버에 접근하게된다.
자바는 주로 jdbc를 활용한다.
connection pool이란?
WAS가 실행될 때 미리 설정된 일정량만큼의 디비 커넥션된 객체들을 만들어 풀에 저장해둔다.
클라이언트 요청이 올 경우 이 디비 커넥션 객체를 빌려주었다가 요청이 완료되면 다시 반납받아 풀에 저장해둔다.
커넥션 풀이 커지면 메모리 소모가 커지지만 동시성이 좋아져 클라이언트 요청의 대기 시간이 감소한다.
왜 미리 DB connection 객체를 준비해둘까?
서버의 부하를 줄일 수 있다.
-> DB 커넥션을 맺는 과정의 부하가 크다. 미리 생성하고 재활용하는 방식을 통해 부하를 줄일 수 있다.
왜 미리 설정한 일정량 만큼만 DB connection 객체를 만들까? 많을수록 좋은 거 아닐까?
-서버는 한정적인 자원이기 때문에 디비 커넥션 수를 제한해야지만 서버 자원 고갈을 방지할 수 있다.
-커넥션을 활용하는 주체는 쓰레드로 커넥션이 많아도 쓰레드의 수가 뒷받침되지 않으면 의미없다.
->활용되는 커넥션이 많다는 의미는 쓰레드를 많이 사용한다는 의미로 이는 곧 context switching이 많이 일어나 오버헤드가 많이 발생한다는 의미이며 성능적인 한계가 존재하게 된다.
connection pool 설정 값
initialSize
:커넥션 풀 생성 시 최소 생성한 connection 객체의 수
minIdle
:최소한으로 유지할 connection 객체 수
maxIdle
:반납된 유휴 connection 유지할 최대 객체 수
maxActive
:동시 사용가능한 최대 connection 객체 수
maxActive>=initialSize
maxIdle>=minIdle 이어야하며
maxIdle = maxActive 이어야 좋다.
적절한 connection pool 크기
Thread Pool 크기 < Connection Pool 크기
적절한 connection 크기 = ((core_count) * 2) + effective_spindle_count)
core_count: 현재 사용하는 서버 환경에서의 CPU 개수
effective_spindle_count: DB 서버가 관리할 수 있는 동시 I/O 요청 수
RDS max_connections 디폴트 값: DBInstanceClassMemory/12582880
=>RDS 서버의 종류에 따라 다르다.
MySQL max_connections 현재 값 확인 명령어
SHOW GLOBAL VARIABLES LIKE 'max_connections';
HikariCP
스프링 부트 2.0부터 default JDBC connection pool
application.properties에서 간단하게 HikariCP의 설정 가능
스프링부트 yml 파일 HikariCP 설정 예시코드
spring:
datasource:
url: 주소주소
username: root
password: Password
hikari:
maximum-pool-size: 100 #최대 pool 크기
minimum-idle: 10 #최소 pool 크기
idle-timeout: 600000 #연결위한 최대 유후 시간
max-lifetime: 1800000 #반납된 커넥션의 최대 수명
참고 사이트
https://aws.amazon.com/ko/premiumsupport/knowledge-center/rds-mysql-max-connections/
https://steady-coding.tistory.com/564
https://programmer93.tistory.com/74
https://juinthyme.tistory.com/70
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=dnjsjd11&logNo=221270990625