본문으로 건너뛰기

[sglang] SGLang 캐시 시뮬레이터의 병목 해결: 직렬 전송에서 동시성 전송으로의 최적화

PR 링크: sgl-project/sglang#34088 상태: Merged | 변경: +235 / -73

들어가며

SGLang의 cache-sim ingest tee는 라우터에서 발생하는 요청 데이터를 캐시 시뮬레이터로 전달하는 역할을 합니다. 기존 구현에서는 단일 백그라운드 태스크가 각 POST 요청을 순차적으로(serially) 처리하고 있었습니다. 이로 인해 처리량(throughput)이 1 / POST-latency 수준(약 110 req/s)으로 제한되었고, 트래픽이 몰리는 피크 시간대에는 채널이 가득 차 데이터가 유실(drop)되는 문제가 발생했습니다. 본 PR은 이 병목을 해결하기 위해 동시성 전송(concurrent fan-out) 모델을 도입했습니다.

코드 분석

1. server/cache_sim_tee.rs: 동시성 전송 로직 구현

기존의 run_senderrx.recv()를 통해 받은 메시지를 하나씩 await하며 처리했습니다. 이를 tokio::sync::Semaphore를 사용하여 설정된 동시성(concurrency)만큼 요청을 병렬로 처리하도록 변경했습니다.

Before:

while let Some(msg) = rx.recv().await {
    // ... serial POST processing ...
    let res = client.post(&url).json(&body).send().await;
    // ...
}

After:

let sem = Arc::new(tokio::sync::Semaphore::new(concurrency.max(1)));
while let Some(msg) = rx.recv().await {
    let permit = sem.acquire_owned().await.unwrap();
    let client = client.clone();
    let url = match msg.kind { /* ... */ };
    tokio::spawn(async move {
        let _permit = permit;
        // ... concurrent POST processing ...
    });
}

2. config/cli.rs & config/types.rs: 설정값 추가

사용자가 환경 변수(RADIXARK_CACHE_SIM_SEND_CONCURRENCY)나 CLI 인자를 통해 동시성 수준을 조절할 수 있도록 설정 구조체를 확장했습니다. 기본값은 8로 설정되어 기존 대비 약 8배의 처리량 개선을 기대할 수 있습니다.

왜 이게 좋은가

  1. 처리량 향상: 기존의 직렬 방식은 네트워크 지연 시간(약 9ms)에 직접적인 영향을 받아 초당 처리량이 매우 낮았습니다. 동시성 모델을 도입함으로써 처리량은 N / POST-latency로 확장되어 피크 트래픽을 효과적으로 수용할 수 있게 되었습니다.
  2. 안정성: Semaphore를 사용하여 동시 요청 수를 제한함으로써, 과도한 태스크 생성으로 인한 메모리 고갈을 방지합니다. 또한, 각 POST 요청이 별도의 태스크에서 실행되므로 특정 요청의 실패가 전체 전송 루프를 멈추지 않습니다.
  3. 비차단(Non-blocking) 설계: offer 메서드는 여전히 try_send를 사용하여 메인 서빙 경로에 영향을 주지 않으며, 백그라운드 전송 로직만 동시성을 갖도록 설계되어 성능과 안정성 사이의 균형을 맞췄습니다.

교훈: I/O 바운드 작업에서 단일 태스크의 직렬 처리는 시스템 전체의 병목이 되기 쉽습니다. 적절한 세마포어 기반의 동시성 제어는 시스템의 처리량을 비약적으로 높일 수 있는 강력한 도구입니다.

리뷰 피드백 반영

리뷰 과정에서 기존의 4096 슬롯 채널 용량은 유지하기로 결정했습니다. 이는 채널 크기를 늘리는 것보다 전송 속도를 높이는 것이 근본적인 해결책이기 때문입니다. 또한, panic으로부터 안전한 설계를 위해 모든 fallible한 작업에 match를 사용하여 명시적으로 에러를 처리하도록 개선되었습니다.

참고 자료

⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글