Files
resume/legend/CAPACITY.md

73 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Справочник цифр нагрузки
Отвечает на класс вопросов «с каким трафиком/масштабом сталкивался» и «как бы ты справился с масштабом X». Домашняя лаба физически не может воспроизвести продовые нагрузки крупной компании — честный подход, зафиксированный в [../AI_GUIDELINES.md](../AI_GUIDELINES.md), состоит из трёх слоёв цифр, которые никогда не смешиваются между собой:
1. **Публичные пределы технологий** — задокументированные производителем/сообществом ориентиры, не выдаваемые за личный опыт.
2. **Замеры на своей лабе** — реальные цифры, полученные прогоном инструментов на CASE.md-стендах этого репозитория.
3. **Реальные масштабы с работы** — заполняются пользователем лично, только фактами со своего места работы; ИИ эти значения не придумывает и не подставляет.
## 1. Публичные пределы технологий
| Технология | Ориентир | Источник/пояснение |
|---|---|---|
| Nginx | Десятки тысяч RPS на ядро на статике; на проксировании (с TLS termination, upstream) — обычно тысячи RPS на инстанс, сильно зависит от бэкенда | Известный порядок величины из документации/бенчмарков nginx; сильно варьируется от конфигурации, поэтому это ориентир, не гарантия |
| Prometheus (один инстанс) | Ориентировочно ~12 млн активных time series на инстанс, десятки-сотни тысяч samples/sec на приём | Официальная документация Prometheus описывает такой порядок как практический предел одного инстанса до необходимости шардирования/federation |
| Mimir / Thanos (горизонтальное масштабирование) | Сотни миллионов активных series суммарно за счёт шардирования ingester/distributor и объектного хранилища | Архитектурная особенность — компонентная модель Mimir специально спроектирована так, чтобы снять ограничение одного Prometheus |
| Elasticsearch (data-нода) | Обычно рекомендуемый размер шарда — десятки ГБ (типовой ориентир ~1050 ГБ на шард), heap-память — не более ~3032 ГБ на JVM-инстанс (ограничение compressed oops в JVM) | Общеизвестная эксплуатационная рекомендация Elastic |
| Kafka (один брокер) | Порядок сотен МБ/сек на брокер при последовательной записи на быстром диске, десятки-сотни тысяч сообщений/сек в зависимости от размера сообщения | Публично известный порядок из документации/бенчмарков Kafka; сильно зависит от диска, размера батча, репликации |
| PostgreSQL | От нескольких тысяч до нескольких десятков тысяч TPS на мощном железе с SSD при простых транзакциях; сильно зависит от синхронности commit, индексов, объёма данных | Общий ориентир, публично встречающийся в бенчмарках `pgbench` |
| Kubernetes | Официальный документированный лимит — до 5000 нод и до 110 подов на ноду на кластер | Официальные Kubernetes Considerations for Large Clusters |
**Важно:** это ориентиры порядка величины, а не гарантированные числа под любую нагрузку — правильный ответ на собеседовании называет порядок и объясняет, от чего он зависит, а не выдаёт одно «магическое число».
## 2. Замеры на своей лабе
Инструкция и место для заполнения — прогнать инструмент на соответствующем CASE.md-стенде и вписать реальный результат. Пока не прогнано — стоит `[замерить]`, не выдуманное число.
**Характеристики машины для замеров:** `[указать: CPU, RAM, диск (SSD/HDD), ОС]` — важно фиксировать, чтобы честно объяснять экстраполяцию на других мощностях.
| Стенд | Инструмент | Команда | Результат |
|---|---|---|---|
| [../stack/nginx/CASE.md](../stack/nginx/CASE.md) | `wrk`/`hey` (не входит в текущий CASE.md, добавить: `hey -n 10000 -c 50 http://localhost:8080/`) | RPS, задержка p50/p99 | `[замерить]` |
| [../stack/monitoring/CASE.md](../stack/monitoring/CASE.md) | Prometheus, число активных series | `curl localhost:9090/api/v1/status/tsdb` | `[замерить]` |
| [../stack/databases/CASE.md](../stack/databases/CASE.md) | `pgbench -c 10 -j 2 -T 30 labdb` | TPS | `[замерить]` |
| [../stack/kafka/CASE.md](../stack/kafka/CASE.md) | `kafka-producer-perf-test.sh --num-records 100000` | records/sec, MB/sec | `[замерить]` |
| [../stack/kubernetes/CASE.md](../stack/kubernetes/CASE.md) | число подов/нод в pet-кластере | `kubectl get nodes`, `kubectl get pods -A \| wc -l` | 3 ноды (1 control-plane + 2 worker), `[число подов после деплоя]` |
Смысл этих цифр не в том, чтобы впечатлить масштабом (лаба заведомо на несколько порядков меньше прод-инсталляций), а в том, чтобы иметь реальную точку отсчёта: «на своей лабе на таком-то железе получил такой-то результат» — это честный, проверяемый факт, в отличие от абстрактного «я знаю, что Prometheus быстрый».
## 3. Реальные масштабы с работы
**Заполняется только пользователем, фактами со своего реального места работы. ИИ не подставляет сюда числа — ни выдуманные, ни «типичные для профиля компании».** Это прямо запрещено правилом честности кейсов в [../AI_GUIDELINES.md](../AI_GUIDELINES.md).
| Показатель | Значение |
|---|---|
| Число серверов в обслуживаемом парке | `[заполнить]` |
| Число targets/эндпоинтов в Prometheus | `[заполнить]` |
| Число дашбордов в Grafana (в резюме: 50) | 50 (уже зафиксировано в [../RESUME.md](../RESUME.md)) |
| Объём логов в сутки (если известно) | `[заполнить]` |
| Число внутренних пользователей систем мониторинга | `[заполнить]` |
| Другие известные показатели нагрузки | `[заполнить]` |
**Про черновые числа в [STORY.md](STORY.md):** там для нарратива (состав отдела, число VM и сервисов) стоят ориентировочные заготовки, явно помеченные как черновик для подтверждения — это не то же самое, что факты этого раздела. Раздел 3 CAPACITY.md остаётся пустым до тех пор, пока сюда не будут вписаны подтверждённые самим кандидатом цифры; правило ИИ не подставлять их сюда самостоятельно действует независимо от черновиков в STORY.md.
## Как отвечать на вопрос про масштаб/трафик
Формула ответа, которая не скатывается ни в выдумывание, ни в беспомощное «не знаю»:
1. **Реальный масштаб, если он есть и подтверждён** — если вопрос про то, с чем реально сталкивался на работе, называть цифры из раздела 3 выше (после того как пользователь их заполнит).
2. **Что замерял на своей лабе и что получил** — честно обозначить, что это домашний стенд, и назвать реальную цифру из раздела 2. Это лучше, чем неопределённое «наверное, справится».
3. **Знание публичных пределов технологии** — показать, что понимаешь порядок величины, на которую рассчитана технология в принципе (раздел 1), и от чего он зависит.
4. **Как масштабировал бы дальше** — если вопрос про гипотетический больший масштаб (как в Bi.Zone про 300 000 серверов), проговорить архитектурный путь: шардирование, горизонтальное масштабирование компонентов, что именно упрётся в лимит первым.
### Разбор конкретного вопроса (Реалист банк): «сколько Гб логов в ELK, если в Prometheus уже 15 Гб метрик»
Правильный ответ не содержит единственного числа — это вопрос на понимание природы данных, а не на память конкретной цифры. Метрики компактны и хорошо сжимаются (числовые ряды с повторяющимися паттернами), логи — произвольный текст без такой плотности. При сопоставимом количестве событий логи обычно занимают на порядок (иногда на два) больше места, чем метрики того же периода — то есть если метрики занимают 15 Гб, разумный ответ — «логи, скорее всего, будут занимать существенно больше, на порядок или больше, в зависимости от verbosity логирования» — с объяснением почему, а не с попыткой угадать точное число. Разбор этого же вопроса в контексте ELK — [../stack/elk/QUESTIONS.md](../stack/elk/QUESTIONS.md).
## Правило непротиворечивости
При добавлении новых цифр:
1. Всегда явно указывать, к какому из трёх слоёв (публичный предел / лабный замер / реальный факт с работы) относится число — никогда не смешивать формулировки так, чтобы лабная цифра выглядела как продовая, или публичный ориентир — как личный опыт.
2. Лабные замеры — обновлять по мере реального прогона инструментов, не оставлять `[замерить]` дольше, чем до следующего прогона соответствующего кейса.
3. Раздел 3 — трогать только по прямому запросу пользователя с реальными данными, никогда не заполнять предположениями.