C.S/System Design

개략적인 시스템 규모 추정

칼쵸쵸 2024. 4. 16. 00:04

데이터의 크기 추정

2의 제곱수와 데이터의 크기

- 보통 1바이트가 1개의 문자

 

문자열의 크기와 종류

문자열은 문자의 연속된 시퀀스로, 텍스트 데이터를 표현하는 데 사용됩니다. 문자열을 저장하는 방법은 사용하는 문자 인코딩에 따라 달라집니다.

 

ASCII (American Standard Code for Information Interchange)

  • ASCII는 7비트 인코딩 시스템으로, 128개의 가능한 문자를 정의합니다 (0-127). 이는 기본적인 영문자, 숫자, 일부 특수문자를 포함합니다.
  • 각 ASCII 문자는 1바이트 (8비트)를 사용하지만 실제로는 7비트만 사용합니다.

ISO-8859-1 (Latin-1)

  • ISO-8859-1은 ASCII를 확장한 8비트 인코딩으로, 추가적인 128개의 문자를 포함하여 총 256개의 문자를 지원합니다. 이에는 유럽 언어의 특수문자가 포함됩니다.
  • 각 문자는 1바이트를 사용합니다.

Unicode

  • Unicode는 전 세계의 모든 문자를 하나의 일관된 문자 세트로 표현하기 위해 만들어진 인코딩 시스템입니다. 현재 Unicode는 10만 개 이상의 문자를 포함하고 있습니다.
  • Unicode에는 여러 가지 인코딩 형식이 있습니다:
    1. UTF-8: 가장 일반적으로 사용되는 Unicode 인코딩으로, 1~4바이트를 사용하여 문자를 인코딩합니다. ASCII와의 호환성을 유지하며, 문자에 따라 다양한 크기를 가질 수 있습니다.
    2. UTF-16: 문자에 따라 2바이트 또는 4바이트를 사용합니다. 주로 시스템 내부에서 사용됩니다.
    3. UTF-32: 모든 문자를 4바이트로 고정하여 인코딩합니다. 각 문자의 크기가 고정되어 있어 처리가 간단하지만, 저장 공간을 많이 사용합니다.

문자열의 저장

컴퓨터 시스템 또는 프로그래밍 언어에 따라 문자열을 저장하는 방식은 다를 수 있습니다. 예를 들어, 자바는 문자열을 UTF-16을 사용하여 저장하는 반면, 파이썬 3에서는 문자열을 UTF-8, UTF-16 또는 UTF-32로 저장할 수 있습니다. 문자열의 크기는 사용된 인코딩과 문자열 길이에 따라 달라집니다.

 

응답 지연

Latency Numbers Every Programmer Should Know

프로그래머가 시스템 설계와 최적화를 할 때 참고해야 할 중요한 지연 시간을 요약한 개념입니다. Jeff Dean이 Google에서 했던 발표 중 하나에서 유래된 이 데이터는 프로그래머들이 하드웨어 및 소프트웨어의 성능을 이해하고, 예상되는 지연 시간을 효과적으로 계획하는 데 도움이 됩니다.

Latency Comparison Numbers
--------------------------
L1 cache reference                           0.5 ns
Branch mispredict                            5   ns
L2 cache reference                           7   ns                      14x L1 cache
Mutex lock/unlock                           25   ns
Main memory reference                      100   ns                      20x L2 cache, 200x L1 cache
Compress 1K bytes with Zippy            10,000   ns       10 us
Send 1 KB bytes over 1 Gbps network     10,000   ns       10 us
Read 4 KB randomly from SSD*           150,000   ns      150 us          ~1GB/sec SSD
Read 1 MB sequentially from memory     250,000   ns      250 us
Round trip within same datacenter      500,000   ns      500 us
Read 1 MB sequentially from SSD*     1,000,000   ns    1,000 us    1 ms  ~1GB/sec SSD, 4X memory
HDD seek                            10,000,000   ns   10,000 us   10 ms  20x datacenter roundtrip
Read 1 MB sequentially from 1 Gbps  10,000,000   ns   10,000 us   10 ms  40x memory, 10X SSD
Read 1 MB sequentially from HDD     30,000,000   ns   30,000 us   30 ms 120x memory, 30X SSD
Send packet CA->Netherlands->CA    150,000,000   ns  150,000 us  150 ms

Notes
-----
1 ns = 10^-9 seconds
1 us = 10^-6 seconds = 1,000 ns
1 ms = 10^-3 seconds = 1,000 us = 1,000,000 ns

 

주요 지연 시간

하드웨어 및 네트워크

  • L1 캐시 참조: 약 0.5 나노초
  • L2 캐시 참조: 약 7 나노초
  • L3 캐시 참조: 약 12~17 나노초
  • 메인 메모리 참조: 약 100 나노초
  • SSD 랜덤 리드: 약 16-150 마이크로초
  • 하드 드라이브 랜덤 리드: 약 1-10 밀리초
  • 새로운 네트워크 패킷 전송: 약 0.1-1 밀리초

네트워크 지연

  • 동일 데이터 센터 내: 약 0.5 밀리초
  • 동일 도시 내: 약 0.5-1.5 밀리초
  • 대륙간: 약 50-150 밀리초
  • 글로벌: 약 120-240 밀리초

데이터베이스 및 API 호출

  • 일반적인 데이터베이스 쿼리: 1-10 밀리초
  • 복잡한 데이터베이스 쿼리: 10-100 밀리초 이상
  • 간단한 API 요청: 약 100 밀리초
  • 외부 API 요청: 1초 이상 가능

결론

  • 메모리는 빠르지만, 디스크는 아직도 느리다
  • 디스크 탐색(seek)은 가능한 피하라.
  • 단순한 압축 알고리즘은 빠르다.
  • 데이터를 인터넷으로 전송하기 전에 가능하면 압축하라
  • 데이터 센터는 보통 여러 지역에 분산되 있고, 센터들 간에 데이터를 주고받는 데는 시간이 걸린다.

 

사용자 경험과 응답 지연 값

프로그래머가 일반적으로 고려해야 할 몇 가지 기준 지연 시간이 있으며, 이러한 값들은 사용자의 인지와 반응에 기반하여 설정됩니다.

1. 인간의 인지 지연

  • 0.1초 (100 밀리초): 시스템이 즉각적으로 반응하는 것처럼 느껴지는 지연 시간입니다. 이 시간 내에 반응하면 사용자는 시스템이 자신의 행동과 동시에 반응하는 것으로 인지합니다.

2. 느슨한 연결 지연

  • 1초: 사용자가 여전히 흐름을 유지하면서 작업의 연속성을 느낄 수 있는 최대 지연 시간입니다. 이 시간을 초과하면 사용자는 대기하고 있다는 느낌을 받게 됩니다.

3. 사용자의 인내 한계

  • 10초: 사용자가 작업에서 멀어지지 않고 기다릴 수 있는 최대 시간입니다. 이 지연 시간 이상이 되면, 사용자는 보통 다른 작업을 하거나 시스템의 반응을 기다리는 것을 포기할 수 있습니다.

이러한 지연 시간은 인터페이스 설계나 사용자 상호작용을 설계할 때 중요하게 고려됩니다. 또한, 응답 시간은 다음과 같은 다양한 어플리케이션 유형에 따라 달라질 수 있습니다:

4. 웹 페이지 로딩

  • 이상적: 페이지 로딩에 1-2초 이하.
  • 허용 가능: 2-5초.
  • 비효율적: 5초 이상.

5. 데이터베이스 쿼리

  • 이상적: 즉각적인 피드백이 필요한 인터랙티브 시스템의 경우 100밀리초 이하.
  • 허용 가능: 복잡한 쿼리의 경우 몇 초까지도 가능.
  • 비효율적: 몇 분 이상 소요되는 경우.

6. API 응답

  • 이상적: 100밀리초 이하.
  • 허용 가능: 서비스 간 통신의 경우 1-3초.
  • 비효율적: 10초 이상.

 

가용성

가용성(availability)은 시스템이 사용자의 요구를 충족시키기 위해 얼마나 신뢰적으로 그리고 지속적으로 서비스를 제공할 수 있는지를 나타내는 척도입니다. 이는 특히 네트워크, 데이터베이스, 웹 서버 등의 IT 서비스와 시스템에서 중요한 개념으로, 시스템의 가용성이 높다는 것은 시스템이 연속적으로 운영되며 장애에 강하다는 것을 의미합니다.

가용성의 주요 요소

  1. 연속성: 시스템이 중단 없이 계속 작동하는 능력입니다.
  2. 신뢰성: 시스템이 정해진 성능 수준으로 일관되게 작동하는 능력입니다.
  3. 복구력: 시스템이 장애 발생 후 정상 상태로 복구할 수 있는 능력입니다.

가용성 계산

가용성은 보통 백분율로 표현되며, 다음 공식으로 계산할 수 있습니다:

가용성 (%)=(총 운영 시간−장애 시간총 운영 시간)×100

예를 들어, 한 달(30일) 동안의 총 운영 시간이 720시간이고, 이 중 시스템이 다운된 시간이 1시간이라면 가용성은 다음과 같이 계산됩니다:

가용성=(720−1720)×100≈99.86%

 

가용성을 높이는 방법

  1. 중복성 확보: 중요한 구성 요소들을 복제하여 한 부분이 실패하더라도 시스템이 계속 작동할 수 있도록 합니다. 예를 들어, 서버, 데이터베이스, 네트워크 경로의 중복성을 구현할 수 있습니다.
  2. 페일오버 시스템: 주요 시스템이 실패할 경우 자동으로 대체 시스템으로 전환하는 자동 페일오버 메커니즘을 마련합니다.
  3. 정기적인 유지보수 및 테스트: 시스템 구성 요소들의 정기적인 점검과 테스트를 통해 잠재적인 문제를 사전에 파악하고 조치를 취할 수 있습니다.
  4. 모니터링 및 알람 시스템 구축: 시스템의 상태를 지속적으로 모니터링하고, 문제가 발생하면 즉시 알림을 받을 수 있는 시스템을 구축합니다.
  5. 지속적인 성능 최적화: 시스템의 성능을 지속적으로 분석하고 최적화하여 불필요한 부하를 줄이고, 가용성을 향상시킵니다.

 

시스템 성능과 서비스 품질 지표

1. QPS (Queries Per Second)

  • 정의: QPS는 시스템이나 서비스가 1초 동안 처리할 수 있는 쿼리(질의)의 수를 나타냅니다. 주로 웹 서버나 데이터베이스 서버의 처리능력을 측정할 때 사용됩니다.
  • 측정 방법: QPS를 측정하기 위해서는 특정 시간 동안 시스템에 요청된 쿼리의 총 수를 측정하고, 이를 측정된 시간(초)으로 나눕니다.
    • 예: 10분 동안 18,000개의 쿼리를 처리했다면, QPS = 18,000 / (10 * 60) = 30 QPS.

2. TPS (Transactions Per Second)

  • 정의: TPS는 시스템이나 서비스가 1초 동안 처리할 수 있는 트랜잭션의 수를 나타냅니다. 트랜잭션은 하나 이상의 쿼리로 구성될 수 있으며, 종종 데이터베이스 작업이나 비즈니스 로직 처리를 포함합니다.
  • 측정 방법: TPS는 특정 시간 동안 완료된 트랜잭션의 총 수를 그 시간(초)으로 나누어 계산합니다.
    • 예: 10분 동안 12,000개의 트랜잭션을 완료했다면, TPS = 12,000 / (10 * 60) = 20 TPS.

3. SLA (Service Level Agreement)

  • 정의: SLA는 서비스 제공자와 고객 간에 합의된 서비스 수준을 문서화한 계약입니다. 이는 응답 시간, 가용성, 성능 등의 서비스 품질 지표를 포함할 수 있습니다.
  • 측정 방법: SLA 지표는 계약에 명시된 대로 측정되며, 일반적으로 다음과 같은 형태를 포함할 수 있습니다.
    • 가용성: 예를 들어, "99.9% 시간 동안 서비스가 온라인 상태이어야 한다."
    • 응답 시간: "트랜잭션 처리에 걸리는 시간은 평균 200밀리초를 넘지 않아야 한다."
    • 이러한 지표들은 모니터링 도구를 통해 지속적으로 측정되고, 정기적인 리포트를 통해 이행 여부가 검토됩니다.

4. 처리량 (Throughput)

  • 정의: 처리량은 단위 시간당 시스템이 처리할 수 있는 데이터의 양을 말합니다. 이는 종종 초당 비트 수(bps)로 표현되며, 네트워크, 스토리지 시스템, 웹 서버 등 다양한 시스템에서 중요한 지표로 사용됩니다.

5. 대역폭 (Bandwidth)

  • 정의: 대역폭은 네트워크가 특정 시간 동안 전송할 수 있는 최대 데이터량을 나타내며, 보통 초당 비트 수(bps)로 표현됩니다.
  • 측정 방법: 대역폭은 네트워크 장비의 사양이나 트래픽을 측정하는 도구를 통해 측정될 수 있습니다.

6. IOPS (Input/Output Operations Per Second)

  • 정의: IOPS는 주로 스토리지 시스템에서 사용되는 지표로, 시스템이 1초 동안 수행할 수 있는 입출력 작업의 수를 나타냅니다.
  • 측정 방법: IOPS는 디스크의 성능 테스트를 통해 측정되며, 랜덤 또는 순차적 작업으로 나뉘어 집중적인 테스트가 수행됩니다.

7. 지연 시간 (Latency)

  • 정의: 지연 시간은 요청이 발생하고 그에 대한 응답이 돌아오기까지 걸리는 시간을 말합니다. 네트워크, 데이터베이스, API 호출 등 다양한 컨텍스트에서 사용됩니다.
  • 측정 방법: 지연 시간은 특정 요청을 보내고 응답을 받는데 걸린 시간을 측정함으로써 얻어집니다.

8. 패킷 손실률 (Packet Loss Rate)

  • 정의: 패킷 손실률은 네트워크를 통해 전송되는 데이터 패킷 중 손실되는 비율을 나타냅니다.
  • 측정 방법: 패킷 손실은 네트워크 모니터링 도구를 통해 측정되며, 패킷을 보내고 수신된 패킷 수를 비교하여 계산됩니다.

9. 동시성 (Concurrency)

  • 정의: 동시성은 시스템이 동시에 처리할 수 있는 요청의 수를 나타냅니다. 웹 서버, 애플리케이션 서버 등에서 중요한 지표로 사용됩니다.
  • 측정 방법: 동시성은 시스템이 다수의 요청을 동시에 얼마나 효율적으로 처리하는지를 테스트하고 측정함으로써 얻어집니다.

 

측정 예시 (블로그)

가정

- 평균 DAU는 1,000,000명(백 만명)

- 사용자당 하루 평균 10건 정도의 이벤트를 발생함

- 블로거들은 유저 전체의 10%정도로 1000건 정도의 이벤트를 발생함

- 각 이벤트별로 700바이트 크기의 json을 전송함

- 원본은 2년 보관하며 , 테이블 형태로 변환해서 다시 저장해야됨

 

처리량 추정

- 일반 사용자 90만 , 블로거 10만

- 일간 일반 사용자가 전송하는 로그 = 90만 * 10개 

- 일간 블로거가 전송하는 로그 = 10만 * 1000개

- TPS : (900000*10(일반 사용자가 전송한 로그수) + 100000*1000(블로거가 전송한 로그 수)/(24(시간)*3600()) = 1261.57

- 로그 하나당 처리해야되는 데이터 700바이트

- 일간 로그 크기 (900000*10(일반 사용자가 전송한 로그수) + 100000*1000(블로거가 전송한 로그 수)*700 * 8비트 = 610400000000 bits

- bps : 610400000000 / (24*3600) = 7064814.81

 

저장 크기 추정

- 일간 로그 저장 크기 : 610400000000 bits = 568GB

- 복제본 포함 저장 크기 : 568GB *2 = 1136GB

- 2년간 저장시 필요 공간 : 1136GB * 2 * 365 = 829280GB = 809.84 테라바이트 = 0.791 페타바이트(PB)