시스템 설계 면접을 볼 때, 때로는 시스템 용량이나 성능 요구사항을 개략적으로 추정해 보라는 요구를 받게 된다.
개략적인 규모 추정(back-of-the-envelope estimation)은 보편적으로 통용되는 성능 수치상에서 사고 실험을 행하여 추정치를 계산하는 행위로서, 어떤 설계가 요구사항에 부합할 것인지 보기 위한 것이다.
- 개략적인 규모 추정을 효과적으로 해 내려면 규모 확장성을 표현하는 데 필요한 기본기에 능숙해야 한다. 특히 2의 제곱수나 응답지연(latency)값, 그리고 고가용성에 관계된 수치들은 기본적으로 잘 이해하고 있어야 한다.
- 많이 출제되는 개략적 규모 추정 문제는 QPD, 최대 QPS, 저장소 요구량, 캐시 요구량, 서버 수 등을 추정하는 것이다.
Google Pro Tip: Use Back-of-the-envelope-calculations to Choose the Best Design
[ 링크 ]
다양한 디자인에 대해 평가하기 위해 개략적인 규모 추정을 사용하라
개략적인 규모 계산(back-of-the-envelope calculations)은 사고실험과 일반적인 성능 수치를 이용하여 어떤 디자인이 요구사항을 충족시키는지를 감을 잡기 위한 추정치이다.
딘은 다양한 시스템을 직접 구현하지 않고 성능을 추정하기 위해 이 능력이 소프트웨어 엔지니어에게 중요한 역량이라 생각한다
모두가 알아야 하는 수치 정보
시스템 디자인 대안에 대해 평가를 하기 위해서는 일단은 일반적인 연산(메모리에서 읽기, 디스크에서 읽기, 네트워크 통해 읽기 등)에 대해 얼마나 걸리는지에 대한 감을 잡는 것이 필요하다
- L1 캐시 참조 : 0.5ns
- branch mispredict: 5ns
- L2 캐시 참조 : 7ns
- Mutex lock/unlock : 100ns
- 메인 메모리 참조 : 100ns
- Zippy를 이용하여 1kb 를 압축 : 10,000ns
- 1Gbps 네트워크를 통해 2K 바이트를 전송: 20,000ns
- 메모리에서 1MB를 순차 읽기(sequential read) : 250,000ns
- 같은 데이터센터 내부에서 Round Trip : 500,000ns
- 디스크 탐색(Disk seek) : 10,000,000ns
- 네트워크를 통해 1MB 순차 읽기 : 10,000,000 ns
- 디스크에서 1MB 순차 읽기 : 30,000,000 ns
- CA → Netherlands → CA 로 패킷 전송하기 : 150,000,000 ns
알아야 할것
- 다양한 옵션에 대해 성능 수치의 크기 차이
- 데이터 센터는 충분히 멀어서 어떤것을 그 사이에서 전송하기 위해서는 많은 시간이 걸린다
- 메모리는 빠르고 디스크는 느리다
- 값싼 압축 알고리즘을 사용하는 것은 네트워크 대역(network bandwidth)를 절약해줄 수 있다
- 쓰기 연산이 읽기 연산보다 40배나 더 비싸다
- 전역적으로 공유된 데이터는 비싸다.이 사실은 분산 시스템의 근본적인 한계. 공유된 자원에 대한 쓰기를 위해 lock을 적용하는 것은 성능에 치명적이다. (transaction이 serialized 되고 slow 되고)
- scaling write를 위해 구조화하라
- 낮은 write contention을 위해 최적화하라
- 쓰기 연산은 최대한 병렬화하라
예시 : 30개의 썸네일 이미지가 있는 페이지 생성
Design1 - Serial
- 이미지를 순차적으로 읽기. 디스크 탐색 실행 & 256K 이미지를 읽고 다음 이미지에 대해서 실행
- Performance : 30 seeks * 10ms / seek + 30 * 256K / 30MB/s
Design 2- Parallel
- 병렬적 읽기
- Performance : 10ms / seek + 256K read / 30MB/s = 18ms
- disk read에는 어느정도 편차가 있을 수 있기에 대략적으로 30-60ms 정도 걸릴것
어떤 디자인이 더 좋은지는, 요구사항에 따라 다르다. 그러나 back-of-the-envelope calculations이 있으면 직접 구현하지 않고 비교할 수 있는 좋은 방법을 가진 것임
배운 점
- Back-of-the-envelope 계산은 다양한 디자인에 대해 볼 수 있도록 해준다.
- 시스템을 디자인 할 때, 이러한 종류의 계산은 머리속에서 계속해서 반복적으로 해야할 작업이다.
- 시스템의 일부를 구현해나갈 때 back-of-the-envelope 성ㅇ능 수치에 대해서 알고 있어야 한다. 일반적인 성능 수치에 대해 아는 것만으로는 부족하고, 실제 서브시스템이 어떻게 동작하는지에 대해 알아야 함. 실제로 어떤 동작이 일어나는지를 알지 못하면 좋은 back-of-the-envelope 계산을 수행하지 못한다
- 시스템의 부분들을 계속 모니터링하고 측정하라. 그럼으로써 이러한 계산들을 실제 데이터를 통해 수행할 수 있다.