java

37 阅读1分钟

许多流行的 Java 框架通过将其工作负载分布在多个并发计算单元上来提供水平可扩展性。如果并发线程数超过内核数,则每次换出线程以运行另一个进程时,应用程序都会遭受性能下降。这种交换的性能成本通常会在总处理时间上增加数十个不必要的微秒,更不用说用于处理其他可能不那么关键的任务的时间量了。即使关键线程的数量不超过核心的数量,线程仍然会不时被换出或取消调度,以允许其他线程暂时运行。此外,此外,即使关键线程在100%CPU下运行,即使没有来自其他线程的明显压力,调度程序仍会偶尔将其移动到另一个空闲核心。这样的移动不仅会增加交换机本身的成本,还会由于缓存失效而导致抖动增加。

为了控制线程不被调度,我们可以将每个关键线程固定到一个内核。与内核隔离结合使用以减少其他任务的中断,这在很大程度上消除了由调度程序中断和内核迁移引起的抖动,并最大限度地利用指令和数据缓存的好处。