DBCP
DB Connection Pool. DB와의 커넥션 풀을 어플리케이션 단에 미리 만들어두는 것이다. DB와 커넥션을 맺고 끊기 위해 매번 TCP 통신하는 비용을 줄인다.
- mysql 기준으로 성능에 중요한 설정
- max_connections: 클라이언트와 맺을 수 있는 최대 커넥션 수
- connect_timeout: 커넥션을 맺기 위해 기다리는 최대 시간(기본값 10초)
- wait_timeout: inactive 커넥션을 얼마까지 기다린 뒤 close 할지 설정(기본값 28800 - 8시간). 연결을 맺고 다음 쿼리까지 기다리는 최대 시간
- django 기준으로 성능에 중요한 설정
- django는 커넥션 풀을 지원하지 않고, 요청마다 커넥션을 맺고 끊는다.
- CONN_MAX_AGE: 하지만 CONN_MAX_AGE(default: 0)에 값을 주면, 커넥션을 지정한 시간 동안 종료하지 않아 커넥션 풀처럼 재사용이 가능하다.
- 각 스레드는 고유한 커넥션을 갖는다. gunicorn 과 같은 서버를 이용하여 여러 스레드를 서빙하는 경우 그린 스레드(gevent) 조차 고유한 커넥션으로 연결된다.
- 대규모 동시성이 필요한 경우, gunicorn의 worker_connection을 크게 설정한다.
- db의 max_connections 를 더 크게 조정하면서 db의 부하를 살피거나
- 커넥션 풀 라이브러리를 사용하여 불필요한 커넥션을 유지하는 비용을 줄일 수도 있다. 고유한 커넥션을 쓰지 말고 커넥션 풀에서 스레드가 커넥션을 가져다쓰는 방식으로 수정하는 것이다.
- django는 커넥션 풀을 지원하지 않고, 요청마다 커넥션을 맺고 끊는다.
refs
- DBCP (DB connection pool)의 개념부터 설정 방법까지! hikariCP와 MySQL을 예제로 설명합니다! 이거 잘 모르면 힘들.. - YouTube
- Django에서 DB Connection 관리 SH DEVLOG
- Design — Gunicorn 21.2.0 documentation
- Scaling Django+Gevent with LDAP Connection Pooling | by J. Clayton Tallieu | Medium
- (Django) Django에서 Thread를 다룰 때 주의할 점