피드로 돌아가기
Synchronous vs asynchronous in .NET core - how decide
Dev.toDev.to
Backend

Thread Pool 효율 극대화를 위한 I/O-bound Async 설계 전략

Synchronous vs asynchronous in .NET core - how decide

Hossein Esmati2026년 6월 26일3intermediate

Context

외부 종속성 호출 시 발생하는 대기 시간이 Request Thread를 점유하여 서버 처리량을 저하시키는 병목 현상 발생. CPU 작업과 I/O 작업의 특성 차이를 구분하지 않은 일괄적 비동기 처리로 인한 자원 낭비 및 Deadlock 위험 상존.

Technical Solution

  • I/O-bound 작업에 Async 패턴을 적용하여 대기 시간 동안 Thread를 Thread Pool로 반환하는 구조 설계
  • Trivial CPU 작업은 Sync 방식으로 처리하여 비동기 상태 머신 생성 비용 및 컨텍스트 스위칭 오버헤드 제거
  • Heavy CPU 작업의 경우 Async 처리가 아닌 Background Queue 기반의 Offload 구조를 통해 요청-응답 분리 및 처리량 제어
  • CancellationToken 전파를 통한 불필요한 리소스 소비 방지 및 타임아웃 제어 메커니즘 구현
  • Task.Run을 통한 동기 I/O의 가짜 비동기화(Fake Async) 배제로 Thread Starvation 방지
  • ASP.NET Core의 SynchronizationContext 부재 특성을 활용한 불필요한 ConfigureAwait(false) 제거

- 외부 API/DB/File 접근 시 반드시 Async-end-to-end 경로 확보 여부 검토 - 런타임 수 ms 이하의 단순 계산 로직은 Sync 유지로 오버헤드 최소화 - CPU 집약적 작업 발견 시 Controller에서 202 Accepted 응답 후 Worker 서비스로 위임하는 구조 적용 - .Result 또는 .Wait() 사용 여부를 정적 분석 도구로 점검하여 Deadlock 가능성 차단

원문 읽기