Как Protobuf съедал 411 ядер CPU на 100k RPS: физика GC в Go и перепроектирование gRPC-контрактов

Языки программирования и технические стеки

Бэкенд
Архитектурные паттерны
Оптимизация производительности
GO

Программный комитет ещё не принял решения по этому докладу

Целевая аудитория

Go-разработчики, Backend-инженеры и Системные архитекторы высоконагруженных систем (10k+ RPS), которые проектируют межсервисное взаимодействие, сталкиваются с высокими задержками p99 и оптимизируют утилизацию CPU и памяти.

Тезисы

Принято считать, что Protobuf «из коробки» гарантирует высокую скорость и компактность. Но что происходит, когда система перешагивает порог в 100 000 RPS, а входящий запрос содержит тысячи объектов?

На примере реального пайплайна агрегации в рекомендательной системе мы покажем, как «академически правильный» gRPC-контракт на Protobuf превращается в генератор мусора, сжигающий ресурсы сервера.

О чём поговорим:

Анатомия деградации: как standard protoc-gen-go в Go генерирует миллиарды аллокаций в секунду при анмаршалинге слоистых структур (oneof, google.protobuf.Timestamp, repeated messages).

Физика процесса: почему runtime.mallocgc и Mark Assist сборщика мусора блокируют бизнес-горутины, а Pointer Chasing разрушает кэш-линии CPU.

Прагматичный рефакторинг: как флаттеринг (flattening) структур, отказ от избыточных типы-обёрток и точечный переход на SoA (Structure of Arrays) снижают нагрузку на память.

Границы компромиссов: почему мы отказались от полного обнуления аллокаций через vtprotobuf + sync.Pool, выбрав баланс между безопасностью кода и производительностью.

Результаты: как изменение контрактов сэкономило 411 ядер CPU, 219 ГБ/с пропускной способности памяти и срезало 6.1 миллиарда объектов в секунду для GC.

Иван Синицын — технический лидер в Ozon Tech с более чем 8-летним опытом в IT. Он строил высоконагруженные системы, разрабатывал масштабируемые микросервисы для управления складскими процессами и создавал feature store для рекомендательной системы крупного ритейлера. Иван специализируется на Golang, оптимизации производительности, распределённых системах и эффективной обработке больших объёмов данных. Увлекается марафонами и садоводством.

Видео

Другие доклады секции

Языки программирования и технические стеки