6. 스레드풀 설계: 적정 스레드 수, 작업 큐, I/O vs CPU 바운드

난이도 중 해설 보기 →
문제

문제 6 — 스레드풀 설계: 적정 스레드 수, 작업 큐, I/O vs CPU 바운드

면접 질문

  1. 스레드풀(thread pool) 을 쓰는 이유는 무엇인가? 요청마다 스레드를 새로 만드는 방식(thread-per-request)의 문제를 들어 설명하라.

  2. 풀의 적정 스레드 개수는 무엇을 기준으로 정하는가? CPU 바운드 작업과 I/O 바운드 작업에서 그 기준이 어떻게 달라지는가?

  3. 스레드풀의 작업 큐(work queue) 가 가득 차거나 처리 속도를 못 따라갈 때 어떤 전략(거절, 블로킹, 백프레셔 등)을 쓸 수 있는가?

응용 시나리오

게임서버에 "DB 저장 + 외부 결제 API 호출"을 처리하는 스레드풀을 만들었다. 코어가 16개라 처음엔 스레드를 16개로 잡았다.

// 작업: DB 쓰기(평균 20ms 대기) + 결제 API(평균 100ms 대기)
//        실제 CPU 계산은 작업당 1ms 미만
var pool = new FixedThreadPool(threadCount: 16);

void OnPurchase(Order o) {
    pool.Submit(() => {
        SaveToDb(o);        // 블로킹 I/O, ~20ms
        CallPaymentApi(o);  // 블로킹 I/O, ~100ms
    });
}

부하 테스트에서 CPU 사용률은 5%인데 처리량(TPS)이 낮고, 큐에 작업이 끝없이 쌓인다. 16개 스레드는 대부분 I/O 응답을 기다리며 놀고 있다.

  • CPU가 거의 안 노는데 처리량이 낮은 이유는? 스레드 개수와 작업 특성의 관계로 설명하라.
  • 이 워크로드에서 스레드 수를 어떻게 정하겠는가? 16이 왜 부적절한지 수치 감각으로 설명하라.
  • 큐가 무한정 쌓이는 문제는 어떻게 다루겠는가? 그리고 이 I/O 위주 워크로드를 더 근본적으로 잘 처리하는 방법(스레드를 늘리는 것 말고)은 무엇인가?
답안 작성
내 답안 · 자동 저장

직접 답을 작성한 뒤, 위 해설 보기에서 모범답안과 대조하세요.