> For the complete documentation index, see [llms.txt](https://kde6260.gitbook.io/dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kde6260.gitbook.io/dev/and.md).

# 스루풋 & 레이턴시

스루풋(throughput)과 레이턴시(latency)에 대해 알아본다.

스루풋(throughput) : 단위 시간당 처리된 일의 양. **완료한 프로세스의 수 / 경과 시간**

레이턴시(latency) : 하나의 프로세스가 시작하고 종료되기까지 경과된 시간. **종료시간 - 시작시간**

*알아야 할 것 : 코어 1개는 여러 프로세스를 동시에 처리하는 게 아니라 타임 슬라이싱을 해서 번갈아가면서 처리하는 것이다. 어떤 순간에 코어는 항상 1개의 프로세스만 처리한다.*

기본적으로 스루풋은 논리CPU(보통 코어 1개를 논리CPU라고 한다.)의 연산 리소스를 많이 사용할수록 높아진다. 즉, CPU의 idle 상태 빈도가 적을 수록 높아진다.

*\*\* idle 상태 : CPU가 아무런 프로세스를 처리하지 않고 휴식중인 상태. '아무것도 하지 않는' 특수한 프로세스인 idle 프로세스가 동작하는 상태. 하나 이상의 프로세스가 실행 가능한 상태가 될 때 까지 소비전력을 낮춰 CPU를 대기상태로 만든다.*

### 단일 코어인 경우

예를 들어 100밀리초 동안 1개의 0번 코어에서 슬립 상태를 40%정도 유지하는 1개의 프로세스가 시작-종료하였고, 시작부터 종료시간 까지 약 40%정도 idle 상태였다고 가정한다.

*\*\*슬립 상태: 파일I/O 또는 네트워크 통신 등의 이유로 프로세스가 CPU를 점유하지 않고 잠들어 있는 상태. 파일I/O 또는 네트워크 통신이 종료 이벤트를 발생시키면 슬립 상태가 끝나고 CPU 대기 상태로 바뀐다.*

`0번 코어의 스루풋 = 1프로세스 / 100밀리초 = 1프로세스 / 0.1초 = 10프로세스 / 1초`

0번 코어에서 위와 동일한 슬립 상태를 갖는 프로세스 2개가 120밀리초 동안 라운드-로빈 방식으로 번갈아가면서 처리되었고, 두 프로세스가 처음 시작하고 모두 종료할 때 까지 idle 상태는 없었다고 가정한다.

`0번 코어의 스루풋 = 2프로세스 / 120밀리초 = 2프로세스 / 0.12초 = 16.7프로세스 / 1초`

슬립 상태가 있는 프로세스의 수를 높였을 때 스루풋이 증가했음을 알 수 있다. 즉, CPU의 idle 상태 비중과 스루풋은 반비례한다.&#x20;

대신에 레이턴시도 증가한다.

`첫 번째 예의 레이턴시 = 100밀리초`

`두 번째 예의 레이턴시 = 120밀리초 (두 프로세스가 각각 종료하기 까지 120밀리초 소요.)`

\*\*\*

그러나 CPU가 더 이상 idle 하지 않은 상태에서 프로세스 처리 수를 늘리면 1개를 실행하던 2개를 실행하던 코어 1개의 스루풋은 항상 동일하다. 슬립 상태가 없는 프로세스 1개를 처리하는 데 100밀리초가 소요된다고 가정하자.

`슬립상태가 없는 프로세스 1개를 시작-종료 했을 때 스루풋 = 1프로세스 / 100밀리초 = 10프로세스 / 1초`

`슬립상태가 없는 프로세스 2개를 시작-종료 했을 때 스루풋 =  2프로세스 / 200밀리초 = 10프로세스 / 1초`

스루풋에는 변화가 없으나 레이턴시는 두배로 증가한다.

`슬립상태가 없는 프로세스 1개를 시작-종료 했을 때 레이턴시 = 100 - 0 = 100밀리초`

`슬립상태가 없는 프로세스 2개를 시작-종료 했을 때 레이턴시 = 200 - 0 = 200밀리초`

**즉, CPU가 더 이상 idle 상태가 되지 않는 경우에는 프로세스 개수를 늘려도 스루풋에 변화가 없으나, 레이턴시만 증가하게 된다.**

### 멀티코어인 경우

0번, 4번 코어가 슬립상태가 없는 프로세스를 1개, 2개 4개 처리한다고 가정하자. `$ grep -c processor /proc/cpuinfo` 으로 코어의 갯수를 알아낼 수 있다.`$ taskset -c 0, 4 ./sched <프로세스 수> 1000 1` 명령어로 0번,  4번 코어에 \`sched\` obj파일이 실행되는 프로세스를 할당한다.

1개 처리: 프로세스가 0번 코어를 점유하고 4번 코어는 항상 idle상태가 된다.

2개 처리: 0번, 4번 코어가 각각 1개의 프로세스를 맡는다.

4개 처리: 0번, 4번 코어가 각각 2개의 프로세스를 맡는다.

프로세스 1개를 처리하는 데 100밀리초가 걸린다고 가정할 때 스루풋과 레이턴시는 아래와 같다.

`1개 처리 할 때 스루풋 = 1프로세스 / 100밀리초 = 10프로세스 / 1초`

`1개 처리할 때 레이턴시 = 100밀리초`

`2개 처리할 때 스루풋 = 2프로세스 / 100밀리초 = 20프로세스 / 1초`

`2개 처리할 때 레이턴시 = 100밀리초`

`4개 처리할 때 스루풋 = 4프로세스 / 200밀리초 = 20프로세스 / 1초`

`4개 처리할 때 레이턴시 = 200밀리초`

* 1개의 프로세스를 실행할 때 보다 2개의 프로세스를 실행했을 때 레이턴시의 증가없이 스루풋이 올랐다. (성능이 향상했다.)
* 그러나 코어 수 보다 많은 4개의 프로세스를 실행했을 때 2개의 프로세스를 실행했을 때와 비교하여 스루풋은 오르지 않았고 레이턴시만 증가했다. (성능이 하락했다.)

**즉, 멀티코어 환경에서 코어의 수 많큼 프로세스를 동시에 동작시키지 않으면 성능은 오르지 않는다. 단, 코어의 수 보다 프로세스의 수를 늘려서 실행하면 단일 코어와 마찬가지로 스루풋은 오르지 않고 레이턴시만 증가하여 성능이 낮아진다.**
