데이터의 크기 추정
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에는 여러 가지 인코딩 형식이 있습니다:
- UTF-8: 가장 일반적으로 사용되는 Unicode 인코딩으로, 1~4바이트를 사용하여 문자를 인코딩합니다. ASCII와의 호환성을 유지하며, 문자에 따라 다양한 크기를 가질 수 있습니다.
- UTF-16: 문자에 따라 2바이트 또는 4바이트를 사용합니다. 주로 시스템 내부에서 사용됩니다.
- 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 서비스와 시스템에서 중요한 개념으로, 시스템의 가용성이 높다는 것은 시스템이 연속적으로 운영되며 장애에 강하다는 것을 의미합니다.
가용성의 주요 요소
- 연속성: 시스템이 중단 없이 계속 작동하는 능력입니다.
- 신뢰성: 시스템이 정해진 성능 수준으로 일관되게 작동하는 능력입니다.
- 복구력: 시스템이 장애 발생 후 정상 상태로 복구할 수 있는 능력입니다.
가용성 계산
가용성은 보통 백분율로 표현되며, 다음 공식으로 계산할 수 있습니다:
가용성 (%)=(총 운영 시간−장애 시간총 운영 시간)×100
예를 들어, 한 달(30일) 동안의 총 운영 시간이 720시간이고, 이 중 시스템이 다운된 시간이 1시간이라면 가용성은 다음과 같이 계산됩니다:
가용성=(720−1720)×100≈99.86%
가용성을 높이는 방법
- 중복성 확보: 중요한 구성 요소들을 복제하여 한 부분이 실패하더라도 시스템이 계속 작동할 수 있도록 합니다. 예를 들어, 서버, 데이터베이스, 네트워크 경로의 중복성을 구현할 수 있습니다.
- 페일오버 시스템: 주요 시스템이 실패할 경우 자동으로 대체 시스템으로 전환하는 자동 페일오버 메커니즘을 마련합니다.
- 정기적인 유지보수 및 테스트: 시스템 구성 요소들의 정기적인 점검과 테스트를 통해 잠재적인 문제를 사전에 파악하고 조치를 취할 수 있습니다.
- 모니터링 및 알람 시스템 구축: 시스템의 상태를 지속적으로 모니터링하고, 문제가 발생하면 즉시 알림을 받을 수 있는 시스템을 구축합니다.
- 지속적인 성능 최적화: 시스템의 성능을 지속적으로 분석하고 최적화하여 불필요한 부하를 줄이고, 가용성을 향상시킵니다.
시스템 성능과 서비스 품질 지표
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)