변수의 기록

(CS 운영체제)CPU-bound vs IO-bound :시스템 최적화를 위한 성능 특성 및 쓰레드 전략 정리 본문

CS지식/운영체제 (Operating System)

(CS 운영체제)CPU-bound vs IO-bound :시스템 최적화를 위한 성능 특성 및 쓰레드 전략 정리

불광동 물주먹 2025. 4. 6. 02:21

2025년 4월 6일

운영체제 bound 공부 

 

CPU-bound vs IO-bound: 서버 성능 최적화를 위한 핵심 개념 정리

웹 개발이나 서버 운영을 하다 보면 "CPU를 많이 쓰는 작업", "IO 때문에 느린 작업"이라는 표현을 자주 듣는다.
이 글에서는 그 차이를 명확히 이해하고, 시스템 설계나 튜닝 시 어떤 선택을 해야 하는지 정리


✅ CPU-bound와 IO-bound란?

 

구분 CPU-bound IO-bound
의미 CPU 연산이 병목인 작업 입출력(IO)이 병목인 작업
예시 영상 인코딩, 머신러닝, 압축 웹서버, DB 조회, 파일 저장, 외부 API 호출
병목 위치 연산 처리 속도 네트워크/디스크 응답 지연
CPU 사용률 높다 낮고 대기가 많다
IO 대기 거의 없다 많다

 

🔄 CPU Burst vs IO Burst

  • ✔️ Burst란?
    어떤 현상이 짧은 시간에 몰려서 집중적으로 일어나는 것을 의미한다.
  • ✔️ CPU Burst
    프로세스가 CPU에서 실제로 연산을 수행하는 시간.
    메모리에 올라온 프로세스가 CPU를 점유하고 있는 동안 실행되는 시간이다.
  • ✔️ IO Burst
    디스크나 네트워크 IO 같은 외부 자원을 기다리는 시간이다.

📌 대부분의 프로세스는 CPU Burst와 IO Burst를 번갈아가며 실행된다.
보통 실행 흐름은 아래와 같다:일반적으로 8ms 이내라고 알려져 있다

 

 

 

                     위 사진 - 프로세스를 실행하면, CPU Burst, IO Burst가 교차로 실행

 

 

 

 

위 그래프를 보면, 대부분의 프로세스는 CPU Burst가 8ms 이내에 종료되며 

프로세스에 따라, CPU Burst 시간이 높은지(= CPU Bound),

상대적으로 적은지(= IO Burst 시간이 많음 = IO Bound)에 따라 분류 됨

 

 


이 흐름을 잘 이해해야 쓰레드 운영이나 성능 최적화가 가능하다.


🧠 쓰레드 수는 어떻게 정해야 할까?

🎯 CPU-bound 작업일 때

  • 쓰레드 수 ≈ CPU 코어 수
  • CPU 연산이 병목이므로 스레드가 많으면 오히려 성능이 떨어진다
 
문제 - 듀얼 코어 CPU에서 동작할 CPU BOUND 프로그램을 구현한다면 몇 개의 스레드를 쓰는게 좋을까?
 
정답- 4코어 서버 → 4~5개 스레드가 적절하다  (코어당 1개 쓰레드)

🎯 IO-bound 작업일 때

  • 쓰레드 수는 코어 수보다 많아야 한다
  • 대부분 대기 상태이므로 많은 요청을 처리하려면 여러 스레드가 필요하다
 
경험 공식: 쓰레드 수 ≈ 코어 수 × (1 + IO 대기시간 / CPU 사용시간)

🧩 비동기 처리 vs Non-blocking 구조

✅ @Async (Spring에서 흔히 쓰는 방식)

  • 새로운 스레드를 만들어 백그라운드에서 작업한다
  • 작업이 끝날 때까지 스레드를 계속 점유하기 때문에
    완전한 논블로킹은 아니라고 볼 수 있다

⚡ WebFlux / Netty (진짜 Non-blocking)

  • 이벤트 루프 기반 구조를 사용한다
  • IO 응답이 도착하면 콜백으로 처리한다
  • 스레드를 점유하지 않고, 필요할 때만 짧게 실행한다
    → 수천 ~ 수만 요청도 소수의 스레드로 처리할 수 있다

📌 핵심 비교 요약


 

항목 Spring MVC + @Async WebFlux / Netty
처리 방식 블로킹 기반 + 스레드 풀 논블로킹 이벤트 기반
스레드 점유 계속 점유함 점유하지 않음
동시성 처리 스레드 수에 따라 제한됨 수만 요청도 처리 가능함
개발 난이도 낮고 익숙하다 높고 학습 난이도가 있다

🛠 실무 적용 예시


서비스 종류 바운드 유형 추천 구조
이미지 처리 서버 CPU-bound 고성능 CPU + 스레드 제한을 추천한다
REST API 서버 IO-bound Spring MVC 기반 + 필요 시 @Async를 함께 사용한다
실시간 알림 서버 IO-bound WebFlux 또는 Netty를 사용하는 것이 적합하다
API Gateway IO-bound WebFlux + WebClient 비동기 호출 구조가 적합하다
관리자 페이지 혼합 Spring MVC 구조로도 충분하다

🔚 마무리 요약

  • CPU-bound는 CPU 코어 수에 맞춘 스레드 수 설정이 중요하며, 연산 최적화가 핵심이다
  • IO-bound는 대기 시간이 많기 때문에 스레드를 많이 두거나, 논블로킹 구조로 전환하는 것이 효율적이다
  • @Async는 간단한 비동기 처리를 할 수 있지만, 스레드를 점유하기 때문에 완전한 논블로킹은 아니다
  • 진짜 Non-blocking 처리가 필요하다면 WebFlux나 Netty 같은 이벤트 기반 구조를 도입해야 한다