title: Конспект источника 2 — System Design Primer, Appendix (числа и список вопросов)
source: https://github.com/donnemartin/system-design-primer/blob/master/README.md#appendix
author: Donne Martin (system-design-primer, раздел Appendix)
конспект: подготовлено 2026-09-17, TASK-45.6; числа — дословно из источника; мнемоники и приоритеты тренировки — наши дополнения
статус: эталонный справочник чисел; сжатая экзаменационная версия — ../knowledge-base.md §1 (учить по ней, по этому файлу — сверяться и запоминать контекст)
Источник 2: System Design Primer — Appendix
Appendix — это три части: (1) таблица степеней двойки, (2) «Latency numbers every programmer should know» с производными метриками, (3) список типовых дизайн-вопросов со ссылками на разборы. Первые две части — сырьё для этапа 5 секции (оценка ресурсов и узких мест): интервьюер из статьи Яндекса прямо требует «latency numbers вспомнить обязательно». Третья часть — меню задач для тренировочных раундов и источник вероятных «доп. вопросов».
Связь с подготовкой: ../methodology.md §5 (слот 3 плана — 45 мин на числа), ../knowledge-base.md §1–2 (сжатая версия + back-of-envelope), ../classic-designs.md (на какие вопросы уже есть разборы).
1. Powers of two (таблица степеней двойки)
Дословно из источника:
| Power | Exact Value | Approx Value | Bytes |
|---|---|---|---|
| 2^7 | 128 | ||
| 2^8 | 256 | ||
| 2^10 | 1 024 | 1 thousand | 1 KB |
| 2^16 | 65 536 | 64 KB | |
| 2^20 | 1 048 576 | 1 million | 1 MB |
| 2^30 | 1 073 741 824 | 1 billion | 1 GB |
| 2^32 | 4 294 967 296 | 4 GB | |
| 2^40 | 1 099 511 627 776 | 1 trillion | 1 TB |
Что из этого реально звучит на секции:
- Ключевое приближение: 2^10 ≈ 10^3. Отсюда мгновенные прикидки: миллиард записей (2^30) × 1 КБ (2^10) = 1 ТБ (2^40). Вся back-of-envelope-арифметика storage держится на этом одном правиле.
- 2^32 = 4 294 967 296 ≈ 4.3 млрд — предел 32-битного счётчика: «4 млрд записей — и 32-битный ID/offset кончился» (классический доп. вопрос: почему у Instagram/YouTube id 64-битные).
- 2^16 = 65 536 — 16-битный порт; 64 КБ — размер, который стоит помнить про UDP-датаграммы и максимальный TCP-window старых стеков.
- 2^40 = 1.1 × 10^12 ≈ 10^12 — «триллион строк» уже не влезает ни в одну ноду с индексами: шардирование/колоночные БД.
Мнемоника точных значений: 1 024 → 65 536 (1024 × 64) → 1 048 576 → «1.07 млрд» → «4.29 млрд» → «1.1 трлн». Между соседними «удобными» ступенями (10/16/20/30/32/40) точные значения восстанавливаются умножением: 2^16 = 2^10 × 2^6 = 1024 × 64; 2^20 = 1024²; 2^30 = 1024³; 2^40 = 1024⁴. Достаточно помнить 1024ⁿ + множители, а не цифры.
2. Latency numbers every programmer should know
Дословно из источника (включая ratio-примечания автора):
| Действие | Время | Примечание из источника |
|---|---|---|
| L1 cache reference | 0.5 нс | |
| Branch mispredict | 5 нс | |
| L2 cache reference | 7 нс | 14× L1 |
| Mutex lock/unlock | 25 нс | |
| Main memory reference | 100 нс | 20× L2, 200× L1 |
| Compress 1 KB (Zippy/Snappy) | 10 мкс | |
| Send 1 KB over 1 Gbps network | 10 мкс | |
| Read 4 KB randomly from SSD | 150 мкс | ~1 GB/s SSD |
| Read 1 MB sequentially from memory | 250 мкс | |
| Round trip within same datacenter | 500 мкс | |
| Read 1 MB sequentially from SSD | 1 мс | ~1 GB/s SSD, 4× memory |
| HDD seek | 10 мс | 20× datacenter roundtrip |
| Read 1 MB sequentially from 1 Gbps | 10 мс | 40× memory, 10× SSD |
| Read 1 MB sequentially from HDD | 30 мс | 120× memory, 30× SSD |
| Send packet CA → Netherlands → CA | 150 мс |
Единицы: 1 нс = 10⁻⁹ с; 1 мкс = 1 000 нс; 1 мс = 1 000 мкс. Наглядная версия («latency numbers visualized», где 1 нс растянут до 1 с) — в исходных gists: jboner/2841832, hellerbarde/2843375.
2.1 Ratio-цепочки — как источник предлагает запоминать
Автор не случайно даёт колонку примечаний: запоминаются отношения, а не абсолюты.
- CPU-локальность: L2 = 14× L1; RAM = 20× L2 = 200× L1. Каждый выход за кэш — кратная потеря.
- Случайный доступ: random 4 KB с SSD (150 мкс) стоит примерно как 1 МБ из RAM (250 мкс) — и в ~67× дешевле HDD-seek (10 мс). Поэтому «HDD — только sequential, random — на SSD/RAM».
- Транспорт: «сжать 1 КБ» и «передать 1 КБ по гигабиту» стоят одинаково (10 мкс) — сжатие перед отправкой почти всегда выгодно.
- Классическая четвёрка «1 МБ последовательно»: RAM 250 мкс → SSD 1 мс (4×) → 1 Gbps 10 мс (10×) → HDD 30 мс (30×). Мегабайт из памяти — 120× быстрее, чем с HDD.
- Два масштаба сети: RT внутри ДЦ 0.5 мс vs RT через океан 150 мс — разница 300×; HDD-seek = 20× RT ДЦ (диск дольше, чем сетевой хоп!).
3. Производные метрики («handy metrics» из источника)
Источник сводит таблицу к шести числам «на поток»:
| Метрика | Значение | Практические следствия для back-of-envelope |
|---|---|---|
| Sequential read HDD | 30 MB/s | 1 ГБ ≈ 33 с; ~108 ГБ/час; 1 ТБ ≈ 9 ч. Значит: батч-джобы по терабайтам на HDD-кластере — это часы, не минуты |
| Sequential read 1 Gbps | 100 MB/s | 1 ГБ = 10 с; 1 ТБ ≈ 3 ч. Проверка узких мест сети: 1 000 RPS × 100 КБ ответ = 100 МБ/с — гигабитный порт впритык |
| Sequential read SSD | 1 GB/s | 1 ГБ = 1 с; 1 ТБ ≈ 17 мин. SSD-нода «ест» данные со скоростью сети 10G — диск больше не узкое место для sequential-нагрузок |
| Sequential read RAM | 4 GB/s | 1 ГБ = 0.25 с; скан 100 ГБ целиком в памяти ≈ 25 с. Поэтому in-memory-кэш/движки меняют класс задачи |
| Round trips worldwide | 6–7/с | RT через океан ≈ 150 мс. Один синхронный межконтинентальный вызов в горячем пути съедает треть бюджета p99 в 500 мс |
| Round trips in datacenter | ~2 000/с | Хоп ≈ 0.5 мс. Цепочка из 5 последовательных сервисов = 2.5 мс только на сеть — говорим про depth запроса |
Полезная связка (наша): 10 Gbps ≈ 1.25 GB/s ≈ скорость sequential-read SSD — сеть 10G сравнялась с диском; RAM (4 GB/s ≈ 32 Gbps) — уровень сетей 32–40G, «память быстрая, но сеть до неё ещё не дотянулась».
4. Мнемоники и тренажёр проговора
4.1 Лестница (учить одной фразой)
«Пол-нано — кэш, сто нано — память, десять микро — сеть/сжатие килобайта, полмилли — хоп в ДЦ, десять милли — HDD-seek и мегабайт по сети, тридцать милли — мегабайт с HDD, сто пятьдесят милли — океан».
Уровни: нс (CPU/RAM) → мкс (сеть/сжатие/SSD-random) → мс (RT ДЦ, SSD-мегабайт, HDD, мегабайт по сети) → сотни мс (океан). В каждой ступени — свои «дела», перепутать нельзя.
4.2 Человеческий масштаб (1 нс = 1 с)
| Действие | «Человеческое» время | Запоминалка |
|---|---|---|
| L1 cache | 1 с | «моргнул — уже ответ» |
| RAM | ~2 мин | «сходил до холодильника» |
| SSD random 4 KB | ~2 суток | «выходные без интернета» |
| RT в ДЦ | ~6 суток | «неделя на согласование» |
| HDD seek | ~4 месяца | «один семестр» |
| 1 МБ с HDD | ~1 год | «диплом не напишешь» |
| RT через океан | ~5 лет | «одна поездка на другой континент — половина вуза» |
Отсюда разговорная формулировка для доски: «в масштабе процессора поход в соседний дата-центр — это командировка на неделю, а через океан — на пять лет; поэтому кэш, батчинг и локальность».
4.3 Ratio-якоря (проговаривать парами)
- RAM : SSD-random = 100 нс : 150 мкс = 1 : 1500 — «случайное чтение на SSD — это полторы тысячи походов в память».
- RT-ДЦ : океан = 0.5 мс : 150 мс = 1 : 300 — «десять хопов в ДЦ дешевле одного океанского вызова на два порядка».
- HDD-seek : RT-ДЦ = 1 : 20 — «seek медленнее сетевого хопа в 20 раз» (ломает интуицию — аудитория запоминает).
- Мегабайт: RAM → SSD → 1Gbps → HDD = 0.25 мс → 1 мс → 10 мс → 30 мс — «каждый шаг вниз по пирамиде хранения ×4–30».
4.4 Тренажёр (5 минут в день, до слота 18.09)
- Закрыть таблицы, написать от руки: степени двойки (6 строк), latency (15 строк), 6 производных метрик.
- Проговорить вслух три ratio-якоря и лестницу из §4.1.
- Решить на скорость (по 60 с, из KB §2): storage для 100 млн ссылок/мес; QPS для 100M DAU × 10 чтений; bandwidth для 100k просмотров × 110 МБ. Проверка по KB §2.2–2.4.
- Критерий готовности: все 15 latency-строк + 6 метрик без запинки, три back-of-envelope за 60 с каждый.
5. Дополнительные вопросы из Appendix (меню тренировок)
Третья часть Appendix — 23 типовых дизайн-вопроса со ссылками на разборы. Переведены и разложены по подготовке. Приоритет: HR сказал «крупноблочная схема инстаграм/твиттер» → всё, что является подсистемой соцсети, тренеруем как мини-секции (15–20 мин на доске), остальное — общий кругозор.
5.1 Уже покрыты эталонами (classic-designs.md)
| Вопрос из Appendix | Наш разбор |
|---|---|
| Design a tinyurl system (Bitly) | §1 URL shortener — эталон Яндекса |
| Design the Facebook news feed | §2 Лента новостей (Instagram/Twitter) |
| Design a chat app (WhatsApp) / Facebook chat | §3 Мессенджер |
| Design a picture sharing system (Instagram, Picasa) | §4 Медиа-хостинг |
5.2 Подсистемы соцсетей — мини-секции для тренировки (приоритет)
| Вопрос | Ключевая идея | Ссылка из источника |
|---|---|---|
| Design an API rate limiter | token/leaky bucket, Redis+Lua, 429+Retry-After | stripe.com/blog/rate-limiters |
| Design a trending topic system (Twitter) | sliding window + count-min sketch, поток через Kafka/Storm | michael-noll.com |
| Return the top k requests during a time interval | heap k-top, windowed counters | cs.ucsb.edu |
| Design a random ID generation system | Snowflake: время+машинa+счётчик, сортируемые 64-бит ID | blog.twitter.com (Snowflake) |
| Design the Facebook timeline | денормализация, pre-computed страницы | facebook.com (note) |
| Design a key-value store (Redis/Dynamo) | consistent hashing, quorum W+R>N, hinted handoff | Dynamo paper |
| Design a cache system (Memcached) | cache-aside, консистентность, hot keys | slideshare.net |
| Design a CDN (CloudFlare) | edge-кэш, origin shield, инвалидация, geo-DNS | figshare.com |
Логика: rate limiter, trending/top-k, Snowflake-ID и timeline сами всплывают внутри инстаграм/твиттер на этапе «детали» — отработать их отдельно, чтобы на секции называть одним предложением.
5.3 Общий кругозор (читать разбор, не тренеровать доской)
| Вопрос | Ключевая идея | Ссылка из источника |
|---|---|---|
| Design a search engine (Google) | crawler → инвертированный индекс → ранжирование | queue.acm.org |
| Design a scalable web crawler | BFS frontier, politeness, dedup URL | quora.com |
| Design a file sync service (Dropbox) | чанки, дедуп, sync-протокол, дельты | youtube.com |
| Design Google Docs | совместное редактирование, OT/CRDT | neil.fraser.name/writing/sync |
| Design a recommendation system (Amazon) | item-to-item collaborative filtering | ijcai13.org |
| Design a graph search (Facebook) | соцграф, index по типам рёбер | facebook.com (note) |
| Serves data from multiple data centers | geo-репликация, направление записи, консистентность | highscalability.com |
| Design an online multiplayer card game | async-состояние игры, вебсокеты | buildnewgames.com |
| Design a garbage collection system | mark-and-sweep на уровне идей | stuffwithstuff.com |
| Design a stock exchange (NASDAQ/Binance) | order book, matching engine, латентность | Jane Street (youtube) |
5.4 Real world architectures (четвёртая часть Appendix)
Там же в Appendix — каталог «как это устроено в реальности» (MapReduce, Spark, Bigtable, Cassandra, Dynamo, Spanner, Kafka, GFS/HDFS, Chubby, Dapper + архитектуры компаний: Twitter, Facebook/Instagram, Netflix, WhatsApp, Pinterest…). Правило источника: не заучивать детали, а извлекать общие паттерны — какую проблему решает каждый компонент, где работает, где нет, чему авторы научились. Для нашей секции самые релевантные: Twitter timelines at scale (fan-out, лекция InfoQ), Instagram 14M users (аккуратнее: цифры 2011 года — используйте как иллюстрацию эволюции, не как факт), Scaling memcached at Facebook.
Полный каталог — в исходном README ниже раздела вопросов: README.md#real-world-architectures.
Связанные документы
../knowledge-base.md§1–2 — сжатая экзаменационная версия этих таблиц + back-of-envelope-примеры../methodology.md§5 — куда вставить тренажёр из §4 в план подготовки под слоты../classic-designs.md— разборы по четырём вопросам из §5.1sdp-guide.md— конспект полного гайда (TASK-45.7, следующая часть источника)