为什么在Java中,我的CPU绑定线程会导致内核空间中的操作



我有一个C类型的大数组和一个线程池。每个线程都有一系列索引(它们不重叠),并执行一些CPU绑定操作来填充它们。

在将任务提交给执行器(使用newFixedThreadPool创建)后,我监视"top"命令的输出,并可以注意到cpu在执行这些任务期间(在低值之前和再次降低之后)在内核空间中花费了大量时间("top"输出中的"%sy")-在15%到25%之间。在某些测试运行中,确实会发生"%sy"接近0的情况,然后执行速度会快得多。

线程数量等于测试机器上逻辑CPU的数量,这也是我提交给执行器的任务数量(所以这就像1个线程-1个CPU绑定的任务)。因此,我不希望这里有太多上下文切换。

在这部分代码中,我没有进行显式同步,我只依赖执行器服务提供的保证,因为线程不共享任何变量。

操作系统为Amazon Linux AMI 2014.09,程序运行在Java 8上。

你知道为什么会发生这种事吗?如何调试此类问题?

您可能需要使用Profiler

最新更新