我正在运行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的使用位置? –