# 2. 개략적 규모 추정

## 💬 시스템 설계

* 시스템 용량, 성능 요구사항을 추정해보며 시스템을 설계하는 것이 중요하다.
* 개략적 규모 추정은 보편적으로 통용되는 성능 수치 상에서 머릿속으로 실험해보며 추정치를 계산하는 것을 의미한다.
* 이를 효과적으로 해내려면, 2의 제곱수, latency 값, 가용성에 관련된 수치들을 잘 이해하고 있어야 한다.

## 💬 2의 제곱수

### 2의 제곱수와 근사치

* 1 byte == 8 bits == ASCII 문자 한 개
* Binary Prefix
  * 10진수 단위가 아닌 2진수 단위에는 binary prefix인 `i` 를 붙여 표현한다.
  * 2^10 (1,024) bytes를 KiB (Kibibyte), 2^20 (1,048,576) bytes를 MiB (Mebibyte) 라고 칭한다.

<figure><img src="https://946524419-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZqOTWctN1y9hEXEl4sKd%2Fuploads%2FD5NhWHpAhmwg2hVlifq0%2Fimage.png?alt=media&#x26;token=ec902f56-f9e7-4964-bcb4-349a8005fd09" alt=""><figcaption></figcaption></figure>

### 10의 제곱수

* 10^3 - 1KB
* 10^6 - 1MB
* 10^9 - 1GB
* 10^12 - 1TB
* 10^15 - 1PB
* 10^18 - 1EB

## 💬 응답 지연값 (latency)

* 보편적으로 특정 연산에서 수행되는 작업 시간인 latency는 아래와 같다.

<figure><img src="https://946524419-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZqOTWctN1y9hEXEl4sKd%2Fuploads%2F5BdevOQ6SMK8QaGxNMSf%2Fimage.png?alt=media&#x26;token=534306be-9208-4f6d-aee1-afebbc3533eb" alt=""><figcaption></figcaption></figure>

* 이를 통해 얻을 수 있는 인사이트는 다음과 같다.
  * 메모리는 빠르지만 디스크는 느리다.
  * 디스크 탐색은 가능한 피하도록 한다.
  * 단순 압축 알고리즘은 빠르다.
  * 데이터 전송하기 전 가능하면 압축하도록 한다.
  * 데이터 센터들은 보통 여러 지역에 분산되어 있고, 데이터 센터 간 데이터를 주고받는 데에는 시간이 오래 걸린다.

## 💬 고가용성 관련 수치

* **고가용성**: 시스템이 오랜 시간동안 지속적으로 중단 없이 운영될 수 있는 능력
*   **SLA** (Service Level Agreement)

    * 서비스 사업자(Service Provider)와 고객 사이 맺어진 합의를 의미한다.
    * 서비스 사업자가 제공하는 서비스의 가용 시간(uptime)을 공식적으로 기술한다.
    * 대부분의 대기업은 99% 이상의 SLA를 제공한다.
    * SLA가 100%이라면, 한번도 중단된 적 없는 시스템인 것이다.

    <figure><img src="https://946524419-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZqOTWctN1y9hEXEl4sKd%2Fuploads%2FkRGea04v3mzFa8BhSWgi%2Fimage.png?alt=media&#x26;token=d5cbe0cc-7e97-4b4c-872e-532153b45d5e" alt=""><figcaption></figcaption></figure>

## 💬 QPS 계산

* QPS
  * Query Per Second
  * 특정 쿼리 서버가 초당 처리하는 트래픽 양을 의미한다.
  * DNS 서버의 성능은 보통 QPS로 평가된다.
  * `(일간 능동 사용자 * 사용자별 일간 평균 요청량)/24시간/3600초` 로 계산한다.
  * Peak QPS의 경우 보통 `QPS * 2` 로 계산한다.
* TPS
  * 서버가 초당 처리할 수 있는 트랜잭션 개수를 나타낸다.
  * 한 번의 요청에 여러 단계가 포함되는 경우 단순한 요청-응답 처리가 아니며, 이를 트랜잭션이라고 지칭한다.
  * 보통 시스템 성능 평가 시에 TPS를 사용한다.
  * 시스템의 처리 능력은 최소 처리 용량을 가진 모듈의 TPS 값에 의해 결정되며, 시스템 최적화를 통해 개선할 수 있다.
* 연습문제
  * 10M명의 daily active users가 존재하고, 각 사용자마다 매일 평균 100개의 읽기 요청을 보내고, 매일 5개의 새로운 데이터를 생성하는 경우 QPS는?
    * `QPS`: 10M \* 100 / 24h / 3600s \~= 11570.xx
    * `Peak QPS`: 11570\*2 \~= 23,140
    * `WPS(WritePerSecond)`: 10M \* 5 / 24h / 3600s \~= 578.xx
  * 평균 메시지 읽기 크기는 50 bytes이고 메시지 쓰기 1kb인 경우 Throughput은?
    * `Avg Read Throughput`: 50 \* QPS \~= 50byte \* 12 \* 10^3 = 600kb
    * `Avg Write Throughput`: 1kb \* WPS \~= 1kb \* 580 = 580kb

## 💬 팁

* 정확한 계산보단 간소화한 근사치를 활용하도록 한다. `99987 / 9.1` 이라는 수식을 직접 계산하지 말고, `100000 / 10` 이라고 표현해도 충분하다.
* 결론을 도출하는 것만이 중요한 것이 아니다. 결론 도출에 영향을 미친 가정들을 적어두어야 한다.
* 단위를 중요시해야 한다. 계산 시에 단위를 꼭 붙여 모호함을 없애야 한다.
* QPS, 최대 QPS, 저장소 요구량, 캐시 요구량, 서버 수 등을 계산하는 연습을 해두면 좋다.

#### 출처

[https://dev.to/vladisov/back-of-the-envelope-calculation-4eal](https://dev.to/vladisov/back-of-the-envelope-calculation-4eal)
