我有一个多线程 Web 应用程序,在生产环境中有大约 1000~2000 个线程。
我预计 CPU 使用率会打开,w3wp.exe
但会占用System Idle Process
CPU。为什么?
我有一个多线程 Web 应用程序,在生产环境中有大约 1000~2000 个线程。
我预计 CPU 使用率会打开,w3wp.exe
但会占用System Idle Process
CPU。为什么?
空闲进程实际上不是一个真正的进程,它不会“吃掉”你的 CPU 时间。您在旁边看到的 %cpu 实际上是未使用的 %cpu (或多或少)。
您的应用程序性能不佳的原因很可能是由于您的 2000 个线程。Windows(或实际上任何操作系统)从来没有打算一次运行这么多线程。您大部分时间都在浪费它们之间的上下文切换,每约 30 秒(15 毫秒 * 2000 = 30 秒!!!),每个处理时间都会得到几毫秒的处理时间。
重新考虑您的应用程序。
空闲进程只是保持进程时间直到程序需要它,它实际上根本不吃任何周期。您可以将系统空闲时间视为“可用 cpu”
System Idle Process
不是真正的进程,它代表未使用的处理器时间。
这意味着您的应用程序没有完全利用处理器 - 它可能受内存限制或 CPU 限制;可能线程正在等待彼此,或等待外部资源?上下文切换开销也可能是罪魁祸首——除非你有 2000 个内核,否则线程实际上并不是同时运行的,而是由任务调度程序分配的时间片,这也需要一些时间。
你没有提供很多细节,所以我只能在这一点上推测。我会说这些线程中的大多数可能什么都不做。那些正在做某事的人可能是 IO 绑定的,这意味着他们大部分时间都在等待外部资源响应。
现在让我们谈谈“1000~2000 个线程”。在极少数情况下(可能没有)拥有这么多线程是个好主意。我认为您当前的问题是一个完美的例子。大多数这些线程(显然无论如何)除了浪费资源什么都不做。如果您想并行处理多个任务,特别是如果它们是 IO 绑定的,那么最好利用池化资源,例如ThreadPool
或通过使用Task Parallel Library。