Выбор ответа Senior Потоки и синхронизация обновлено

Голодание пула потоков

Вопрос

Под нагрузкой сервис на ASP.NET Core отвечает всё медленнее, CPU загружен на 15%, число потоков постепенно растёт. Самая вероятная причина?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

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

Варианты ответа

  1. Синхронное ожидание (.Result, .Wait()) блокирует потоки пулаправильный ответ
  2. Сборщик мусора работает в режиме Workstation, а не Server
  3. Слишком много вызовов await в коде, каждый занимает поток
  4. Kestrel ограничивает число соединений до числа ядер процессора

Разбор

Классическая картина голодания пула: потоки заняты ожиданием, новые задачи стоят в очереди, а пул наращивает потоки постепенно, на нехватку он реагирует с задержкой. CPU при этом простаивает. Диагностика: dotnet-counters (длина очереди пула, число потоков), дамп со стеками на .Result. Режим GC влияет на паузы и память, но не даёт такой картины. Много await это нормально. Kestrel не ограничивает соединения числом ядер.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме