我正在使用运行AMD四核处理器的Ubuntu 12.04系统上试验akka / scala 2.10.3。
我写了一个服务器,它应该在收到请求时执行一些计算。客户端将使用actor消息发送一些数据(字符串列表)。当服务器上的actor接收到列表时,它会将其拆分为四个列表,并有四个子actor对列表进行排序。
到目前为止一切顺利:程序正常运行,我可以验证客户端是否收到了正确排序的列表。
然而,在服务器的行为中我有两件事我不明白:
修改
根据Dan Simon的建议,我使用visualvm
来研究问题1。
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
和{ {1}}。
我有一些编程akka的经验,但几乎没有配置它的经验,所以我无法理解上述信息。
答案 0 :(得分:0)
“他们进入一种只等待传入消息的状态”
当消息通过回调方法到达时是否通知了演员?演员是否自己轮询某个队列以查看是否有新消息?
如果您正在进行轮询,找不到任何工作,然后再返回轮询(基本上是忙于旋转),后者可能会导致100%的CPU使用率。在再次轮询之前,修复是等待(Thread.yield(),LockSupport.parkNanos(1)等)。