[SGLang] Mamba 캐시 누수 수정: adder 실패 시 pool index 회수
PR 링크: sgl-project/sglang#21404 상태: Merged | 변경: +7 / -0
들어가며
Mamba 기반 모델(Jamba, Qwen3.5 등)은 SSM state를 위한 전용 메모리 풀(mamba_pool)을 사용한다. 스케줄러가 새 요청을 prefill 배치에 추가할 때 mamba_pool_idx가 할당되는데, 배치가 가득 차거나 메모리 부족으로 요청 추가가 실패하면 이미 할당된 pool index가 해제되지 않는 버그가 있었다.
핵심 코드 분석
Before:
# adder가 요청 추가를 시도하고 실패하면
# break로 루프를 빠져나가지만, 이미 할당된
# req.mamba_pool_idx는 해제되지 않음
break
After:
# 요청이 실제로 can_run_list에 추가되었는지 확인
added = len(adder.can_run_list) > 0 and req is adder.can_run_list[-1]
if not added and req.mamba_pool_idx is not None:
self.tree_cache.req_to_token_pool.mamba_pool.free(
req.mamba_pool_idx.unsqueeze(-1)
)
req.mamba_pool_idx = None
break
왜 이게 좋은가
- Silent memory leak 수정: 요청이 실패할 때마다 SSM state 슬롯이 하나씩 누수되어, 장시간 운영 시
max-mamba-cache-size에 도달하면 모든 Mamba 요청이 거부된다. - 최소 변경: 7줄 추가만으로 문제를 정확히 해결한다.
adder.can_run_list의 마지막 요소가 현재 요청인지 확인하는 단순한 로직이다. - 방어적 프로그래밍:
mamba_pool_idx is not None체크로 Mamba가 아닌 모델에서는 아무 영향이 없다.
정리
리소스 할당과 해제의 비대칭은 서버 애플리케이션에서 가장 흔한 메모리 누수 패턴이다. 이 PR은 "할당했으면 실패 경로에서 반드시 해제"라는 원칙을 7줄로 구현한 깔끔한 수정이다.
참고 자료
이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 코드 분석과 해석에서 오류가 있을 수 있으니, 정확한 내용은 원본 PR을 참고해주세요.
관련 포스트
PR Analysis 의 다른글
- 이전글 [sglang] 미사용 BatchMultimodalOutput/DecodeReq 제거로 코드베이스 정리
- 현재글 : [SGLang] Mamba 캐시 누수 수정: adder 실패 시 pool index 회수
- 다음글 [sglang] Dumper 디버그 유틸리티 리팩토링: 설정 구조 개선과 Non-intrusive 모드 도입
댓글