我正在運行AMD四核處理器的Ubuntu 12.04系統上使用akka/scala 2.10.3進行試驗。akka線程在應用程序空閒時使用100%CPU
我寫了一個服務器,它應該在收到請求時執行一些計算。客戶端將使用演員信息發送一些數據(字符串列表)。當服務器上的角色收到列表時,會將其分成四個列表,並有四個子角色對列表進行排序。
到目前爲止很好:該程序的工作原理,我可以驗證客戶端接收正確排序的列表作爲結果。
然而,有兩件事情我沒有在服務器的行爲理解:
- 當我啓動服務器,即使沒有演員是做任何處理(他們都在等待消息),我的處理器的所有四個內核的使用率幾乎達到100%。這怎麼可能?核心只有在某些演員計劃處理某些消息時才能使用?
- 我原本以爲由四個角色完成的工作會自動暗示排序會加速四倍:每個角色都在單獨的線程中運行,並且每個線程都由不同的核心運行。但是,情況並非如此:沒有觀察到加速,甚至基於角色的排序比簡單的單線程排序慢得多。原因是我的調度程序配置,即默認配置不會自動利用多個核心?
編輯 繼丹西蒙的建議,我已經調查問題1利用visualvm
。
visualvm
報告幾個等待大部分時間的調度程序線程(所以它們似乎沒有使用太多的CPU時間)。 visualvm
也顯示了幾個其他線程一直運行,即使應用程序沒有做任何事情;至少,我的代碼沒有被執行。這些繁忙線程被命名爲New I/O worker #1, #2, #4, #5
,New I/O boss #3
,New I/O server boss
,Signal Dispatcher
, RMI TCP Connection(2)-127.0.0.1
, Attach Listener
和RMI TCP Accept-0
。
我有一些編程阿卡的經驗,但配置它幾乎沒有經驗,所以我無法理解上述信息。
默認的調度程序使用fork-join調度程序,並將有多個線程對應於物理內核的數量(我相信它是每個內核2個),所以我懷疑還有其他問題正在進行。我注意到fork-join有時忙於等待,但不像你描述的那樣。你可以發佈一些代碼嗎? –
@Dan Simon:感謝您的反饋。代碼不夠小,無法發佈到這裏,我可以將它上傳到某處並在此處發佈鏈接。或者你想看哪些代碼部分? – Giorgio
不太確定,你的演員是否在構建或者在他們的'preStart'方法中做了什麼?演員是否有任何形式的初始化消息或可能是某種定期輪詢工作?另外,你是否嘗試過使用像visualvm這樣的分析器來查看CPU的使用位置? –