개략적인 규모 추정(back-of-the-envelope estimation)은 보편적으로 통용되는 성능 수치상에서 사고 실험(thought experiments)을 행하여 추정치를 계산하는 행위로서, 어떤 설계가 요구사항에 부합할 것인지 보기 위한 것이다.
개략적 규모 추정을 효과적으로 하기 위해서는 규모 확장성을 표현하는 데 필요한 여러 가지 수치들을 잘 이해하고 있어야 한다.
방대한 데이터를 다루는 분산 시스템에서 제대로 데이터 양을 계산하려면, 데이터 볼륨의 단위를 2의 제곱수로 표현하면 어떻게 되는지를 알아야 한다. 최소 단위는 1byte
, 8bit
로 구성된다.
2의 거듭제곱 | 근사치 | 이름 | 축약형 |
---|---|---|---|
1천(thousand, 1,000) | 1 Kilobyte | 1KB | |
1백만(million, 1,000,000) | 1 Megabyte | 1MB | |
10억(billion, 1,000,000,000) | 1 Gigabyte | 1GB | |
1조(trillion, 1,000,000,000,000) | 1 Terabyte | 1TB | |
1000조(quadrillion, 1,000,000,000,000,000) | 1 Petabyte | 1PB |
참고로, ASCII 문자 하나가 차지하는 메모리 크기가 1byte이다.
아래는 구글의 제프 딘(Jeff Dean)이 2010년에 공개한, 통상적인 컴퓨터에서 구현된 연산들의 latency(응답 지연) 값이다. 더 빠른 컴퓨터가 등장하면서 더 이상 유효하지 값들도 있지만, 여전히 이 값을 활용해 컴퓨터 연산들의 처리 속도를 짐작해 볼 수 있다.
연산명 | 시간 |
---|---|
L1 캐시 참조 | 0.5ns |
분기 예측 오류(branch mispredict) | 5ns |
L2 캐시 참조 | 7ns |
뮤텍스(mutex) 락/언락 | 100ns |
주 메모리 참조 | 100ns |
Zippy로 1KB 압축 | |
1Gbps 네트워크로 2 KB 전송 | |
메모리에서 1MB 순차적으로 read | |
같은 데이터 센터 내에서의 메시지 왕복 지연시간 | |
디스크 탐색 | |
네트워크에서 1MB 순차적으로 read | |
디스크에서 1MB 순차적으로 read | |
한 패킷의 캘리포니아로부터 네덜란드까지의 왕복 지연시간 |
위 표에서 사용한 단위를 정리하면 다음과 같다.
= nanosecond, = microsecond, = millisecond
= 초
= 초 = 1,000ns
= 초 = = 1,000,000ns
위에 제시된 수치들을 분석하면, 다음과 같은 결론이 나온다.
고가용성(high availability)은 시스템이 오랜 시간 동안 지속적으로 중단 없이 운영될 수 있는 능력을 의미하는 용어이다.
고가용성은 퍼센트(%)로 표현하며, 100%는 시스템이 단 한 번도 중단된 적이 없었음을 의미한다. 대부분의 서비스는 99% ~ 100% 사이의 값을 갖는다.
'서비스 사업자와 고객 사이에 맺어진 합의'를 의미하는 SLA(Service Level Agreement)라는 개념이 있는데, 서비스의 가용시간(uptime)도 여기에 기술되어 있다. 아마존, 구글, MS 등의 사업자는 99% 이상의 SLA를 제공한다. 가용률과 시스템 장애 시간(downtime)의 관계는 다음 표와 같다.
가용률 | downtime/day | downtime/week | downtime/month | downtime/year |
---|---|---|---|---|
99% | 14.40분 | 1.68시간 | 7.31시간 | 3.65일 |
99.9% | 1.44분 | 10.08분 | 43.83분 | 8.77시간 |
99.99% | 8.64초 | 1.01분 | 4.38분 | 52.60분 |
99.999% | 864.00ms | 6.05초 | 26.30초 | 5.26분 |
99.9999% | 86.40ms | 604.80ms | 2.63초 | 31.56초 |
다음 주어진 가정 하에서 SNS 서비스의 QPS, 저장소 요구량을 추정하는 연습을 해 보자.
개략적 규모 추정은 QPS(Query Per Second), 최대 QPS, 저장소 요구량, 캐시 요구량, 서버 수 등을 추정하는데 유용하게 활용된다. 따라서 평소에 많이 이런 값들을 계산하는 연습을 미리 해 두면, 현업이나 기술면접에서 문제를 잘 풀어낼 수 있을 것이다.