года работаю в Ozon • Преподаю в Route256 • Сервисы тарификации - расчет сроков и способов доставок • Пик нагрузки на сервисы тарификации в сезон 274k rps • Стабильно держим на стресс-тестах до 320k rps
Go – Tri-color Mark-and-Sweep On-the-Fly Garbage Collection: An Exercise in Cooperation Edsger W. Dijkstra, Leslie Lamport, A. J. Martin, C. S. Scholten, and E. F. M. Steffens. 1978.
Go – Tri-color Mark-and-Sweep Трехцветный алгоритм Mark-and-Sweep Три группы: Белые Серые Черные не исследованные объекты ожидающие исследования объекты исследованные объекты (точно нам нужны)
Трехцветный алгоритм Mark-and-Sweep • Все объекты изначально белые. • Обходим корневые объекты и помечаем их серым цветом. • Выбираем серый объект из очереди и сканируем на наличие указателей • Найденные объекты помечаются серым, а исходный – черным • Повторяем предыдущие два шага до тех пор пока очередь серых объектов не пуста • Белые являются мусором
сборки мусора (GC pacing) GC Pacer (инициатор) преследует две основные цели: Цель 1 - поддерживать целевое использование ЦП (уложиться в 0,25*GOMAXPROCS) Цель 2 - получить размер живой кучи как можно ближе к целевому значению (GOGC) Подробнее
мусора 1. Фаза завершения очистки (sweep termination) GC в состоянии _GCoff (GC не работает; очистка в фоне, write barrier выключен) • Дожидаемся конца очистки объектов runtime/mgc.go:602 • STOP THE WORLD (Остановка всего приложения) runtime/mgc.go:631 • Запуск фоновых рабочих разметки runtime/mgc.go:645 • Сброс всех флагов и состояний маркировки runtime/mgc.go:647 • Завершаем очистку ресурсов - Завершаем процессы фоновой очистки runtime/mgc.go:668 - Очищаем пулы (sync.Pool) runtime/mgc.go:673 Go 1.19
мусора 2. Фаза разметки (mark phase) GC в состоянии _GCmark (GC: разметка, allocate black, write barrier ENABLED) Go 1.19 • Подготовка к маркировке runtime/mgc.go:707 • Помечаем все активные блоки “крошечных” аллокаций в черный untime/mgc.go:715 • Включаем write barrier runtime/mgc.go:716 • START THE WORLD runtime/mgc.go:743 • Запуск сканирования глобальных объектов и стека • Трехцветный алгоритм разметки
разметки (mark termination phase) Go 1.19 Этапы работы сборщика мусора GC в состоянии _GСMarktermination (GC: разметка, allocate black, write barrier ENABLED) • STOP THE WORLD runtime/mgc.go:855 • Перевод в состояние _GСMarktermination runtime/mgc.go:925 • Дожидаемся завершения обработки последних задач • Очистка кешей и завершение воркеров
мусора 4. Фаза очистки (sweep phase) Go 1.19 GC в состоянии _GСMarktermination (GC: разметка, allocate black, write barrier ENABLED) • Перевод в состояние _GСMarktermination в _GCoff runtime/mgc.go:971 • START THE WORLD runtime/mgc.go:1059 • Выполнение sweep в фоне
GOGC (по умолчанию 100) Как облегчить жизнь GC? Оптимизации Утилита GOGCTuner от команды uber Large-Scale, Semi-Automated Go Garbage Collection Tuning at Uber