리틀의 법칙 – Little’s law

IT관련 프로젝트를 진행하다 보면 심심치 않게 성능과 용량에 대한 문제를 다루게 됩니다. 성능과 용량 문제는 매우 복잡하고 알아야 할 것이 많은 부분입니다. 그리고 이런 분야는 수요가 그리 많지 않기 때문에 많은 사람들이 크게 관심을 기울이지 않습니다. 이 부분에 대한 가장 기본적인 수식으로 리틀의 법칙 (Little's law)이라는 것이 있습니다.
계산식은 간단하며 다음과 같습니다.

n = x * (z + r)

여기서 각 변수의 의미는 다음과 같습니다.
n - 동시 상용자 수,
x - 시스템이 처리 가능한 용량, 다른 용어로는 throughput이라고 합니다.
r - 단위 처리의 응답 시간,
z - 각 단위 처리 사이의 간격 (이른바 씽크타임, think time).

이 법칙에 대한 예를 들어보겠습니다. 간단한 성능 테스트를 진행했을 때의 결과가 다음과 같이 나왔다고 가정해보겠습니다. 동시에 1명이 접속하고 think time은 0이고, 꽤 많은 횟수를 테스트할 때 평균 응답 시간이 2초로 측정되었다면 이를 리틀의 법칙 수식에 넣으면 다음과 같이 될 것입니다.

1 user = x * (0 sec + 2 sec)

이 수식을 풀면 x 값은 0.5 (user/sec)가 됩니다. 즉, 1초에 0.5 사용자의 동시 요청을 처리할 수 있는 용량입니다. 잠깐만요… throughput 즉 x 값이 0.5라면 너무 적은 값이 아닌가요? 그렇습니다. 이 테스트의 결과로는 throughput은 0.5가 맞습니다. 단, 최대 throughput은 아닙니다.

동일한 시스템에 대하여 더 테스트를 진행합니다. 그래서 다음과 같은 측정값들을 얻었습니다. 동시에 5명이 접속하고, think time은 0 (그리고 당연히 꽤 많은 횟수를 테스트하고) 일 때, 평균 응답 시간이 2.3초가 나왔다면, 다음과 같이 수식이 나올 것입니다.

5 user = x * (0 sec + 2.3 sec)

이 식을 계산하면 x는 대략 2.17 users/sec 의 값을 갖습니다. 즉 일초당 2.17 사용자의 요청(request)을 처리할 수 있습니다. 이런 식으로 계속 동시 사용자를 증가시켜가면서 테스트를 진행합니다. 그리고 throughput에 대한 그래프를 그려가면 어느 순간에 throughput이 이전보다 떨어지는 경우를 발견하게 됩니다. 주로 x 축은 동시 사용자, y 축은 throughput의 형태로 그래프를 그립니다. 사용자는 시스템의 규모에 따라서 다르지만, 100단위 수준으로 증가시켜 가면서 테스트합니다. 이 지점이 이 시스템의 최대 성능을 내는 지점이 됩니다. 이 법칙의 유용한 점은 매우 단순한 수식이지만 어떤 시스템의 처리 용량을 알고자 할 때 큰 오차 없이 쉽게 계산할 수 있다는 것입니다. 잘 구성된 좋은 시스템(하드웨어 + 소프트웨어)는 동시 사용자가 증가해도 응답 시간의 증가율이 낮은 특성을 보입니다.

이 법칙이 응용되는 상황을 하나 살펴보겠습니다. 어떤 하드웨어 시스템이 4개의 CPU를 갖고 있습니다. 거기에 자바 기반의 서버 프로그램이 하나 운영되고 있습니다. 이 시스템(하드웨어 + 소프트웨어)이 발휘할 수 있는 최대 throughput은 앞서의 예처럼 동시 사용자 수를 조금씩 늘려가면서 테스트를 해 보면 파악할 수 있습니다. 이론적으로는 4명의 사용자일 때 가장 좋은 throughput을 보일 것 같지만 현실은 그렇지 않습니다. 이유는 대부분의 어플리케이션은 CPU intensive한 작업이 아니기 때문입니다. 대표적인 경우가 어플리케이션에서 DBMS에 접속하여 데이터를 읽어와야 하는 경우입니다. 이 시간 동안에는 IO가 주로 동작하며, CPU는 별로 일을 하지 않습니다. 즉, 다른 일을 처리할 여유를 갖고 있는 것입니다. 그럼, DBMS에 접속하지 않는 경우라면 어떨까요? 이때의 네트워크 처리나 파일 처리와 같은 종류의 일은 CPU와는 무관하게 진행됩니다. 이런 경우에는 4명의 동시 사용자보다는 조금 많은 6명이나 8명의 동시 사용자인 경우가 throughput이 더 높게 측정됩니다.

물론 이 경우는 그 어플리케이션과 기반되는 J2EE 컨테이너가 다중 CPU를 갖는 시스템에 적합하게 작성이 되어 있어야 합니다. 이를 다른 말로는 multi-thread에 적합하다 또는 scalability가 높다고 합니다.

댓글

이 블로그의 인기 게시물

Java의 String 객체의 메모리 사용량

true, false, positive, negative – TP/TN/FN/FP