테마 선택

📚 지식 노트

AI·하드웨어·주변기기·게임·컴퓨터 시스템·이론 컴퓨터 과학·수학·개발과 운영·보안·응용 분야에 대해 알아 두면 좋은 내용을 정리한 노트다. 위에서 분야를 고르고 아래에서 노트를 고른다.

설계 면접과 개략 추정

막연한 문제를 범위가 정해진 설계로 바꾸는 진행 순서와, 봉투 뒷면 계산으로 규모를 어림하는 법이다.

목차 (5)
  1. 설계 질문을 푸는 네 단계
  2. 2의 거듭제곱과 단위
  3. 지연 시간 숫자
  4. 가용성과 9의 개수
  5. 개략 추정: 예제 하나

설계 질문을 푸는 네 단계

"채팅 서비스를 설계해 보라"는 질문에는 정답이 없다. 사용자가 백 명인지 십억 명인지, 메시지를 영원히 남기는지, 단체방이 있는지에 따라 전혀 다른 시스템이 된다. 그래서 설계 면접이든 실제 설계 회의든, 막연한 질문을 범위가 정해진 문제로 바꾸는 것이 첫 일이다. 진행은 대략 네 단계로 나눌 수 있다.

설계 질문을 푸는 네 단계: 범위를 정하고, 큰 그림을 그리고, 병목 한두 곳을 깊이 파고, 남은 위험과 개선점으로 마무리한다. 시간은 깊이 파기에 가장 많이 쓴다① 범위 정하기누가, 얼마나, 무엇을기능·규모·제약 묻기시간: 짧게② 큰 그림부품과 데이터 흐름API와 저장소 고르기시간: 중간③ 깊이 파기병목 한두 곳대안과 대가 견주기시간: 가장 길게④ 마무리남은 위험과 개선점장애·운영·다음 규모시간: 짧게단계 사이를 오가도 된다. 깊이 파다가 범위가 틀렸다는 것을 알면 ①로 돌아간다
설계 질문을 푸는 네 단계. 시간은 깊이 파기에 가장 많이 쓰고, 범위가 틀렸다는 것을 알면 언제든 앞으로 돌아간다.
  1. 범위 정하기: 바로 그리기 시작하지 않는다. 핵심 기능 두세 개, 사용자 수와 증가 속도, 읽기와 쓰기의 비율, 지연과 일관성 중 무엇이 더 중요한지 묻는다. 답이 없으면 스스로 가정을 세우고 말로 확인받는다. 이 가정이 다음 절들의 개략 추정에 들어간다.
  2. 큰 그림: 클라이언트부터 저장소까지 부품을 상자로 그리고 요청 하나가 지나가는 길을 따라가 본다. 주요 API와 데이터 모양(무엇을 어디에 저장하나)도 이때 정한다. 아직 세부는 비워 둔다.
  3. 깊이 파기: 전체를 고르게 다듬기보다 이 시스템에서 가장 어려운 한두 곳을 고른다. 쓰기가 몰리는 곳, 일관성이 깨지기 쉬운 곳, 데이터가 가장 큰 곳이다. 대안을 두세 개 놓고 무엇을 얻고 무엇을 잃는지 견준다.
  4. 마무리: 설계의 약점을 스스로 짚는다. 어느 부품이 죽으면 어떻게 되는지, 규모가 열 배가 되면 무엇이 먼저 막히는지, 무엇을 재고 경보할지 말한다.

어느 단계에서든 핵심은 결정마다 이유를 말하는 것이다. "캐시를 쓴다"보다 "읽기가 쓰기의 50배라 캐시를 두고, 몇 초 늦은 값은 괜찮다고 했으니 TTL로 무효화한다"가 설계다. 다음 절들은 이런 판단에 숫자를 붙이는 도구다.

2의 거듭제곱과 단위

컴퓨터의 크기는 2의 거듭제곱으로 늘지만 사람은 10의 거듭제곱으로 센다. 개략 추정에서는 210 = 1,024를 천으로, 220을 백만으로 어림한다. 210마다 오차가 2.4%씩 곱해져 쌓이므로 페타바이트쯤에서 12% 남짓 벌어지지만, 자릿수를 맞히는 것이 목적인 추정에서는 충분하다.

2의 10제곱부터 50제곱까지의 정확한 값과 이진 단위, 10의 거듭제곱 어림, 어림 오차. 2의 10제곱은 천보다 2.4% 크고, 2의 50제곱은 1000조보다 12.6% 크다거듭제곱정확한 바이트 수이진 단위어림어림보다 큰 정도2^101,024KiB천(10³)+2.4%2^201,048,576MiB백만(10⁶)+4.9%2^301,073,741,824GiB10억(10⁹)+7.4%2^401,099,511,627,776TiB1조(10¹²)+10.0%2^501,125,899,906,842,624PiB1000조(10¹⁵)+12.6%디스크 제조사의 TB는 10¹², 운영체제가 보여 주는 TiB는 2⁴⁰이다. 1TB 디스크가 약 931GiB로 보이는 이유다
2의 거듭제곱과 그 어림. 지수가 10 늘 때마다 1000배로 셈하면 된다. 정확한 값과의 차이는 표의 오른쪽 열이다.

그래서 단위 이름도 둘로 나뉜다. 국제 표준(IEC)은 2의 거듭제곱 단위에 KiB·MiB·GiB 같은 이름을 따로 붙였고, KB·MB·GB는 10의 거듭제곱에 남겼다(NIST의 이진 접두어 설명). 현실에서는 둘이 섞여 쓰이므로, 추정할 때는 어느 쪽인지 정해 두고 끝까지 같은 쪽으로 계산한다. 이 노트의 예제는 10진 단위를 쓴다.

지연 시간 숫자

설계 판단의 상당 부분은 "무엇이 무엇보다 몇 배 느린가"에 달려 있다. 메모리 참조와 데이터센터 안 왕복, 대륙 간 왕복은 각각 자릿수가 몇 개씩 다르다. 이 차이를 머리에 넣어 두려고 많이 인용하는 목록이 있다. Peter Norvig의 글 Teach Yourself Programming in Ten Years에 실린 PC의 대략적인 연산 시간 표가 출발점이고, Jeff Dean이 2009년 LADIS 기조연설 Designs, Lessons and Advice from Building Large Distributed Systems에서 "Numbers Everyone Should Know"라는 이름으로 퍼뜨렸다. 지금 가장 많이 보는 판은 Jonas Bonér가 정리한 Latency Numbers Every Programmer Should Know gist다.

지연 시간을 로그 눈금으로 비교한 막대그래프. L1 캐시 참조 0.5ns, 메인 메모리 참조 100ns, SSD 4KB 무작위 읽기 150µs, 같은 데이터센터 왕복 500µs, HDD 탐색 10ms, 캘리포니아와 네덜란드 왕복 150ms1ns1µs1msL1 캐시 참조0.5ns분기 예측 실패5ns메인 메모리 참조100ns1KB를 1Gbps로 보내기10µsSSD에서 4KB 무작위 읽기150µs같은 데이터센터 왕복500µsSSD에서 1MB 순차 읽기1msHDD 탐색(seek)10ms캘리포니아↔네덜란드 왕복150ms눈금 한 칸이 1000배다. 값은 2010년대 초 하드웨어 기준의 대략이고, 지금 SSD와 네트워크는 더 빠르다
지연 시간을 로그 눈금으로 그렸다. 막대 길이의 차이 한 칸이 1000배다. 정확한 값보다 서로의 자릿수 차이를 보는 그림이다.
  • 값은 낡았다: gist 스스로 2012년 무렵 숫자라고 밝힌다. 요즘 NVMe SSD의 4KB 무작위 읽기는 수십~100µs, 데이터센터 네트워크는 25~100Gbps가 흔하다. Colin Scott의 연도별 지연 시간 그림은 하드웨어 추세로 값이 어떻게 변해 왔는지 어림해 보여 준다. 다만 이것도 추세를 이어 그린 추정이다.
  • 그래도 순서는 같다: 메모리는 SSD보다, SSD는 네트워크 왕복보다, 같은 건물 안 왕복은 대륙 간 왕복보다 여전히 자릿수가 다르게 빠르다. 대륙 간 왕복은 빛의 속도가 바닥이라 앞으로도 크게 줄지 않는다.
  • 그래서 나오는 원칙: 디스크 탐색과 대륙 간 왕복을 피한다. 자주 읽는 것은 메모리에 두고, 보내기 전에 압축하고, 사용자 가까이에 데이터센터와 CDN을 둔다.

덧붙여, 2026년의 gist에는 LLM이 토큰 하나를 만들거나 첫 토큰을 내기까지 걸리는 시간 같은 새 줄이 더해졌다. 숫자 목록이 시대에 따라 계속 고쳐 쓰인다는 것 자체가 이 숫자들을 외우기보다 그때그때 재 봐야 하는 이유다.

가용성과 9의 개수

가용성은 시스템이 제대로 답한 시간(또는 요청)의 비율이다. 흔히 9의 개수로 말한다. 99.9%는 "9 세 개", 99.99%는 "9 네 개"다. 9가 하나 늘 때마다 허용되는 중단 시간은 10분의 1로 줄고, 만드는 비용은 크게 는다. 1년을 365일로 두고 직접 계산하면 아래와 같다.

가용성별 1년 동안 허용되는 중단 시간: 99%는 3.65일, 99.9%는 8.76시간, 99.99%는 52.6분, 99.999%는 5.26분, 99.9999%는 31.5초가용성1년에 멈춰도 되는 시간(로그 눈금)99%9 두 개3.65일99.9%9 세 개8.76시간99.99%9 네 개52.6분99.999%9 다섯 개5.26분99.9999%9 여섯 개31.5초1년 = 365일로 계산. 직렬로 이어진 부품의 가용성은 곱해진다: 99.9% 두 개를 거치면 약 99.8%
9가 하나 늘 때마다 1년에 멈춰도 되는 시간이 10분의 1이 된다. 99.99%면 1년에 한 시간도 안 된다.
  • SLA·SLO·SLI: 재는 값이 SLI(예: 성공한 요청의 비율), 팀이 정한 목표가 SLO(예: 30일 동안 99.9%), 고객과 맺은 약속과 위반 시 보상이 SLA다. 보통 SLO를 SLA보다 엄격하게 잡아 여유를 둔다.
  • 직렬 부품은 곱해진다: 요청이 99.9%짜리 부품 두 개를 차례로 거치면 전체는 0.999 × 0.999 ≈ 99.8%다. 부품이 늘수록 각 부품은 목표보다 더 높아야 한다. 반대로 같은 부품을 여럿 두고 하나만 살아 있으면 되게 만들면(병렬) 가용성이 오른다.
  • 100%는 목표가 아니다: 사용자의 휴대폰 회선이나 와이파이가 이미 그보다 덜 믿음직하다. Google SRE 책의 Embracing Risk 장은 목표에서 남는 몫을 "오류 예산"으로 삼아 새 기능 배포의 속도를 정하는 방식을 설명한다. 같은 책 부록의 Availability Table에 9의 개수별 허용 중단 시간이 정리되어 있다.

개략 추정: 예제 하나

개략 추정(back-of-the-envelope estimation)은 봉투 뒷면에 적을 만큼 짧은 계산으로 규모를 어림하는 것이다. 목적은 정확한 값이 아니라 설계를 가르는 질문에 답하는 것이다. 서버 한 대로 되나, 백 대가 필요한가? 저장소가 테라바이트인가, 페타바이트인가? 사진을 올리는 글 공유 서비스를 예로 들어 보자.

가정: 일간 사용자 1000만 명, 한 명이 하루 글 2개를 쓰고 50개를 읽음, 피크는 평균의 2배, 글 1KB, 20%에 사진 2MB, 5년 보관, 3벌 복제. 결과: 쓰기 QPS 약 231, 읽기 QPS 약 5787, 피크 읽기 약 11574, 하루 저장량 8.02TB, 5년 복제 포함 43.9PB, 유입 대역폭 92.8MB/s가정일간 사용자(DAU) 1,000만 명한 명이 하루 글 2개 쓰고글 50개 읽는다피크 = 평균 × 2글 하나 1KB(본문·메타데이터)글의 20%에 사진 2MB5년 보관, 3벌 복제계산하루 쓰기 수20,000,000건10,000,000 × 2쓰기 QPS≈ 23120,000,000 ÷ 86,400초읽기 QPS≈ 5,78710,000,000 × 50 ÷ 86,400초피크 QPS쓰기 463 · 읽기 11,574평균 × 2하루 저장량8.02TB글 1KB + 사진 20% × 2MB5년·복제 3벌43.9PB하루 × 365 × 5 × 3평균 유입 대역폭92.8MB/s하루 저장량 ÷ 86,400초
1 / 8

가정부터 적는다. 숫자는 면접관과 합의하거나 비슷한 서비스에서 빌려 온다.

사진을 올리는 글 공유 서비스의 개략 추정. 저장량은 10진 단위(1KB = 1000바이트)로 셈했다. 답의 정확한 값보다 자릿수와 무엇이 가장 큰지가 중요하다.

결과에서 읽어 낼 것은 이렇다. 쓰기 QPS는 수백이라 쓰기 경로는 크게 걱정할 일이 아니다. 읽기는 쓰기의 25배이고 피크에 1만을 넘으니 캐시와 읽기 복제본이 필요하다. 저장량의 거의 전부는 사진이라 글 본문은 데이터베이스에, 사진은 객체 저장소에 두는 설계가 자연스럽다. 5년이면 복제까지 수십 PB라, 오래된 사진을 싼 저장 계층으로 옮기는 정책도 생각해야 한다.

  • 어림해서 셈한다: 하루는 86,400초지만 약 105초로 쳐도 된다. 그러면 하루 2천만 건은 초당 200건쯤이다. 정확한 값은 231이지만 결론은 같다.
  • 단위를 적는다: 바이트와 비트(네트워크 대역폭은 보통 비트로 센다), KB와 KiB, 초당과 하루당을 섞으면 자릿수가 틀린다. 숫자마다 단위를 붙여 쓴다.
  • 가정을 드러낸다: 평균이 아니라 피크로 설계하고, 피크 배수와 증가율을 가정으로 적는다. 가정이 바뀌면 계산 전체를 다시 할 수 있게 한다.
  • 가장 큰 항만 본다: 위 예에서 글 본문 20GB는 사진 8TB 옆에서 무시해도 된다. 큰 항을 찾으면 설계를 어디에 집중할지가 보인다.
  • QPS에서 서버 수로: 서버 한 대가 초당 처리할 요청 수를 가정하면(부하 시험으로 재는 것이 가장 좋다) 필요한 대수가 나온다. 한 대가 빠져도 견디게 하나 더 둔다(규모 확장의 단계 노트).