[RDS] max_connection 에 대하여 알아보자 (실제 계산 및 고려사항)
개요
AWS에서 제공하는 RDS 인스턴스 경우 유한한 max_connection 설정을 지니고 있으며 이는 DB인스턴스가 지니고 있는 Memory 용량에 비례한다.
만약, DB 내부에서 확인하고자 한다면 Select @@max_connections 쿼리를 통해 현 DB 인스턴스에서 설정된 max_connection 설정에 대하여 확인할 수 있다.
connection이 많이 일어나는 RDS 경우 설계시 max_connection 부분을 고려해야 한다. 임계치를 넘어서게 된다면 Too many Connections 에러를 받게될 것이다. 그렇기에 실서비스 이전에 예측되어지는 connection 산정이 요구되어진다.
이러한 고민을 덜어내기 위해 단순히 max_connection을 높게 설정하면 되지 않을까 하는 생각이 들겠지만 각 Connection 별로 CPU,Memory 들이 할당되어지는 부분이며 더 많은 연결이 이어질 수록 RDS는 더 많은 자원이 요구되어진다. 그렇기에 limit을 너무 높게 잡게 된다면 특정 임계치를 넘어가는 순간 RDS는 제기능을 하지 못할 것이다. (Aurora 경우 최대 16,000 Connection까지 수동으로 설정할 수 있다.)
또한, Performance Schema를 활성화 하는 경우(Performance Insight를 활성화) max_connection 설정에 따라 메모리 사용률도 그에 따라 사용되어지게 된다. 그렇기에 임계치를 높게 산정하게되어지는 경우 OOM 이슈로 이어질 수 있다. (관련 문서)
인스턴스 타입별 이용자가 일일이 계산하는 것을 피하기 위해 AWS 공식문서에서 타입별 max_connection 에 대한 항목이 계산된 결과를 제공해준다.
실제 계산을 통한 검증
그렇다면, 이 수치들이 파라미터 그룹에서 계산된 값과 맞는지 계산해보도록 하자. 계산에 있어 AWS에서 제공하는 공식문서를 참조하였다.
기준은 Auroa-MySQL r5.2xlarge로 정하였으며 해당타입경우 64GiB의 메모리 용량을 지닌다.
Aurora 인스턴스 경우 계산식은 아래와 같이 정의된다.
여기서, DBInstanceClassMemory 경우 byte단위이며 64GB를 byte로 환산하면 68,719,476,736 이다.
이제 파라미터 그룹에 정의된 Max Connection 식에 대입해보자.
여기서 log base는 2이다.(관련링크)
이를 바탕으로 좌항, 우항을 계산하면 다음과 같다.
즉, r5.2xlarge 타입경우 3069.3의 임계치를 지닌다. 이는 명시된 3,000보다 조금 더 높으며 공식문서에는 보수적으로 계산하여 공유되어진 것으로 보인다.
의문점
여기서 한가지 의문이 들었다. max_connection 계산식에서 DBInstanceClassMemory 값은 상수값이며 인스턴스 스펙이 주어지는 한 고정되는 값이다. 그렇다면 어떠한 상황에서 좌항이 더 크고 어떠한 상황에서 우항의 값이 더 큰 상황일지에 대한 의문점이다.
이를 파이썬을 통해 간단히 확인해보자.
파이썬 코드
import math
import numpy as np
divisor1 = 805306368
divisor2 = 8187281408
#메모리 범위 (1 GiB to 256 GiB)
memory_values = np.array([2**30 * i for i in range(1, 257)])
lhs_values = np.log2(memory_values / divisor1) * 45
rhs_values = np.log2(memory_values / divisor2) * 1000
results = lhs_values > rhs_values
# 결과값
for memory, lhs, rhs, result in zip(memory_values, lhs_values, rhs_values, results):
if result == True:
print(f"Memory: {memory / (2**30)} GiB, LHS: {lhs:.2f}, RHS: {rhs:.2f}")
계산 결과
Memory: 1.0 GiB, LHS: 18.68, RHS: -2930.74
Memory: 2.0 GiB, LHS: 63.68, RHS: -1930.74
Memory: 3.0 GiB, LHS: 90.00, RHS: -1345.77
Memory: 4.0 GiB, LHS: 108.68, RHS: -930.74
Memory: 5.0 GiB, LHS: 123.16, RHS: -608.81
Memory: 6.0 GiB, LHS: 135.00, RHS: -345.77
Memory: 7.0 GiB, LHS: 145.01, RHS: -123.38
Memory: 8.0 GiB, LHS: 153.68, RHS: 69.26
결과 고찰
메모리가 1~8GiB 범위까지는 좌항이 더 크며 해당 값을 기준으로 max_connection이 설정되어진다. 이는 t-type과 같이 메모리 용량이 작은 대상에 있어 기본적으로 적용되어지는 값이다. 예를 들면 (t3.small/medium/large) 이다.