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