2015-04-22 17 views
0

我有大型的C型數組和一個線程池。每個線程都有一系列索引(它們不重疊),並執行一些CPU綁定操作來填充它們。爲什麼在Java中,我的CPU綁定線程可能導致在內核空間中的操作?

將任務提交給執行程序(使用newFixedThreadPool創建)後,我監視'top'命令的輸出,並注意到cpu在內核空間花費了大量時間(「top」輸出中的「%sy」)。 - 在15%和25%之間 - 在執行這些任務期間(在它低之前,在它再次下降之後)。 在一些測試運行中,它確實發生了「%sy」保持接近0,然後執行速度更快的情況。

線程的數量等於測試機器上的邏輯cpus的數量,這也是我提交給執行程序的任務數(因此它就像1個線程-1個CPU綁定任務)。所以我不期望在這裏有很多上下文切換。

在這部分代碼中,我沒有明確的同步,我只依賴執行程序服務提供的保證,因爲線程不共享任何變量。

操作系統是Linux的亞馬遜AMI 2014.09,程序上的Java 8

任何想法運行,爲什麼這可能發生嗎?我如何調試這樣的問題?

+0

您是否在共享硬件上的虛擬機上運行此操作?你能在專用機器上重現問題嗎? –

+0

它運行在aws ec2實例上。我沒有在專用機器上試過它。 – Janek

回答

相關問題