Что вызывает высокую загрузку ЦП в приложении ASP.NET?
У меня есть приложение ASP.NET (framework 4.8), которое иногда достигает 100% загрузки ЦП в течение нескольких мсек. Важно знать, что при такой загрузке процессора или непосредственно перед ней приложение не испытывает всплесков клиентского RPS. На самом деле он обслуживает всего пару клиентских запросов до всплесков использования ЦП.
Просмотр дампа perfview с графиком WPA CPU Usage (Sampled)
, Я вижу, что вершины всплесков ЦП, а также слайды всплесков заполнены образцами ЦП, собранными из Dequeue
а также TrySteal
методы. Также системные метрики показывают, что во время загрузки ЦП приложение испытывает всплеск используемых рабочих потоков (ThreadPool.GetAvailableThreads - ThreadPool.GetMinThreads
) до числа, я установил с ThreadPool.SetMinThreads
. Машина имеет 16 ядер, поэтому я протестировал приложение со значениями 2048 и 512 рабочих на все ядра: 128 и 32 рабочих на ядро соответственно.
На данный момент похоже, что загрузка ЦП вызвана большим количеством рабочих потоков, пытающихся принять любые рабочие запросы, когда их нет. Таким образом, рабочие тратят ресурсы ЦП, пытаясь найти рабочие запросы в своих локальных очередях, глобальной очереди пула потоков и пытаясь украсть работу из локальных очередей других потоков.
Что может вызвать такие всплески количества рабочих потоков? Может ли 16 ядер ЦП действительно не хватить 512 рабочих, пытающихся найти работу, или это просто следствие какой-то другой проблемы?
Приложения иллюстрируют
1) Распределение образцов ЦП по стекам всех потоков приложений
2) Распределение образцов ЦП среди одного случайного стека потоков приложения