> Как происходит балансировка нагрузки в планировщике 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.
> Похожие задачи по Go
Как масштабировать сервис коротких ссылок и настроить балансировку нагрузки
Что такое starvation локальной очереди и когда она возникает
На чем реализовывали поиск
Готов ли ты писать код сейчас?
> Похожие задачи по backend
Работал ли ты с Cassandra, MongoDB, Redis, ElasticSearch, ClickHouse
Что такое starvation локальной очереди и когда она возникает
На чем реализовывали поиск
Готов ли ты писать код сейчас?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью