Материал проходит вычитку — возможны неточности.
Урок 71 из 118

Вытеснение и work stealing

Во время пика одна горутина зажала всё ядро: цикл хеширования крутился без единой блокировки, и соседние запросы встали. Инцидент закрыли после разбора того, как планировщик обычно не даёт такому случиться.

Главная мысль

планировщик обычно не даёт одной горутине зажать ядро — асинхронное вытеснение (с Go 1.14) снимает горутину, работающую дольше примерно 10 мс, но это не строгая гарантия; work stealing перераспределяет горутины между занятыми и пустующими P.

Вытеснение

Если горутина крутит бесконечный цикл без блокировок, кооперативного «уступить процессор» у неё нет. Ранние версии Go страдали: такая горутина могла зажать ядро. С Go 1.14 планировщик вытесняет асинхронно: sysmon (фоновый поток runtime) шлёт сигнал, и горутина, работающая дольше примерно 10 мс, снимается с исполнения. Порог приблизителен, и вытеснение может отложиться до безопасной точки — это не строгая гарантия справедливости.

Go

Поэтому долгий CPU-bound код не вешает остальные горутины — их просто вклинивают в расписание.

Work stealing

Локальные очереди P заполняются неравномерно: одному P досталась пачка горутин, другой простаивает. Когда P пустеет, он «ворует» половину очереди у случайного занятого P. Так работа перетекает туда, где есть свободный контекст, без центрального диспетчера.

Почему это работает без пауз

Обе механики не требуют остановки мира: вытеснение — сигнал конкретной горутине, воровство — атомарные операции над очередями. Планировщик остаётся дешёвым, а загрузка ядер — равномерной. Отсюда практический вывод: не пиши код, который «ждёт уступки» от других горутин — вытеснение и воровство о балансе заботятся сами.

В следующем уроке

Вы узнаете:

  • как sysmon следит за состоянием мира
  • почему выгодно воровать половину очереди, а не одну горутину
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

Один P опустел и ищет работу. Как он её получает?

Вопрос 2 из 3

Почему воруют половину очереди, а не всё и не одну?

Вопрос 3 из 3

Порог вытеснения «примерно 10 мс» — строгая гарантия справедливости?

Итоги

Вытеснение (порог ~10 мс приблизителен, не строгая гарантия) обычно не даёт зажать ядро, work stealing выравнивает загрузку P.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки