上下文切换会导致高CPU

时间:2013-09-22 07:19:33

标签: java windows multithreading performance

我们正在分析性能问题,我们最多可能有500个工作线程,CPU使用率不是很高。 上下文切换会导致高CPU吗?换句话说,由于CPU使用率不高,因此上下文切换(500个线程)不是问题。

2 个答案:

答案 0 :(得分:4)

只有编程强制过多的上下文切换。如果操作系统的调度程序认为执行此操作对性能有利,则它只会执行上下文切换。调度程序非常智能,并且会限制上下文切换的数量,以避免在可能的情况下对性能产生负面影响。

但是,如果糟糕的编程阻止调度程序执行,那么,您可以获得过多的上下文切换。

例如,假设我有一个核心和500个线程。如果这500个线程中的每一个都尝试执行大量工作,则调度程序将让每个线程运行一段合理的时间,以使上下文切换的总开销不是非常高。其中一些线程可能会看到非常高的延迟,但每个线程运行的时间足够长,以至于上下文切换不会破坏性能。

但是说调度程序会调度第一个线程,然后,稍后只需几个指令,该线程就不再可以运行了。现在,调度程序别无选择,只能切换上下文。如果下一个线程再次运行很短的时间,然后不再准备运行,您将强制进行另一个上下文切换。这会扼杀性能。

强制上下文切换很糟糕。调度程序选择执行的上下文切换是好的。

答案 1 :(得分:1)

是的,上下文切换可能导致性能问题,但正确的设计通常会阻止这是一个问题。一般来说,在任何时候都拥有比可用内核更多的线程“runnable”并不是非常有效:如果有多个线程阻塞某些事情,你可以获得性能提升(I / O是一个常见的例子)但是如果你只是想完成大量的工作,每个核心一次只执行一个任务通常会更有效(更少的上下文切换,更少的内存开销等)。这就是ExecutorService有用的原因:它允许您将所有作业分配到队列中,而不必担心线程的机制。