스루풋 & 레이턴시

스루풋(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 상태 비중과 스루풋은 반비례한다.

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

첫 번째 예의 레이턴시 = 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개의 프로세스를 실행했을 때와 비교하여 스루풋은 오르지 않았고 레이턴시만 증가했다. (성능이 하락했다.)

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

Last updated