Multithreading 是什么导致ASP.NET应用程序中CPU使用率高?
我有ASP.NET应用程序(Framework4.8),它偶尔会在几毫秒内达到100%的CPU使用率。必须知道,在CPU负载期间或之前,应用程序不会经历客户端RPS突发。实际上,在CPU使用量激增之前,它只服务于几个客户端请求 通过WPA图形查看perfview转储Multithreading 是什么导致ASP.NET应用程序中CPU使用率高?,multithreading,threadpool,cpu-usage,windows-performance-analyzer,Multithreading,Threadpool,Cpu Usage,Windows Performance Analyzer,我有ASP.NET应用程序(Framework4.8),它偶尔会在几毫秒内达到100%的CPU使用率。必须知道,在CPU负载期间或之前,应用程序不会经历客户端RPS突发。实际上,在CPU使用量激增之前,它只服务于几个客户端请求 通过WPA图形查看perfview转储CPU使用率(采样),我看到CPU峰值的顶部以及峰值的幻灯片都充满了从Dequeue和TrySteal方法堆积起来的CPU样本。另外,系统指标显示,在CPU加载期间,应用程序经历了大量使用的工作线程(ThreadPool.GetAva
CPU使用率(采样)
,我看到CPU峰值的顶部以及峰值的幻灯片都充满了从Dequeue
和TrySteal
方法堆积起来的CPU样本。另外,系统指标显示,在CPU加载期间,应用程序经历了大量使用的工作线程(ThreadPool.GetAvailableThreads-ThreadPool.GetMinThreads
),我使用ThreadPool.SetMinThreads
进行设置。这台机器有16个核,所以我测试了应用程序,每个核的值分别为2048和512个工人:每个核分别为128和32个工人
就目前而言,CPU负载似乎是由大量工作线程造成的,这些线程试图在没有工作请求的情况下接收任何工作请求。因此,工作人员浪费CPU,试图在本地队列、全局线程池队列中查找工作请求,并试图从其他线程的本地队列中窃取工作
是什么原因导致工作线程数量激增?16个CPU内核真的会因为512个工人试图找到工作而变得匮乏吗?或者这仅仅是任何其他问题的结果 附件说明 1) CPU样本在所有应用程序线程堆栈中的分布 2) CPU样本在单个随机应用程序线程堆栈中的分布
“16个CPU核真的会因为512个工作线程而耗尽吗”似乎是这样的,特别是在.net的vm这样高度复杂的环境中。有这么多工人有什么意义呢?关键是我们多年来在许多应用程序中使用了每个核心128或32名工人的修改器,实际上它以前工作得很好。这意味着每一个核心都能够并行地为多达128名工人提供相当好的服务。尽管我们的应用程序被认为是高负载的,但它们的行为似乎是容错的。上面的应用程序在相当长的一段时间内都能很好地承受200转/秒的负载。它为什么开始遇到CPU使用问题还远不明显。