⚙️ Теория
🎯 Цель дня
В этот день ничего нового не изучаем.
Задача: собрать уже изученные части в единую архитектурную модель.
🧩 Что нужно сделать
Нарисовать на листе 4 слоя:
- процессная модель (
master/worker); event loop(где sleep/wakeup, где I/O ready);- lifecycle запроса (от
acceptдоkeepalive/close); shared state(какие данные per-worker, какие shared).
Минимум на схеме:
- где входящий сокет;
- где
epoll_wait; - где phase engine;
- где upstream;
- где shared zones и mutex/atomic-path.
✍️ Письменные ответы (обязательно)
Почему internal redirect перезапускает phase engine?
Потому что меняется URI (а иногда и контекст обработки), значит старый location может быть уже неверным.
NGINX делает новый location lookup и запускает фазовый проход заново для нового маршрута.
Где есть блокировки?
accept-конкуренция между worker (в зависимости отaccept_mutex/reuseport);- shared memory зоны (
limit_req,limit_conn,ssl session cache,upstream zone); - mutex/atomic-path внутри общих структур (
slab,rbtree, counters).
Что произойдет при slow client?
Ответ отправляется медленно, request живёт дольше, растут active connections и занятые буферы.
При большом числе slow clients можно упереться в worker_connections: worker перестанет принимать часть новых соединений даже при умеренном CPU.
Почему memory pool уничтожается целиком?
Потому что большинство объектов живут столько же, сколько request.
Так дешевле: один destroy pool вместо множества malloc/free, меньше фрагментация и накладные расходы.
🧪 Смоделировать сценарии и предсказать поведение
1. 10k RPS + медленный upstream
Ожидаемо:
- растёт latency (особенно p95/p99);
- увеличивается число активных соединений;
- throughput перестаёт расти линейно;
- возможны
upstream timed out, 502/504.
2. burst 100k req/s
Ожидаемо:
- пики в очередях/лимитерах;
- рост lock contention в shared state;
- рост ошибок от лимитов/таймаутов;
- CPU может расти быстрее полезного RPS.
3. 10MB request body
Ожидаемо:
- активное использование
client_body_buffer_sizeи temp-файлов; - рост I/O и времени обработки запроса;
- влияние на память и диск в зависимости от buffering-настроек.
4. отключённый keepalive
Ожидаемо:
- больше
accept()и TCP/TLS handshakes; - выше CPU на ту же полезную нагрузку;
- ниже RPS при тех же ресурсах;
- больше короткоживущих соединений (
TIME_WAIT).
✅ Критерий Level 1
Если вы можете заранее (до запуска теста) объяснить направление изменений по:
- throughput;
- latency;
- CPU;
- active connections;
- ошибкам и таймаутам,
значит архитектурная модель уже собрана и вы на Level 1.
🧪 Практика
- Используйте команды и примеры из разделов выше как рабочий чеклист.
- Перед применением в production валидируйте изменения на test/stage и сверяйте с официальной документацией.
🧾 Вывод
Материал резюмирует ключевые принципы и практики по теме статьи. Для production-решений опирайтесь на ограничения вашей инфраструктуры и официальные источники.
📚 Ссылки
- См. ссылки в секции
Проверка источниковниже.