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

时间:2014-03-26 21:32:09

标签: multithreading scala akka

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

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

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

然而,在服务器的行为中我有两件事我不明白:

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

    visualvm报告了大部分时间都在等待的几个调度程序线程(因此它们似乎没有占用太多的CPU时间)。 visualvm还显示了一些一直在运行的其他线程,即使应用程序没有执行任何操作;至少,我的代码都没有被执行。这些主题分为New I/O worker #1, #2, #4, #5New I/O boss #3New I/O server bossSignal DispatcherRMI TCP Connection(2)-127.0.0.1Attach Listener和{ {1}}。

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

1 个答案:

答案 0 :(得分:0)

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

当消息通过回调方法到达时是否通知了演员?演员是否自己轮询某个队列以查看是否有新消息?

如果您正在进行轮询,找不到任何工作,然后再返回轮询(基本上是忙于旋转),后者可能会导致100%的CPU使用率。在再次轮询之前,修复是等待(Thread.yield(),LockSupport.parkNanos(1)等)。