Наблюдаемость, антипаттерны и производственный триаж
USE + RED указывает какой рычаг тянуть; pg_stat_statements, pg_stat_activity и pg_stat_user_tables — это глаза. Postgres на 200M строк, 600 backends и 40 GB bloat имеет трёхнедельный порядок триажа — модель семи актов работает как аварийный протокол.
Ты наследуешь Postgres на 200M строк, p95 1500 мс, 600 concurrent backends, 40 GB bloat, без pooler, одиночный узел. Три недели на стабилизацию. Модель семи актов — не просто история роста, это также протокол триажа. Работай от самого острого failure mode к самому структурному, а не наоборот.
USE + RED для Postgres
Без системного маппинга сигнал → акт инженеры под давлением тянут не тот рычаг — запускают VACUUM FULL на раздутой таблице, пока настоящий виновник — idle-соединение, фиксирующее xmin-горизонт. USE + RED (Rate, Errors, Duration — скорость, ошибки, длительность) даёт этот маппинг.
Метод USE (Utilization, Saturation, Errors — утилизация, насыщение, ошибки) маппится на сигналы Postgres:
- Utilization: число backends vs
max_connections(pg_stat_activity), CPU из отношенияpg_stat_bgwriter.checkpoints_req, hit rate буферного кеша (pg_buffercache). - Saturation: отставание autovacuum (
pg_stat_user_tables.last_autovacuum), задержка репликации (pg_stat_replication.replay_lag), глубина очереди соединений (PgBouncerSHOW STATS). - Errors: число deadlock (
pg_stat_database.deadlocks), ошибки checksum, ошибки репликации из серверных логов.
Метод RED (Rate, Errors, Duration) поверх pg_stat_statements:
- Запросов/секунду на
queryid. - Error rate из логов приложения (таймауты, deadlocks).
- p95/p99 duration на
queryid.
Вместе они говорят какой рычаг тянуть:
| Сигнал | Вероятный акт |
|---|---|
| Высокое число backends, низкий CPU | Акт 5 (проблема пулинга) |
| Много мёртвых tuples, стабильное число строк | Акт 4 (проблема vacuum/bloat) |
| Конкретный queryid с растущей duration | Акт 2 или 3 (проблема индекса или статистики) |
| Растущий p95 + горячие шарды одного tenant | Акт 7 (проблема hot shard) |
Диагностический инструментарий на каждый акт
- Акт 1 (схема): нет хорошего инструментария — читай определение таблицы и трассируй миграции.
\d+ tablenameв psql. - Акт 2 (индексы):
pg_indexesдля проверки наличия;pg_stat_user_indexes(колонкаidx_scan) для поиска неиспользуемых индексов — индекс с 0 сканов за неделю трафика это налог на write throughput. - Акт 3 (планирование):
pg_stat_statementsдля топ-N запросов по total time;EXPLAIN (ANALYZE, BUFFERS)для реального плана;auto_explain.log_min_duration = '500ms'для триажа хвостовой латентности. - Акт 4 (bloat):
pg_stat_user_tables.n_dead_tupvsn_live_tup;pg_table_size(relname)для реального диска;pgstattupleдля точного процента bloat без полного скана. - Акт 5 (пулинг):
pg_stat_activityдля числа backends, распределенияstate, сессийidle in transaction; PgBouncerSHOW STATSдля глубины очереди и среднего времени запроса. - Акт 6 (миграции):
pg_locksjoin сpg_stat_activityдля обнаружения lock contention и блокировщиков перед запуском ALTER. - Акт 7 (шардинг): метрики уровня приложения — хвостовая латентность на шард, дисперсия записей по шардам, частота cross-shard join-ов. Отсутствующий или неверно интерпретированный инструментарий — причина пропуска актов: «Мы не видим bloat» означает, что видимость autovacuum отключена, а не что bloat не существует.
Трёхнедельный порядок триажа
Наследуешь Postgres на 200M строк, p95 1500 мс, 600 concurrent backends, 40 GB bloat, без pooler:
Неделя 1 — остановить кровотечение:
- Убить long transactions:
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle in transaction' AND query_start < now() - interval '5 minutes'. - Установить
idle_in_transaction_session_timeout = 60s, чтобы проблема не повторилась за ночь. - Развернуть PgBouncer в transaction-mode перед Postgres. Размер пула на основе active concurrent transactions, не числа workers (шаг 1 раскрывает реальный конкурентный уровень).
- Запустить
pg_repackна раздутых таблицах онлайн — AccessExclusiveLock не требуется.
Неделя 2 — восстановить качество планов:
ANALYZEна наиболее запрашиваемых таблицах.CREATE STATISTICSдля топ коррелированных пар колонок из медленных запросовpg_stat_statements.- Проверить топ-N в
pg_stat_statementsпо total_time; удалить неиспользуемые индексы (idx_scan = 0); добавить очевидно отсутствующие.
Неделя 3 — оценка мощности:
- Измерить реальный single-node ceiling с пулом на месте. Построить кривую p95 vs QPS.
- Если одиночный узел не справляется с ожидаемой нагрузкой: оценить declarative partitioning (одиночный узел, меньше операций) перед шардингом.
- Только потом планировать Акт 7 — с shard key, co-location и онлайн-решардингом, отрепетированными в staging.
XID wraparound и autovacuum freeze
Каждая строка несёт 32-битный transaction ID (xmin). Когда кластер достигает 2^31 транзакций (~2.1 миллиарда), ID оборачиваются и строки могут казаться «из будущего». Postgres защищает от этого, замораживая старые строки (перезаписывая xmin специальным «замороженным» значением) до wraparound. autovacuum_freeze_max_age контролирует триггер.
На write-heavy кластере при 10K TPS это ~864M транзакций в день — freeze запускается каждые ~2.5 дня. Неверная конфигурация (очень высокий autovacuum_freeze_max_age) может привести к аварийным anti-wraparound vacuum, удерживающим эксклюзивную блокировку на таблице.
Мониторинг: SELECT datname, age(datfrozenxid) FROM pg_database; — алерт при 80% от autovacuum_freeze_max_age.
Каталог антипаттернов при пропуске акта
- Пропусти Акт 1: год спустя ты тратишь три недели на переименование колонки, потому что в схеме нет суррогатного ключа и каждый FK должен меняться.
- Пропусти Акт 2: каждый запрос дашборда — 30-секундный seq-scan; команда приложения добавляет кеши повсюду; кеш становится новым source of truth и рассинхронизируется.
- Пропусти Акт 3: индексы есть, но планировщик игнорирует их половину времени; пишешь runbook, который говорит «если медленно, перезапусти Postgres», потому что это сбрасывает план кеш.
- Пропусти Акт 4: OOM-killer убивает Postgres в пятницу; postmortem говорит «добавим мониторинг»; никогда не случается.
- Пропусти Акт 5: каждый деплой триггерит connection storm; CI теперь растягивает pod rollouts на 10 минут «как воркэраунд».
- Пропусти Акт 6: миграции запускаются только в квартальном окне обслуживания, потому что больше ничего безопасно; очередь ожидающих миграций вырастает до 40 записей.
- Пропусти Акт 7: ты тратишь шесть месяцев объясняя руководству, что один tenant использует 40% мощности и единственное исправление — реархитектура.
- Cache hit ratio — порог алерта
- ниже 95–99%
- n_dead_tup / n_live_tup — алерт на bloat
- выше 20%
- age(datfrozenxid) — алерт на wraparound
- 80% от autovacuum_freeze_max_age
- PgBouncer SHOW STATS: avg_wait_time алерт
- выше 5 мс sustained
- pg_stat_statements total_time алерт
- запросы > 1с потребляющие > 5% от total
- Алерт на задержку репликации
- выше 30 секунд на async replica
▸Почему это работает
Модель семи актов — одновременно growth framework (рычаги проектирования по порядку) и triage framework (применяй исправления в порядке обратном остроте сбоя). Во время аварии ты не винишь схему (Акт 1); ты убиваешь long transactions (Акт 4), затем развёртываешь pooler (Акт 5), затем оптимизируешь запросы (Акты 2–3). После восстановления стабильности делаешь postmortem и пишешь runbooks для каждого акта, чтобы предотвратить следующий инцидент. Порядок актов — не просто ограничение проектирования, это аварийный протокол.
pg_stat_user_tables показывает n_dead_tup = 80M в таблице с n_live_tup = 100M. Правильный диагноз и первый рычаг?
Какова роль backend_xmin в pg_stat_activity для диагностики bloat?
Почему hot_standby_feedback = on переносит bloat с реплики на primary?
- 01Сопоставь метод USE с сигналами Postgres, указывающими на каждый из семи актов.
- 02Ты наследуешь production Postgres на 200M строк, p95 1500 мс, 600 backends, 40 GB bloat, без pooler. Дай порядок триажа для первых трёх недель и обоснуй каждый шаг.
- 03Что такое XID wraparound, почему это порог корректности (а не производительности) и как его мониторить?
Фреймворк USE + RED маппится напрямую на семь актов: высокое число backends — Акт 5, высокое соотношение мёртвых tuples — Акт 4, растущая duration конкретного запроса — Акт 2 или 3, расходящаяся хвостовая латентность на шард — Акт 7. У каждого акта свой диагностический инструмент — pg_stat_user_tables для bloat, pg_stat_activity для connection storms, pg_stat_statements для медленных запросов, pg_locks для блокировщиков миграций, и метрики шардов уровня приложения для Акта 7. При наследовании деградированного Postgres правильный порядок триажа: Акт 4 первым (убить long transactions, остановить кровотечение), затем Акт 5 (развернуть pooler), затем Акты 3 и 2 (качество планов), затем структурные Акты 1 и 7. XID wraparound — порог корректности, он не замедляет запросы, он их портит — мониторь age(datfrozenxid) на базу и алерть при 80% от autovacuum_freeze_max_age. Модель семи актов — одновременно growth framework и аварийный протокол: порядок актов — это порядок триажа когда всё горит. Теперь, когда наследуешь деградированный Postgres, открывай pg_stat_activity прежде чем что-либо трогать — он скажет в каком акте ты находишься.
встречается в292
- Почему GraphQL получает N+1junior
- Механика DataLoader: батчинг на границе тикаmiddle
- Контракты batch-функции: порядок, формы, ошибкиmiddle
- Federation и lookahead: батчинг за пределами DataLoadermiddle
- Защита сложности запросов: depth, cost, persisted queriesmiddle
- Senior GraphQL API: scheduling-контракт, изоляция арендаторов, наблюдаемостьsenior
- Путь запроса: семь остановок от сокета до ответаjunior
- Accept и парсинг: от очереди ядра до типизированного запросаmiddle
- Маршрутизация и middleware: что выполняется и в каком порядкеmiddle
- Обработчик и ответ: от бизнес-логики до байтов на проводеmiddle
- Стриминг и backpressure: когда клиент читает медленнее, чем вы пишетеsenior
- Таймауты и хвостовая задержка: бюджеты, дедлайны и ловушка fan-outsenior
- Middleware и DI: два паттерна, формирующие любой backendjunior
- Пишем middleware: сигнатуры, next() и три модели фреймворковmiddle
- Инверсия управления: как зависимости добираются до классаmiddle
- Скоупы и время жизни DI: singleton, request, transientmiddle
- DI как шов для тестов: фейки, моки и граница, которая важнаsenior
- DI-контейнеры в продакшене: графы разрешения, циклы и когда не стоитsenior
- Блокирующий vs неблокирующий I/O: два способа ждатьjunior
- Event loop: один поток, упорядоченные фазыmiddle
- Что блокирует цикл: CPU-работа и синхронные вызовыmiddle
- Вынос CPU-работы: worker threads и пул libuvmiddle
- Backpressure и ограниченная конкурентностьsenior
- Пропускная способность под нагрузкой: хвостовая задержка и насыщениеsenior
- Зачем пул: цена создания соединенияjunior
- Размер пула: почему больше не значит быстрееmiddle
- Взятие и таймауты: очередь ожидания — настоящий дроссель задержкиmiddle
- Зачем идемпотентность: безопасные retryjunior
- Серверный state machine: четыре состояния idempotency keymiddle
- Стратегии retry: backoff, jitter и thundering herdmiddle
- Outbox и inbox: effectively-once через dual-write границуmiddle
- Конкурентность и архитектура кеша для идемпотентности на масштабеsenior
- Наблюдаемость, production-инциденты и дизайн для глобального масштабаsenior
- Event loop: один поток, три очередиjunior
- Задачи, микрозадачи и scheduler.yield()middle
- Точность таймеров, троттлинг и фоновая работаmiddle
- Голодание микрозадач, длинные задачи и LoAFsenior
- Event loop Node.js: фазы, nextTick и задержка циклаsenior
- React, Vue и наблюдаемость INP в продакшенеsenior
- Render pipeline: шесть стадий от байтов до пикселейjunior
- Цена стадий и модель процесса рендерераmiddle
- Инвалидация, dirty-биты и containmiddle
- Слои композитора: продвижение, перекрытие и память GPUmiddle
- Флейм-стрип DevTools и жизненный цикл кадраmiddle
- Layout thrash: форсированная синхронная компоновкаsenior
- BeginMainFrame, анимации на потоке compositor и память GPUsenior
- Observability в проде: LoAF, INP и полная поверхность атакиsenior
- Что такое V8 и почему производительность различается в 100 разjunior
- Четырёхуровневый JIT-конвейер V8 и профилированная тиеризацияmiddle
- Hidden classes, деревья переходов и расположение в памятиmiddle
- Inline caches, состояния IC и деоптимизацияmiddle
- Orinoco GC: параллельный scavenger, конкурентная разметка и барьеры записиmiddle
- Спекулятивный движок TurboFan и ловушка deopt-loopsenior
- V8 в production: Isolates, сжатие указателей и реальные аварииsenior
- Жизненный цикл service worker и стратегии кешированияmiddle
- Граничные случаи service worker: version skew, долговременность и ловушка навигацииsenior
- Что делает реконсилер: render vs commitjunior
- Объект fiber и дерево с двойной буферизациейmiddle
- Чистота фазы render и подшаги фазы commitmiddle
- Реконсиляция: эвристики диффа и ловушка ключейmiddle
- Приоритетные lanes, time-slicing и useTransitionmiddle
- Bailout, мемоизация и tearingsenior
- React Profiler, компилятор и продакшн-наблюдаемостьsenior
- Стратегии рендеринга: SSG, SSR, ISR, streaming и гидратацияjunior
- SSG, SSR, ISR, streaming и RSC — как работает каждая стратегияmiddle
- Цена гидратации: selective, progressive, острова, resumabilitymiddle
- Hydration mismatch: причины, обнаружение и правило детерминизмаsenior
- RSC, стратегия на маршрут и production-наблюдаемостьsenior
- Core Web Vitals: что измеряют LCP, INP и CLSjunior
- LCP: четыре фазы, одна доминирующая стоимостьmiddle
- INP: input delay, processing, presentationmiddle
- CLS: почему происходят сдвиги лейаута и как их остановитьmiddle
- Lab vs field: почему они расходятся и как использовать каждыйmiddle
- Трейдоффы метрик, RUM-атрибуция и цикл CI+полеsenior
- Общая картина: от URL до LCP до INP как эстафетаjunior
- Восемь слоёв трассировки: от service worker до второй навигацииmiddle
- Пять канонических поломок: где производство стабильно ломаетсяsenior
- Метод трёх треков: чтение трасс и построение системы мониторингаsenior
- Что такое cache stampede и почему он делает всё хужеjunior
- Лок и single-flight: ограничение параллельных rebuildmiddle
- XFetch: вероятностное раннее истечение без координацииmiddle
- Stale-while-revalidate и CDN request coalescingmiddle
- Детектирование stampede и дизайн TTL для продакшенаmiddle
- Метастабильный сбой, fencing-токены и production-постмортемыsenior
- Роли Raft, term и почему majority-кворум предотвращает split brainjunior
- Как Raft реплицирует log entry и решает, что его безопасно коммититьmiddle
- Выборы лидера в Raft: таймауты, правила голосования и четыре свойства безопасностиmiddle
- Raft в реальном мире: partition, медленный диск и клиентская маршрутизацияmiddle
- Расширения Raft: pre-vote, learner, snapshot и линеаризуемые чтенияsenior
- Raft в production: membership change, Multi-Raft и observabilitysenior
- Где происходит data fetching — и почему это решает LCPjunior
- Fetch waterfall''''ы — диагностика и лечение через Promise.allmiddle
- React Server Components и Suspense streamingmiddle
- Клиентский кэш: TanStack Query, SWR и stale-while-revalidatemiddle
- LCP, prefetch и race conditions в интерактивном fetchingmiddle
- Senior internals: RSC payload, слои кэша и production паденияsenior
- Что такое движок JavaScriptzero
- Ignition и байт-кодmiddle
- Внутри цикла интерпретатораmiddle
- Как V8 представляет значениеmiddle
- Что такое Map на самом деле: вскрываем hidden classmiddle
- Деревья переходов, deprecation и миграцияmiddle
- Быстрые свойства, медленные свойства и slack trackingmiddle
- Inline cache в глубину: feedback-слоты и handlersmiddle
- Monomorphic, polymorphic, megamorphic — и stub cachemiddle
- Четыре яруса и как работает разогревmiddle
- Обратная связь о типах: топливо для оптимизатораsenior
- TurboFan: оптимизатор на море узловsenior
- Спекуляция и guardssenior
- Деоптимизация: падение с обрываsenior
- On-Stack Replacement: подмена фрейма посреди циклаsenior
- Области видимости, контексты и scope chainmiddle
- Что на самом деле удерживает замыканиеmiddle
- Когда V8 аллоцирует Context (и чего это стоит)middle
- Замыкания, feedback-векторы и полиморфизм точки вызоваmiddle
- Зачем нужен GC и достижимостьmiddle
- Поколенческий GC и Scavengermiddle
- Major GC: mark, sweep, compactsenior
- Write barriers: цена инкрементального и поколенческого GCsenior
- Утечки в языке со сборкой мусораsenior
- Движок против циклаmiddle
- Микрозадачи против макрозадач: порядокmiddle
- Внутри Promisemiddle
- async/await, десахаризированныйmiddle
- Капстоун: оптимизируем горячий путьsenior
- Биты в проводеjunior
- Математика задержкиmiddle
- Bufferbloat и перегрузкаsenior
- Граница физического уровняsenior
- Трёхстороннее рукопожатие TCPjunior
- Номера последовательности и состояние соединенияmiddle
- Управление потоком и перегрузкойmiddle
- BBR, производственная наблюдаемость и за пределами TCPsenior
- DNS: что делает и зачем существуетjunior
- Обход резолвера: перенаправления, типы записей и gluemiddle
- TTL, кеширование и распространение DNSmiddle
- Рукопожатие за 1 RTT: key share и ECDHEmiddle
- Возобновление сессии и 0-RTTmiddle
- HTTP: язык запрос-ответ в вебеjunior
- HTTP/2: потоки, фреймы и HPACKmiddle
- HTTP/3 и QUIC: изоляция потерь на уровне потокаmiddle
- HTTP/3 в продакшне: внутренности QUIC, fallback и наблюдаемостьsenior
- HTTP дизайн: приоритеты, WebTransport и семантическая корректностьsenior
- CDN: контент по соседствуjunior
- Anycast и GeoDNS: маршрутизация к ближайшему edgemiddle
- Многоуровневый кеш и Cache-Controlmiddle
- Заголовок Vary и cache keysmiddle
- Stale-while-revalidate и cache stampedesenior
- Edge workers и edge-side compositionsenior
- CDN: операции и observabilitysenior
- WebSocket: HTTP-апгрейд до постоянного соединенияjunior
- Формат WebSocket-фрейма: opcodes, маскирование, фрагментацияmiddle
- WebSocket vs SSE vs long-polling: выбор правильного транспортаmiddle
- Backpressure в WebSocket: когда клиенты не успеваютmiddle
- Реконнект: jittered backoff, thundering herd, восстановление сообщенийsenior
- WebSocket в масштабе: HTTP/2 мультиплексирование, permessage-deflate, C10Msenior
- WebSocket в production: прокси, безопасность и распределённая архитектураsenior
- Что делают обратные проксиjunior
- Алгоритмы балансировки: от round-robin до power-of-two-choicesmiddle
- L4 vs L7 балансировка и сохранение IP клиентаmiddle
- Health checks, connection draining и slow startmiddle
- Session affinity, consistent hashing и правильное решениеmiddle
- Retry-бури, circuit breakers и load sheddingsenior
- Устойчивая архитектура LB: anycast, zone-aware маршрутизация и observabilitysenior
- Почему QUIC, а не TCP+TLSjunior
- QUIC-потоки и head-of-line blockingjunior
- Объединённое рукопожатие и 1-RTTmiddle
- Connection ID и миграция сетиmiddle
- Обнаружение потерь и управление перегрузкойmiddle
- Возобновление 0-RTT и шифрование пакетовsenior
- Развёртывание и стоимость CPUsenior
- DDoS: что это и почему работаетjunior
- Атаки усиления и истощение состоянияmiddle
- Ограничение скорости: алгоритмы и архитектураmiddle
- WAF, межсетевые экраны, mTLS и HSTSmiddle
- Отравление DNS-кэша и BGP-перехватsenior
- Эшелонированная защита и экономика атакsenior
- Двенадцать слоёв: один URL, семь действующих лицjunior
- DNS, TCP, TLS по очереди: куда уходят миллисекундыmiddle
- Критический путь рендеринга и Core Web Vitalsmiddle
- Перехват прокси и шлюзы безопасности: rate limiter, WAF, mTLSmiddle
- Альтернативные пути: QUIC 0-RTT, WebSocket upgrade, миграция соединенияmiddle
- Наблюдаемость: распределённые трейсы, USE/RED и семплированиеsenior
- Устойчивость: каскадные повторы, circuit breakers и error budgetsenior
- Что такое три сигнала: метрики, логи, трейсыjunior
- Метрики и cardinality: cost-модель time-series databasemiddle
- Логи и объём: cost-модель структурного логированияmiddle
- Трейсы и сэмплирование: cost-модель distributed tracingmiddle
- Join-ключи и exemplar''''ы: как три сигнала становятся компонуемымиmiddle
- Observability 2.0: широкие события и сдвиг стоимостиsenior
- Режимы сбоя и инженерная практика: cardinality budget''''ы, PII и сэмплированиеsenior
- Зачем нужны структурные логи: дневник против таблицыjunior
- Схема продакшн-лога: поля, которые несёт каждая строкаmiddle
- Log levels и маршрутизация алертовmiddle
- Стратегии sampling и стоимость логовmiddle
- PII-редакция и log injectionsenior
- Propagation trace-контекста в логахsenior
- OTel Logs Data Model и audit-логи как подсистемаsenior
- Сигналы OTel, Semantic Conventions и проводной формат OTLPmiddle
- Авто-инструментирование и ручные спаны: правило 80/20 в OTelmiddle
- Collector OTel: receivers, processors, exporters и паттерны развёртыванияmiddle
- Стратегии сэмплирования: head, tail и parent-basedmiddle
- Vendor-нейтральность, eBPF-инструментирование, Operator и OTel в браузере и serverlesssenior
- Эксплуатация OTel Collector: надёжность, version skew, режимы отказа и управлениеsenior
- RED и USE: два чек-листа, одна дисциплина триажаjunior
- Инструментация RED в Prometheus: счётчики, гистограммы и дисциплина cardinalitymiddle
- USE на Linux: CPU, память, диск, сеть и PSImiddle
- Golden signals, структура дашборда и auto-RED в service meshmiddle
- Cardinality как драйвер затрат: label, PII, exemplars и семплированиеmiddle
- Native histograms, SLO и паттерны production-сбоевmiddle
- SLI, SLO и error budget: надёжность в числахjunior
- Выбор SLI и SLO-целей: отношения, не ощущенияmiddle
- Multi-window multi-burn-rate-алертинг: почему AND лучше ORmiddle
- Error budget policy, latency SLO и составные journeysmiddle
- Iceberg SLI, математика составного SLO и SLA vs SLOsenior
- Продакшн-отказы SLO, самонаблюдаемость, безопасность и общая картинаsenior
- Flame graph: читаем картинку, которая показывает, куда ушло времяjunior
- Sampling vs instrumentation profiling: почему 99 Гц побеждает в productionmiddle
- Типы профилей: CPU, память, off-CPU, mutex — какой когда братьmiddle
- Continuous profiling: always-on flame graphs с eBPF и корреляцией trace-idmiddle
- Как flame graph строится из сэмплов и как использовать его в productionmiddle
- Linux perf, внутренности eBPF, PGO и ограничения sampling''''аsenior
- Profiling в production: безопасность, war stories, OTel profiles и дизайн инфраструктурыsenior
- Debugging-воронка: SLO → RED → trace → profilejunior
- Архитектура OTel: один SDK, четыре сигнала, один wire-форматmiddle
- Экономия на observability: удерживаем затраты в пределах 5% inframiddle
- Петля инцидента: от пейджера до постмортема до предотвращенияmiddle
- Масштаб, безопасность и ROI наблюдаемых системsenior
- Сначала профиль: измерь куда реально уходит времяjunior
- Закон Амдала и self-time: потолок любого ускорения, которое ты можешь выпуститьmiddle
- Измерительный цикл: микробенч, макробенч, prod-профиль, эффект наблюдателяmiddle
- Чтение флейм-графов: формы, профайлеры по языкам и 60-секундный сканmiddle
- Статистические baseline''''ы: почему один запуск — не измерениеmiddle
- История профайлеров и ловушки микробенчей: от Кнута до GWPsenior
- Hardware counters, профили холодного старта и безопасность профилейsenior
- Непрерывное профилирование в масштабе: затраты, CI-гейты, корреляция с трейсами и антипаттерныsenior
- Что делает путь горячим: симптом против причиныjunior
- Пять форм hotspot''''а: CPU, аллокации, кэш, лок, syscallmiddle
- Чтение parent и child chains: где применять правкуmiddle
- JIT deopt, цикл fix-and-verify и PR-time профилированиеmiddle
- Аппаратные счётчики и Intel TMA: диагностика подкатегорийsenior
- False sharing и горячие пути нативных мостовsenior
- Горячие пути в production: безопасность, хвостовая латентность и происхождение инструментовsenior
- Иерархия памяти: почему расстояние важнее числа операцийjunior
- Row-major vs column-major: порядок доступа и разрыв в 9xjunior
- Cache lines и false sharing: когда параллелизм замедляет кодmiddle
- Branch prediction: 10–30 циклов штрафа за неожиданный ifmiddle
- SIMD и data layout: AoS vs SoA и разница в 4–8xmiddle
- Hardware prefetcher, TLB и memory-level parallelismsenior
- Cache-oblivious алгоритмы, PGO и production failuressenior
- Основы GC: за что рантайм берёт налогjunior
- Алгоритмы GC: поколенческая гипотеза, concurrent marking и write barriermiddle
- GC tradeoffs: пауза, throughput, память и давление аллокацийmiddle
- Настройка GC: пейсинг, форма кучи и наблюдаемость аллокацийmiddle
- Внутреннее устройство GC: tri-color инвариант, write barriers и глубокое погружение в рантаймыsenior
- GC в production: наблюдаемость, безопасность, edge cases и управление флотомsenior
- N+1: одна логическая операция, много round-trip''''овjunior
- Семейства фиксов: JOIN, IN, preload и DataLoadermiddle
- Обнаружение N+1: query logs, APM traces и CI gatesmiddle
- DataLoader: батчинг по дереву резолверовmiddle
- Кросс-протокольный N+1: HTTP fan-out и Redis MGETmiddle
- N+1 в масштабе: исчерпание пула, изменения планов и денормализацияsenior
- Batching: амортизируй фиксированную цену каждой операцииjunior
- Окно батчинга: размер и время ожиданияmiddle
- Batching в Kafka и Postgresmiddle
- io_uring и наблюдаемость пакетированияmiddle
- От Nagle до io_uring: эволюция пакетированияmiddle
- Backpressure, изоляция сбоев и безопасность батчей в продакшенеsenior
- Что на самом деле стоит bundle: download, parse, compile, executejunior
- Core Web Vitals: LCP, INP и CLSmiddle
- Code splitting: route-level, component-level, vendor splittingmiddle
- Tree shaking и compression: удаляем то, что не используемmiddle
- Third-party scripts: тихий убийца бюджетаmiddle
- CI enforcement и RUM: делаем бюджеты рабочимиmiddle
- V8 JIT-пайплайн, HTTP-приоритеты и безопасность bundlesenior
- Цикл performance: дисциплина, а не проектjunior
- Классификация и исправление: сопоставление family bottleneck с методамиmiddle
- Observability-стек и CI gates: ловить регрессии до выпускаmiddle
- От инцидента к enforcement: SLO burn до верифицированного исправления за 35 минутmiddle
- Культура, экономика и масштаб performancesenior
- At-most-once, at-least-once, exactly-once: три контракта доставкиjunior
- Три ножки сбоя — где реально происходят дубликаты и потериmiddle
- Consumer-side dedup: самый дешёвый путь к exactly-once processingmiddle
- Kafka exactly-once semantics: idempotent producer и транзакцииmiddle
- SQS visibility timeout, DLQ и outbox patternmiddle
- Exactly-once в production: impossibility-доказательство, гибридные паттерны и реальные инцидентыsenior
- Что такое OAuth и почему пароли — не ответjunior
- Authorization code flow с PKCEmiddle
- Валидация ID-токена и управление JWKS-кешемmiddle
- Ротация refresh-токенов и scope-based least privilegemiddle
- Sender-constrained токены: DPoP и mTLSsenior
- OAuth в production: audience атаки, observability и реальные провалыsenior
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.