AWS에 개발 환경을 구축 하였습니다.

플랫폼 : SpringBoot 3.4.5 (Java 21)

RDS : MariaDB (db.t4g.micro)

EC2 : Amazone Linux 2023 (t3.micro)

 

로컬에서 개발 하다가 배포 시점이 되어 개발환경에 배포 후 아무 생각없이 로컬에서 DBeaver, intelliJ에서 실행하니까 아래와 같은 에러가 떨어집니다.

Error: 1040-08004: Too many connections

 

DB 확인

SHOW VARIABLES LIKE 'max_connections';

 

 

 

맥스 커넥션이 30개 밖에 안됩니다.

AWS RDS에 파라메터 그룹 확인

max_connections 에 지정되어 있는 값은 아래와 같은 수식 입니다.

LEAST({DBInstanceClassMemory/25165760},12000)
 

 

AWS RDS에서 max_connection 값을 DB 인스턴스의 메모리값 기준으로 동적 계산 하는 것으로 추정되며

 

ChetGTP에 의하면

  • DBInstanceClassMemory는 RDS 인스턴스의 총 메모리 용량(byte 단위)
  • 25165760은 고정된 수이며, 1 connection이 사용하는 메모리의 평균값(byte)으로 추정
  • LEAST(a, b)는 a와 b 중 더 작은 값을 반환.

정확한 계산은 아니지만 어쨌든 현재 개발환경의 MariaDB에 할당된 최대 커낵션 수는 30개 입니다.

파라메터 그룹에서 이것을 조금 큰 숫자로 수정해도 되지만, 혹시 모를 비용 폭탄(?) 문제가 우려되고 커넥션 수를 정확히 조절 하는 것이 향후에도 의미가 있을 것 같아서 몇가지 시도 해 보았습니다.

 

 

현재 프로세스 리스트를 확인해 보면

SHOW PROCESSLIST;

222.xxx.xxx.233은 로컬 IP로 DBeaver 에서 접속된 것으로 추정 됩니다. (13개)

172.xxx.xxx.45는 EC2 인스턴스에서 실행한 Springboot 에서 접속된 것으로 추정됩니다. (10개)

 

현재 프로잭트의 Springboot 설정에 찾아 보니 커넥션 관련 설정은

maximumPoolSize=5

이 것은 Springboot 2.x 에서 사용하던 속성값 인데 3.x로 올라가면서 현재는 적용이 안되어 기본 10개의 커넥션이 생성되는 것 같습니다.

 

Springboot 3에 맞게 수정하였습니다.

# maximum-pool-size=5 : 연결 풀에서 최대 5개의 연결만 유지
spring.datasource.hikari.maximum-pool-size=5
# #minimum-idle=2 : 최소 2개의 연결 유지
spring.datasource.hikari.minimum-idle=2
# idle-timeout=60000 : 유휴 연결은 1분 뒤 정리
spring.datasource.hikari.idle-timeout=60000
# max-lifetime=1800000 : 연결은 최대 30분 후 교체
spring.datasource.hikari.max-lifetime=1800000
# connection-timeout=30000 : 연결 요청은 최대 30초까지 대기
spring.datasource.hikari.connection-timeout=30000

 

spring.datasource.kikari.maximum-pool-size 값은 EC2에서는 5개, 로컬에서는 3개만 주었습니다.

 

그리고 쓸데 없이 커넥션을 10개씩 잡고 있는 DBeaver 도 커낵션을 줄일 수 있는지 ChatGPT에게 물어봤습니다.

ChatGPT는 생각보다 구라를 잘 칩니다 ㅎㅎㅎ DBeaver 구버전 기준의 답변인지 모르겠지만 설명이 틀렸습니다.

어쨌든 SQL 에디터 하나마다 커넥션을 하나씩 먹는다고 하는 것 같습니다.

 

환경설정 -> SQL 편집기

  • Open separate connection for each editor : Default -> Naver 수정
  • Connect on editor activation 체크 해제
  • Connect on query execute 체크 유지

 

커넥션 풀 갯수를 조정할 DB 연결의 Edit Connection -> Connection Settion -> Driver properties

중간 쯤에 maxPoolSize, minPoolSize 가 있습니다. (기본 8개)

maxPoolSize=3, minPoolSize=1

 

 

조정 결과 기본 연결된 커넥션 수가 확 줄었습니다.

 

주의!!!

커넥션 풀 수를 줄이는 것은 어플리케이션 속도에 지대한 영향을 미칠 수 있습니다. 운영환경에 적용하기 위해서는 충분한 테스트 한 후 적당한 값을 찾아서 적용해야 합니다.

 

+ Recent posts