> Как происходит балансировка нагрузки в планировщике Go (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: amoCRM

Стек: Go

> Пример ответа

В Go планировщик (scheduler) использует модель M:N, где M - потоки ОС, а N - горутины. Балансировка нагрузки происходит на уровне логических процессоров (P - Processor), которые управляют очередями горутин.

Основной механизм - work stealing (кража работы). Каждый P имеет свою локальную очередь (runq) горутин. Когда P завершает выполнение всех своих горутин, он пытается "украсть" половину горутин из очереди другого P, выбранного случайным образом. Это предотвращает ситуацию, когда один P простаивает, а другой перегружен.

Дополнительно используется глобальная очередь (global runq). Если локальные очереди пусты, P проверяет глобальную очередь. Также горутины, созданные через go func(), сначала попадают в локальную очередь текущего P, но при переполнении (более 256 горутин) часть отправляется в глобальную.

Планировщик также учитывает системные вызовы: если горутина блокируется (например, на вводе-выводе), P может открепиться от потока ОС и взять другую горутину, а заблокированная горутина позже перепланируется на свободный P.

Таким образом, балансировка достигается за счёт децентрализованных локальных очередей с work stealing и глобальной очереди как резерва. Это минимизирует contention и обеспечивает равномерную загрузку ядер CPU.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью