각각의 스레드가 하는 작업은 크게 2가지로 구분할 수 있다.
CPU-바운드 작업
I / O 바운드 작업
현대 웹 어플리케이션 서버는 주로 CPU 바운드 작업 보다는 I / O 바운드 작업이 많다.
예를들어 백앤드 개발자의 경우 주로 웹 애플리케이션 서버를 개발하는데, 스레드가 1- 10000까지 더하는 CPU 연산이 필요한 작업보다는, 대부분 사용자의 입력을 기다리거나, 데이터베이스를 호출하고 그 결과를 기다리는 등, 기다리는 일이 많다. 쉽게 이야기 해서 스레드가 CPU 를 사용하지 않는 I / O 바운드 작업이 많다는 뜻이다.
일반적인 자바 웹 애플리케이션 서버의 경우 사용자가 요청 하나를 처리하는데 1개의 스레드가 필요하다.
사용자 4명이 동시에 요청하면 4개의 스레드가 작동하는 것이다. 그래야 4명의 사용자의 요청을 동시에 처리 할 수 있다.
사용자의 요청 하나를 처리하는데, 스레드는 CPU 를 1% 정도 사용하고 있고 , 대부분 데이터베이스 서버에 어떤 결과를 조회하면서 기다린다고 가정하자. 이대 스레드는 CPU 코어 즉 CPU 를 거의 사용하지 않고 대기한다. 바로 이것이 I / O 바운드 작업이 많다는 것이다.
여기서 1% 라는 가정을 한 이유는 스레드는 I / O 작업이 많기 때문이다.
정리하면 스레드의 숫자는 CPU-바운드 작업이 많은가, 아니면 I/O-바운드 작업이 많은가에 따라 다르게 설정해야 한다.
CPU-바운드 작업: CPU 코어 수 + 1개
CPU를 거의 100% 사용하는 작업이므로 스레드를 CPU 숫자에 최적화
I/O-바운드 작업: CPU 코어 수 보다 많은 스레드를 생성, CPU를 최대한 사용할 수 있는 숫자까지 스레드 생성 CPU를 많이 사용하지 않으므로 성능 테스트를 통해 CPU를 최대한 활용하는 숫자까지 스레드 생성
단 너무 많은 스레드를 생성하면 컨텍스트 스위칭 비용도 함께 증가 - 적절한 성능 테스트 필요