스레드 풀 (thread pool)

컴퓨터과학·AI
한 줄 정의: 미리 만들어 둔 작업 스레드들이 대기열의 작업을 꺼내 처리하도록 재사용하는 구조입니다.

쉽게 풀면

요청이 올 때마다 새 스레드를 만들면 만드는 비용도 크고 수천 개가 동시에 생기면 시스템이 마비됩니다. 스레드 풀은 정해진 수의 일꾼을 미리 만들어 두고 작업을 큐에 넣으면 놀고 있는 일꾼이 하나씩 꺼내 처리하게 합니다. 일이 끝난 일꾼은 사라지지 않고 다음 작업을 기다립니다.

왜 중요한가

스레드 생성·소멸 비용을 없애고 동시 실행 수에 상한을 두어 과부하 상황에서도 시스템이 무너지지 않게 해 줍니다. 대기열 길이와 일꾼 수를 통해 부하를 조절하는 배압 장치 역할도 합니다. 웹 서버, 데이터베이스, 언어 런타임의 동시성 기반으로 거의 예외 없이 쓰이는 표준 패턴입니다.

논문에서는 이렇게 쓰입니다

"스레드 풀 크기를 코어 수의 두 배로 조정하고 대기열 상한을 설정해 과부하 시 응답 지연의 급증을 억제하였다."

일꾼 수와 대기열 한도를 정해 부하가 몰려도 시스템이 견디도록 했다는 뜻입니다.

조금 더 깊게 보면

적정 크기는 작업의 성격에 따라 달라서, 계산 위주 작업은 코어 수 근처가 적절하고 입출력 대기가 많은 작업은 그보다 크게 잡아야 자원이 놀지 않습니다. 대기열이 무한하면 메모리가 고갈되므로 상한을 두고 초과 시 거부하거나 호출자가 직접 실행하게 하는 정책을 정해야 합니다. 작업 안에서 같은 풀의 다른 작업 완료를 기다리면 모든 일꾼이 서로를 기다리는 교착 상태에 빠질 수 있어 주의가 필요합니다.

주의할 점

비동기 처리와 이벤트 루프가 하나의 스레드에서 대기 없이 작업을 번갈아 처리하는 모델이라면, 스레드 풀은 여러 스레드를 재사용하며 블로킹 작업을 병렬로 처리하는 모델입니다. 풀 크기를 무작정 늘리면 문맥 전환과 메모리 경합이 커져 오히려 느려집니다.

관련 용어