应用程序空闲时,akka线程使用100%CPU

Gio*_*gio 5 multithreading scala akka

我正在使用运行AMD四核处理器的Ubuntu 12.04系统上试验akka/scala 2.10.3.

我写了一个服务器,它应该在收到请求时执行一些计算.客户端将使用actor消息发送一些数据(字符串列表).当服务器上的actor接收到列表时,它会将其拆分为四个列表,并有四个子actor对列表进行排序.

到目前为止一切顺利:程序正常运行,我可以验证客户端是否收到了正确排序的列表.

但是在服务器的行为中我有两件事我不明白:

  1. 一旦我启动服务器,即使没有演员正在进行任何处理(他们都在等待消息),我的处理器的所有四个内核的使用率几乎达到100%.这怎么可能?当一些演员计划处理某些消息时,是否应该仅使用核心?
  2. 我原本预计由四个演员完成的工作会自动暗示排序会加速四倍:每个演员都在一个单独的线程中运行,每个线程都由不同的核心运行.然而,事实并非如此:没有观察到加速,甚至基于actor的排序比普通的单线程排序慢得多.原因可能是我的调度程序配置,即默认配置不会自动利用多个核心?

编辑 遵循丹西蒙的建议,我已经研究了问题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.

我有一些编程akka的经验,但几乎没有配置它的经验,所以我无法理解上述信息.

Cap*_*ngs 0

“他们进入了一种只等待传入消息的状态”

当消息通过回调方法到达时,参与者是否会收到通知,或者参与者本身是否会轮询某个队列以查看是否有新消息?

如果您正在轮询,发现没有工作,然后立即返回再次轮询(本质上是忙于旋转),后者可能会导致 100% cpu 使用率。修复方法是在再次轮询之前等待一段时间(Thread.yield()、LockSupport.parkNanos(1) 等)。