我正在一台装有 AMD 四核处理器的 Ubuntu 12.04 系统上实验使用 akka/scala2.10.3。我编写了一个服务器,它在接收到请求时应该执行一些计算。客户端将使用一个 actor 消息发送一些数据 (字符串列表)。当服务器上的 actor 接收到列表时,它会将它分成四个列表,并让四个子 actor 对列表进行排序。
到目前为止还不错,该程序可以工作并且我可以验证客户端接收到正确排序的列表作为结果。
然而,有两件事情我不明白服务器行为中存在:
1. 只要我启动服务器,即使没有 actor 进行任何处理 (它们都在等待消息),我的处理器的所有四个内核使用率就会升至近乎 100%。这是怎么可能的?内核不应该只在安排处理某些消息时才被使用吗?
2. 我原本期望由四个 actor 完成的工作会自动意味着排序速度会提高四倍:每个 actor 都在单独的线程中运行,每个线程都由不同的内核运行。然而,情况并非如此: 没有观察到加速或者甚至,基于 actor 的排序比纯单线程排序要慢得多。原因可能是调度程序配置,即默认配置未能自动利用多个内核吗?
到目前为止还不错,该程序可以工作并且我可以验证客户端接收到正确排序的列表作为结果。
然而,有两件事情我不明白服务器行为中存在:
1. 只要我启动服务器,即使没有 actor 进行任何处理 (它们都在等待消息),我的处理器的所有四个内核使用率就会升至近乎 100%。这是怎么可能的?内核不应该只在安排处理某些消息时才被使用吗?
2. 我原本期望由四个 actor 完成的工作会自动意味着排序速度会提高四倍:每个 actor 都在单独的线程中运行,每个线程都由不同的内核运行。然而,情况并非如此: 没有观察到加速或者甚至,基于 actor 的排序比纯单线程排序要慢得多。原因可能是调度程序配置,即默认配置未能自动利用多个内核吗?
preStart
方法中做了什么?演员是否有任何初始化消息或者定期轮询工作的方式?另外,你是否尝试过使用类似visualvm这样的分析工具来查看CPU的使用情况? - Dan SimonpreStart
方法,在其中创建子演员和/或发送一些消息。演员还有一些初始化,但之后,它们就进入了一个状态,只等待传入的消息。据我所知,这不应意味着轮询。我现在得休息一下,但明天我会尝试使用分析器,看看能否找到更多信息。感谢您的建议。 - Giorgio