В nginx аллокатор памяти устроен почти как указатель, который двигается только вперёд.
Идея простая: под запрос выделяется пул памяти, а дальше nginx просто «отрезает» куски из большого блока по мере необходимости. Никаких сложных free lists, минимум накладных расходов на каждую аллокацию и меньше проблем с фрагментацией.
Пока запрос живёт, память только раздаётся вперёд. Когда запрос завершён, весь пул освобождается одним действием.
Почему это быстро:
- не нужно освобождать каждый маленький объект отдельно
- не нужно искать подходящий свободный блок
- нет постоянной борьбы с фрагментацией
- жизненный цикл памяти совпадает с жизненным циклом запроса
- код остаётся предсказуемым для CPU cache
Это хороший пример инженерного компромисса: nginx не пытается сделать универсальный malloc на все случаи жизни. Он использует знание своей нагрузки - много короткоживущих объектов внутри одного запроса - и делает под это максимально простой аллокатор.
Иногда самый быстрый менеджер памяти - это просто указатель, который идёт вперёд.
Post #1462
3.56K

- ❤ 32
- 👍 6
- 👌 3
- 🔥 1