본문 바로가기

인턴

DB 너무 많이 연결됨(connection timed out) - Python,SQLAlchemy, PostgreSQL

반응형

인턴 하던 도중 오류가 났다

파이썬 써버 부하테스트를 하는데 오류가 나왔다.

QueuePool limit of size 20 overflow 30 reached, connection timed out, timeout 30.00

에러 난 이유

Gpt 형님 답변:

SQLAIchemy의 커넥션 풀 관리 문제 때문에 발생한것입니다.

의미: QueuePoll limit of size 20 -> 기본 연결 풀 사이즈가 20개

overflow 30 -> 풀이 꽉 차도 30 개 까지는 해줄게 (임시연결)

최대 50개를 넘어서서 대기하지만 30초가 지났는데 새 연결을 못하면 죽을게

---> session.close()를 빼먹거나, 동시에 너무 많은 요청을 보내거나, 쿼리가 느리게 진행되거나

아마 동시에 너무 많은 요청이 문제였던거 같음

이번에 200명이 동시에 요청보내는 걸로 바꿨는데 그게 문제였던거 같다 (부하테스트)


해결법

engine = create_async_engine(
    DATABASE_URL,
    pool_size=50,       # 기본 연결 수 늘리기
    max_overflow=50,    # 임시 연결 허용치 늘리기
    pool_timeout=60,    # 대기 시간 늘리기
    pool_recycle=3600   # 커넥션 재활용 시간
)

이런 식으로 늘리거나 DB 최적화를 하거나


나의 경우 세션을 물고있는 시간이 길어져서 문제가 된거같다.
지금 현재 Api 플로우는 이렇다!

DB세션 열음 -> 프롬프트 가져옴 -> ai요청(책 제목) -> 네이버 api 요청(책 검증) -> ai 요청(구조화) -> 응답 및 저장-> 세션 닫음

비 효율 적인 구조로 인해 세션을 오래 물고 있어서 문제가 되었던 것이다.
따라서

1단계: DB 데이터 수집 (세션 1 - 즉시 종료)
├── 프롬프트 템플릿 조회
├── 교과목 데이터 조회
├── 기존 아이템 조회 (중복 방지용)
└── 세션 즉시 종료

2단계: 외부 API 호출 (DB 세션 없음)
├── Books: Gemini + 네이버 API
├── Research: Azure OpenAI
└── Subject: Azure OpenAI
(이 단계에서는 DB 커넥션을 전혀 사용하지 않음)

3단계: DB 저장 (세션 2 - 즉시 종료)
├── 새 세션 생성
├── 기존 RECOMMENDATION 아이템 삭제
├── AI 결과 저장
└── 세션 즉시 종료

이런식으로 구조를 변경하였다.

 

✅ 1단계: DB 데이터 수집 (짧은 세션으로 즉시 종료)
_collect_db_data_for_generation: 임시 생성용 DB 데이터 수집
_collect_db_data_for_save: 저장용 DB 데이터 수집
프롬프트 템플릿, 교과목 데이터, 기존 아이템 중복 방지 데이터를 한 번에 조회
세션 사용 시간: 5초 미만
✅ 2단계: 외부 API 호출 (DB 세션 완전 독립)
_process_ai_calls_without_db: 임시 생성용 AI 호출
_process_ai_calls_for_save: 저장용 AI 호출
Gemini, Azure OpenAI, 네이버 API 호출을 병렬 처리
DB 커넥션 사용: 0초 (완전 독립)
✅ 3단계: DB 저장 (별도 짧은 세션)
_save_results_to_db: AI 결과를 DB에 저장
새로운 세션으로 기존 RECOMMENDATION 아이템 삭제 후 새 아이템 저장
세션 사용 시간: 3초 미만
✅ 지원 서비스 개선
BooksRecommendationService: DB 세션 독립적 recommend_books_with_prompts 메서드 추가
DynamicPromptService: DB 세션 없이 사용할 수 있는 *_with_data 메서드들 추가
BooksVerificationService: 이미 DB 세션 독립적으로 구현됨

1단계: DB 데이터 수집 (5초)
2단계: AI 호출 (0초 - DB 세션 없음)
3단계: DB 저장 (3초)
총 세션 사용: 8초 미만 (90% 단축!)


앞으로는 이런 오류 띄우지 마라(동물농장 톤으로)

반응형