Database Connection Storm이란?
오라클 19 데이터베이스 개발 가이드 - 데이터베이스 어플리케이션의 커넥션 전략
개요
웹 어플리케이션에서 데이터베이스를 연결할 때에는 TCP 통신을 기반으로 한 데이터베이스 커넥션을 생성한다. 데이터베이스 세션은 DB에 로그인한 사용자의 현재 상태를 나타내는, DB 인스턴스 메모리에 위치하는 논리적인 존재다. 이 세션은 사용자가 DB에 인증한 시점으로부터 연결을 종료하거나 DB 어플리케이션을 종료하기 전까지 유지된다. 단일 커넥션은 여러 개의 세션을 가질 수 있다.
DB 커넥션에 대해
커넥션 풀은 커넥션에 대한 캐싱이다. 어플리케이션이 데이터베이스 작업을 요청하는 과정을 절차적으로 설명하면 아래와 같다.
- 어플리케이션은 런타임에 커넥션 풀에게 요청한다.
- 커넥션 풀이 요청을 만족시킬 수 있는 커넥션을 가지고 있다면 어플리케이션에게 커넥션을 반환한다.
- 어플리케이션이 해당 커넥션을 사용하여 DB 작업을 하고, 작업이 완료되면 커넥션을 풀에 반환한다.
- 반환횐 커넥션은 이후 다음 커넥션 요청을 받았을 때 재사용가능해진다.
정적 커넥션 풀
정적 커넥션 풀(static connection pool)은 정해진 숫자의 커넥션을 포함하고, 추가적인 요구 사항을 충족시키기 이해 커넥션을 더 생성하지는 못한다. 그렇기 때문에 커넥션 풀이 만약 어플리케이션의 새 커넥션 요청을 만족시킬 수 있는 유휴 상태의 커넥션을 찾지 못한다면 해당 요청은 큐잉되거나, 에러가 반환된다.
동적 커넥션 풀
동적 커넥션 풀(dynamic connection pool)은 커넥션 풀이 새 커넥션을 생성하고, 어플리케이션에게 돌려주는 형태를 띈다. 이론적으로는 동적 커넥션 풀을 통한다면 커넥션 풀 안에 있는 커넥션의 개수를 늘리거나 줄여서 운영 과정에 있어서 불필요한 리소스 낭비를 줄일 수 있다. 하지만 동적 커넥션 풀 전략은 connection storm이나 over subscription 문제를 일으킬 가능성이 있다.
Connection storm
커넥션 스톰은 데이터베이스가 어플리케이션의 커넥션 요청 증가에 따른 경쟁 상태에 빠져 데이터베이스 서버 CPU가 늘어난 요청들을 즉시 스케쥴링할 수 없기 때문에 어플리케이션이 더 많은 커넥션을 요청하는 상태를 의미한다.
커넥션 스톰 동안에는 데이터베이스 커넥션 개수가 1분도 안되는 순간에 백개에서 천개까지 늘어날 수 있다.
동적 커넥션 풀은 이런 커넥션 스톰 문제에 취약하다. 커넥션 요청이 증가함에 따라 DB 서버는 CPU 코어 개수와 비교하였을 때 더 많은 요청을 핸들링해야 한다. 32코어의 CPU를 가진 DB 서버라면 동시에 32개의 프로세스만 한번에 동작할 수 있다.
데이터베이스 내부적으로는 활성화된 DB 세션 개수가 증가함에 따라 대기 상태의 작업이 증가한다. 오라클 데이터베이스에서는 ASH나 AWR 리포트를 통해 대기 중인 작업 (액티비티)를 확인할 수 있다.
예방하려면?
커넥션 스톰을 예방하려면 정적 커넥션 풀을 사용해야 한다.
동적 커넥션 풀은 시스템을 빠르게 불안정하게 만들기 때문에 오라클에서는 정적 커넥션 풀을 쓰라고 권고한다.
커넥션 개수를 줄인다면 CPU에 가해지는 부하를 줄이는 것이고, 이는 결국 더 빠른 반응 시간과 throughput을 증가하게 해준다.
- 적은 개수의 DB 세션은 DB 내부의 경쟁 관련 대기 중인 이벤트 수가 적다는 것을 의미한다. 커넥션 개수를 줄인다면 CPU가 latch와 경쟁 상태를 조정하는데 사용되지 않고 DB 트랜잭션을 처리하는데 더 많은 시간을 사용할 수 있기 때문이다.
- 커넥션 개수가 줄어든다면 커넥션은 더 오랜 기간 CPU에 의해 스케쥴링될 수 있다. 결과적으로 이 일련의 과정에 연관된 모든 메모리 페이지가 CPU 캐시에 머물게 되고 스케쥴링에 있어서 엄청나게 효율적이게 될 뿐만 아니라 메모리 스톨을 줄인다.