Today I Learned
날짜
2024년 11월 27일 수요일
내용
DB Connection Pool
QueuePool limit of size 25 overflow 5 reached, connection timed out, timeout 30.00 (Background on this error at: https://sqlalche.me/e/20/3o7r)
왠 처음보는 에러가 자꾸 뜬다. 메시지가 참 심상치 않은데, 주로 뜨는 곳이 웹훅을 처리하는 부분이다. 마침 쇼피파이에서 앱 상태를 확인해보는데, 웹훅 처리율이 너무 낮아 사태가 꽤 심각하다고 느꼈다.
관련 메시지를 찾아보니, 데이터베이스에 연결하는 클라이언트가 동시에 너무 많아서 발생한 문제라고 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
write_engine = create_engine(
SQLALCHEMY_WRITE_DATABASE_URL,
client_encoding="utf8",
pool_pre_ping=True,
)
read_engine = create_engine(
SQLALCHEMY_READ_DATABASE_URL,
client_encoding="utf8",
pool_pre_ping=True,
)
SessionWriteLocal = sessionmaker(
autocommit=False, autoflush=False, bind=write_engine
)
SessionReadLocal = sessionmaker(
autocommit=False, autoflush=False, bind=read_engine
)
서버에서 데이터베이스를 처음 초기화 할때의 코드다. SQLAlchemy 문서를 찾아보니, 기본값으로 설정된 부분이 있다고 한다. pool_size
는 데이터베이스가 동시에 연결할 수 있는 클라이언트 수의 제한을 의미하고 max_overflow
는 pool_size가 넘어갈 경우 최대 허용할 추가 한도를 의미한다. 이게 각각 10,5 로 설정되어 있었고 이 한도를 넘어가서 발생한 문제였다.
이걸 우선 20, 10으로 늘려봤으나 여전히 오류가 발생했다. 아예 넉넉히 늘려야 할 것 같아서 데이터베이스에서 최대 늘릴 수 있는 한도를 알아봤다. 서버 데이터베이스가 있는 AWS RDS에서 관련 값을 찾아봤더니 이렇게 나온다.
저 파라미터 그룹을 클릭해서 max_connections를 검색해보면 알 수 있다.
현재 데이터베이스 인스턴스가 db.t3.medium라서 메모리는 4GB다. 바이트로 변환해서 계산해보면
4GB = 4 * 1024 * 1024 * 1024 = 4294967296 바이트
4294967296 / 9531392 ≈ 450
이 데이터베이스 인스턴스는 최대 450개까지 지원한다고 한다. 현재 30개까지 쓰도록 해놨으니 훨씬 더 늘릴 수 있다. 넉넉히 100,50으로 설정해서 최대 150개 까지 연결할 수 있도록 해놨다. 이래서 해결된다면 더 필요하거나, 이게 원인이 아닐거다.
알파플러스에선 쇼피파이 웹훅이 훨씬 더 많이 발생하는데도 이게 문제가 되지 않았다.
- 데이터베이스 인스턴스가 차이가 있어, 요청 하나를 처리하는데 시간이 더 짧으니 여러 세션이 겹칠 확률이 감소한다.
- 이 서비스에서만 추가된 인스타그램 댓글 웹훅이 워낙 많아 발생하는 문제다.
둘 중 하나가 아닐까 싶다.
실제로 변경하고 4시간 동안은 오류가 전혀 없었다. 표본수가 차이가 나긴 하지만..
하루 뒤에도 깔쌈하게 잘돌아간다!
회고
사람이 많이지니 별일이 다있네!