You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Q. DB 도 서버와 통신하는 서버라고 이야기했는데요, 그럼 그 연결은 언제 맺고 요청은 언제, 그리고 어떻게 보내게 될까요?
A. 서버가 시작함과 동시에 DBCP 커넥션 풀을 생성한다.
DBCP 란, DB와 연결을 미리 맺어놓고 사용자의 요청마다 재활용하는 방식을 의미한다. 싱글톤으로 구현되어있어 객체 생성 비용, DB 연결 및 닫기 비용이 없다.
JDBC를 통해 DB로 연결할 경우 초기 객체 생성과 연결 및 닫기 비용이 발생할 뿐만아니라 동시 접속 가능 숫자를 넘어버리면 에러를 반환해 서버가 다운될 수 있다. 이를 해결하는 것이 DBCP이다.
스프링 부트 서버를 띄울 때 로그에 보이는 Hikari Pool 이 DBCP 이다.
만약, 사용자의 요청에 의해 DBCP에 있는 인스턴스를 모두 제공했음에도 추가적인 요청이 발생한 경우 어떻게 될까?
요청한 사용자를 대기시키고 인스턴스가 반환될 때까지 기다린다.
Q. 그렇다면 디폴트로 맺어지는 연결의 수는 얼마고, 어떤 수가 적정할까요?
A. 기본적으로 10개의 인스턴스를 보유하고 있고, 서비스 사용자 수와 동시 접속자 수에 따라 적절한 숫자를 설정해야 한다.
이론상 데드락을 피하면서 모든 요청을 처리할 수 있는 시간은 다음과 같다고 한다.
Connection Pool Size = Tn * (Cn -1) +1
Tn : 전체 Thread 개수
Cn : 하나의 요청에서 동시에 필요한 Connection 개수
보통은 하나의 요청에 대해 하나의 커넥션만 사용하도록 구성한다고 생각한다. 그러면 커넥션이 하나만 있어도 충분할까?
요인 1. CPU는 동시에 작업을 수행할 수 없다.
Pool Size 를 늘린다고 해도 CPU는 time slicing 기법으로 아주 빠르게 context switching 하며 작업을 수행하기 때문에 무조건 처리가 빨라지는 것이 아니다. 즉, CPU는 한 번에 하나의 작업을 수행한다.
요인 2. 그러면 하나의 커넥션만 생성할까?
우리는 서비스를 운영하는 것이기 때문에 네트워크와 디스크 성능도 고려해야 한다. 만약 하나의 커넥션만 사용할 때 네트워크 또는 디스크 작업이 있다면 Block 상태에 들어갈 것이다. 이때 커넥션이 하나였다면 CPU는 더 이상 작업을 수행하지 않게 되고 느려질 수 있다. 따라서, CPU 코어 수 보다는 커넥션이 많은 것이 좋다고 생각한다.
Connection Pool Size = (core_count *2) + effective_spindle_count
- core_count: CPU 코어 개수.
- effective_spindle_count: 하드 디스크의 개수. spindle은 DB 서버가 관리할 수 있는 동시 I/O 요청의 개수를 의미한다.
이와 관련된 내용을 참고하되, 여러 실험을 통해 최적의 개수를 찾아내는 것이 더욱 중요하다고 생각한다.
Q. DB 도 서버와 통신하는 서버라고 이야기했는데요, 그럼 그 연결은 언제 맺고 요청은 언제, 그리고 어떻게 보내게 될까요?
A. 서버가 시작함과 동시에 DBCP 커넥션 풀을 생성한다.
DBCP 란, DB와 연결을 미리 맺어놓고 사용자의 요청마다 재활용하는 방식을 의미한다. 싱글톤으로 구현되어있어 객체 생성 비용, DB 연결 및 닫기 비용이 없다.
JDBC를 통해 DB로 연결할 경우 초기 객체 생성과 연결 및 닫기 비용이 발생할 뿐만아니라 동시 접속 가능 숫자를 넘어버리면 에러를 반환해 서버가 다운될 수 있다. 이를 해결하는 것이 DBCP이다.
스프링 부트 서버를 띄울 때 로그에 보이는
Hikari Pool
이 DBCP 이다.만약, 사용자의 요청에 의해 DBCP에 있는 인스턴스를 모두 제공했음에도 추가적인 요청이 발생한 경우 어떻게 될까?
Q. 그렇다면 디폴트로 맺어지는 연결의 수는 얼마고, 어떤 수가 적정할까요?
A. 기본적으로 10개의 인스턴스를 보유하고 있고, 서비스 사용자 수와 동시 접속자 수에 따라 적절한 숫자를 설정해야 한다.
이론상 데드락을 피하면서 모든 요청을 처리할 수 있는 시간은 다음과 같다고 한다.
보통은 하나의 요청에 대해 하나의 커넥션만 사용하도록 구성한다고 생각한다. 그러면 커넥션이 하나만 있어도 충분할까?
요인 1. CPU는 동시에 작업을 수행할 수 없다.
Pool Size 를 늘린다고 해도 CPU는 time slicing 기법으로 아주 빠르게 context switching 하며 작업을 수행하기 때문에 무조건 처리가 빨라지는 것이 아니다. 즉, CPU는 한 번에 하나의 작업을 수행한다.
요인 2. 그러면 하나의 커넥션만 생성할까?
우리는 서비스를 운영하는 것이기 때문에 네트워크와 디스크 성능도 고려해야 한다. 만약 하나의 커넥션만 사용할 때 네트워크 또는 디스크 작업이 있다면 Block 상태에 들어갈 것이다. 이때 커넥션이 하나였다면 CPU는 더 이상 작업을 수행하지 않게 되고 느려질 수 있다. 따라서, CPU 코어 수 보다는 커넥션이 많은 것이 좋다고 생각한다.
결론!
PostgreSQL 이 추천하는 Connection Pool Size 공식
출처 : https://colour-my-memories-blue.tistory.com/15
이와 관련된 내용을 참고하되, 여러 실험을 통해 최적의 개수를 찾아내는 것이 더욱 중요하다고 생각한다.
참고자료
The text was updated successfully, but these errors were encountered: