6. 스레드풀 설계: 적정 스레드 수, 작업 큐, I/O vs CPU 바운드
난이도 중 해설 보기 →
문제
문제 6 — 스레드풀 설계: 적정 스레드 수, 작업 큐, I/O vs CPU 바운드
면접 질문
-
스레드풀(thread pool) 을 쓰는 이유는 무엇인가? 요청마다 스레드를 새로 만드는 방식(thread-per-request)의 문제를 들어 설명하라.
-
풀의 적정 스레드 개수는 무엇을 기준으로 정하는가? CPU 바운드 작업과 I/O 바운드 작업에서 그 기준이 어떻게 달라지는가?
-
스레드풀의 작업 큐(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 위주 워크로드를 더 근본적으로 잘 처리하는 방법(스레드를 늘리는 것 말고)은 무엇인가?
답안 작성
내 답안 · 자동 저장
직접 답을 작성한 뒤, 위 해설 보기에서 모범답안과 대조하세요.