Голодание пула потоков
Вопрос
Под нагрузкой сервис на ASP.NET Core отвечает всё медленнее, CPU загружен на 15%, число потоков постепенно растёт. Самая вероятная причина?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Синхронное ожидание (
.Result,.Wait()) блокирует потоки пулаправильный ответ - Сборщик мусора работает в режиме Workstation, а не Server
- Слишком много вызовов
awaitв коде, каждый занимает поток - Kestrel ограничивает число соединений до числа ядер процессора
Разбор
Классическая картина голодания пула: потоки заняты ожиданием, новые задачи стоят в очереди, а пул наращивает потоки постепенно, на нехватку он реагирует с задержкой. CPU при этом простаивает. Диагностика: dotnet-counters (длина очереди пула, число потоков), дамп со стеками на .Result. Режим GC влияет на паузы и память, но не даёт такой картины. Много await это нормально. Kestrel не ограничивает соединения числом ядер.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.