https://www.youtube.com/watch?v=qnVKEwjG_gM&list=PLcXyemr8ZeoQOtSUjwaer0VMJSMfa-9G-&index=3
영상에서 얻고자하는것
CPU bound, Io bound의 의미와
이 두가지가 프로그램의 스레드 개수를 결정하는데 어떤 영향을 주는지 알게된다.
CPU란?
프로세스의 명령어를 해석하고 실행하는 장치이다.
I/O란?
파일을 읽고 쓰거나 네트워크의 어딘가의 존재와 데이터를 주고받는것이다.
입출력 장치와 데이터를 주거나 받는 것이다.
burst란?
어떤 현상이 짧은 시간 안에 집중적으로 일어나는 일
CPU burst란 프로세스가 CPU에서 한번에 연속적으로 실행되는 시간이다.
IO burst란 프로세스가 IO 작업을 요청하고 결과를 기다리는 시간이다.
프로세스와 burst
프로세스의 인생은 CPU 버스트와 IO 버스트의 연속이다.
Process A가 존재한다.
CPU 작업, 즉 CPU burst -> IO 작업, IO burst -> 무한 반복
CPU 버스트 길이에 따른 빈도
여러가지 다양한 프로세스들의 CPU burst길이에 따라서 빈도수가 어떻게 되는지 그래프를 그린다.
대부분의 프로세스들의 CPU burst는 8 milli second안에 보통 끝난다.
CPU bound 프로세스
CPU burst Process가 많은 프로세스를 의미한다.
예시로는, 동영상 편집 프로그램과 머신러닝 프로그램이다.
IO 작업이 거의 없고 연산작업이 주로이다.
CPU 의 멀티코어만으로도 부족하기에 수천개의 코어를 가지는 GPU를 사용하기도 한다.
I/O bound 프로세스
IO burst가 많은 프로세스를 의미한다.
(일반적인) 백엔드 API 서버이다.
보통의 API 서버는 HTTP request를 받으면 DB Server나 Cache Server에 데이터 요청해서 요청한 데이터를 받고나서 그 데이터를 적당한 형태로 가공한뒤에 HTTP 응답을 하는것이 일반적인 형태이다.
이떄 DB서버, Cache Server에 요청하는것이 IO 작업이고, 네트워크 영역이 중요한 부분이기에 CPU에서 명령어 몇개 처리되는것보다 훨씬 많이 걸린다.
이런 측면에서 봤을떄 보통의 백엔드 API 서버는 IO 바운드 작업이다.
구현한 API 특성에 따라서 IO 바운드가 아닐 수 있다. (일반적으로는 그렇다,. 주로 DB나 Cache에서 데이터를 가져오는것이기에 그렇다.)
CPU bound 프로그램과 스레드 수
퀴즈이다.
듀얼 코어 CPU에서 동작할 CPU bound 프로개름을 구현한다면, 몇개의 쓰레드를 쓰는게 좋을까요?
예를들어 10억개의 사진을 읽어서 그 사진속에 사람이 있는지 없는지 마킹하는 프로그램이다.
그렇다면 작업을 빨리 처리하기 위해 스레드 1000개를 사용하면 빠를까?
Goetz(2002, 2006)년에 추천한 방안은 CPU bound 프로그램에서 적절한 스레드 수는 number of CPUs + 1 의 개수이다.
우리가 지금까지 배워본것을 기준으로 생각해봤을때 Context Switching과 연관이 있다.
듀얼코어 CPU에 CPU bound 프로그램을 구현한다고 했을때 스레드 몇개가 적절할까?
스레드를 무조건 많이 넣으면 좋을까?
듀얼 코어이기에
CPU에는 두개의 코어가 존재한다.
만약, 두개의 코어보다 더 많은 스레드를 가질경우를 확인해보자.
Proess에 Thread1, Thread2, Thread3, Thread4 가 존재한다.
코어는 2개이고 Thread는 4개이기에 Thread 2개가 하나의 코어씩 경쟁한다.
전체작업을 1/4 씩 Thread가 나눠가지기에 속도가 1/4이 될 것이라고 생각할 수 있지만,
CPU bound 프로그램이기에 그렇지않다.
코어에서 두개의 Thread가 동시에 실행될 수 없다.
Thread가 서로 경쟁하는 부분을 보면,
Core 1 : Thread1 작업 -> ContextSwithcing -> Thread 2 작업. -> ...
Core 2 : Thread 3 작업 -> ContextSwithcing -> Thread 4 작업 -> ...
이 Thread가 모두 CPU 를 오래 잡아먹는 작업이기에 각 한개씩 작업하고 따로 작업하고 작업한다.
우리는 context Switching은 CPU를 잡아먹는 Over Head이다.
오늘날 멀티태스킹 시스템에서 아주 짧은 time slice를 두고 서로 교체되며 실행될 것이다.
실제로 구체적으로 좀 더 확인해보면, 위의 Thread가 계속해서 작업을 위해 불필요한 Context Swithcing이 발생할 것이다.
만약에 Thread 4개가 아닌 Core 개수만큼인 Thread 1, Thread 2 만 존재할경우 어떻게 될까?
CPU Core 1 : Thread 1 작업 ---------------------------------------- (계속해서 작동한다.)
CPU Core 2 : Thread 2 작업 ----------------------------------------
그렇기에 CPU bound프로그램에서는 Thread의 개수를 CPU Core와 유사하게 설정하는것이 좋다.
I/O bound 프로그램과 스레드 수
큰 가이드라인이 없다.
여러 상황에 맞춰서 적절한 스레드 수를 찾야아한다.
컴퓨터 스펙, 프로그램의 특성 등등 여러가지 상황에 맞춰 적절한 스레드수를 찾아야한다.
가령, 만약 API 서버가 thread per request 방식이라면?
즉, API 요청이 있을떄마다 전담 Thread를 할당해서 요청을 처리하는 방식을 채택했다고 하자.
API 서버에 미리 Thread를 여러개 만들어놓고 요청이 올떄마다 아직 일이 없는 Thread가 나아서 일을 처리한다.
이떄 몇개의 스레드를 미리 만들어놓을지 정해야하는데, 여러 상황을 고려해서 결장하는것이 필요하다.
API 서버의 하드웨어 스펙이 어느정도인지. API 서버의 Core수를 고려해야겠지.
API 어플리케이션의 IO burst 비중이 어느정도인지.
예상되는 트래픽이 어떻게 될 것인지.
몇개 스레드를 만들어놓을지. 그렇게 되면 보다 더 안정적인 서버 운영이 가능해진다.
마무리
CPU bound, IO bound에 따른 쓰레드 적정개수에 대해 알게되다.
그리고 그 용어에 대한 영상제작자의 생각을 알수있어어 좋았다.