Skip to content

[Fix] 임베딩 Provider 부하 및 메모리 보호 #216

Description

@Gimini-3

문제

현재 문서 Embedding은 실제 PDF 실측으로 batch-size와 read-timeout을 조정했지만, 모델 실행 경계에 전역 동시성 제한과 bounded queue가 없다. 여러 Worker 또는 검색 요청이 동시에 BGE Provider에 유입되면 같은 모델 프로세스에서 계산이 중첩되어 Peak RSS 증가, OOM, 긴 대기 후 timeout이 발생할 수 있다.

고정 batch-size는 청크별 문자·토큰 편차도 반영하지 못한다.

작업 범위

  • 문서 청크의 문자 수와 저장된 token count를 함께 사용하는 adaptive batch
  • Provider 모델 실행 semaphore 기본값 1
  • 실행 1건과 대기 1건을 허용하는 bounded queue
  • 대기열 초과 요청의 HTTP 429 빠른 실패
  • Provider 과부하와 연결·응답 장애의 오류 분류 분리
  • 단일·동시·과부하 부하에서 메모리·OOM·응답 지연 검증
  • 실제 PDF v1→v2→v3 검색 가능 버전 전환 회귀 검증
  • 설계 문서와 실측 결과 기록

기본 안전 설정

  • 최대 batch item: 4
  • 최대 batch code points: 4,000
  • 최대 estimated tokens: 900
  • Provider 최대 동시 실행: 1
  • Provider 최대 대기 요청: 1
  • 대기 permit timeout: 15초
  • 문서 read timeout: 기존 30초 유지

완료 기준

  • adaptive batch가 입력 순서와 응답 결합 순서를 보존한다.
  • 실제 모델 encode 최대 동시 실행 수가 1을 넘지 않는다.
  • 대기열이 가득 찬 추가 요청은 timeout 전에 HTTP 429로 거절된다.
  • 실행 예외 후에도 semaphore permit이 반환된다.
  • 실제 PDF 반복·동시성 1/2 부하에서 성공률 100%, OOM 0건을 달성한다.
  • 동시성 4 과부하에서 429가 관측되고 Provider가 생존하며 OOM이 발생하지 않는다.
  • Job 성공률, 재시도, 요청 p95/p99, 문서 전체 처리시간, Peak RSS, OOM, 처리량, 최신 검색 버전 전환을 개선 전후로 기록한다.
  • 실행 결과는 docs/test-results/, 설계는 docs/design/에 기록한다.

제외 범위

  • 지수 backoff·jitter·circuit breaker
  • Container restart policy·resource limit
  • Prometheus 지표·운영 경보

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions