我们正在分析一个性能问题,我们可能最多有 500 个工作线程,CPU 使用率不是很高。上下文切换会导致高 CPU 吗?换句话说,由于 CPU 使用率不高,上下文切换(500 个线程)在这里没有问题。
2 回答
仅当编程强制进行过多的上下文切换时。您的操作系统的调度程序只有在认为这样做对性能有利时才会执行上下文切换。调度器非常聪明,如果可能的话,它会限制上下文切换的数量以避免对性能产生负面影响。
但是,如果糟糕的编程会阻止调度程序这样做,那么您可能会获得过多的上下文切换。
例如,假设我有一个核心和 500 个线程。如果这 500 个线程中的每一个都尝试做大量工作,调度程序将让每个线程运行一段合理的时间,这样上下文切换的总开销就不会太高。其中一些线程可能会看到非常高的延迟,但每个线程都会运行足够长的时间,以至于上下文切换不会影响性能。
但是假设调度程序调度了第一个线程,然后,在几条指令之后,该线程不再准备好运行。现在调度器别无选择,只能切换上下文。如果下一个线程再次运行了很短的时间,然后不再准备运行,您将强制另一个上下文切换。这会扼杀性能。
强制上下文切换是不好的。调度程序选择执行的上下文切换是好的。
是的,上下文切换可能会导致性能问题,但适当的设计通常会防止这成为问题。一般来说,在任何时候拥有比可用内核多得多的线程“可运行”并不是非常有效:如果多个线程阻塞某事发生(I/O 是一个常见示例),您可以获得性能改进,但是如果你只是想完成大量的工作,每个核心一次只执行一个任务通常会更有效(更少的上下文切换,更少的内存开销等)。这就是ExecutorService
有用的原因:它可以让您将所有作业分派到一个队列中,而不必担心线程机制。