【发布时间】:2014-10-27 16:00:52
【问题描述】:
我知道在 Java 中可以使用ThreadMXBean 来获取任何线程的 CPU 利用率。
但是,据我了解,可以安排参与者在线程池中的任何线程上执行。因此,同一演员随后对getCurrentThreadCpuTime 的调用可能最终会给出完全不相关的数字。
以上是真的吗?如果是的话,有什么办法可以通过actor自己找到CPU使用率?
【问题讨论】:
我知道在 Java 中可以使用ThreadMXBean 来获取任何线程的 CPU 利用率。
但是,据我了解,可以安排参与者在线程池中的任何线程上执行。因此,同一演员随后对getCurrentThreadCpuTime 的调用可能最终会给出完全不相关的数字。
以上是真的吗?如果是的话,有什么办法可以通过actor自己找到CPU使用率?
【问题讨论】:
你的想法是正确的。
Akka,默认情况下,根据需要从线程池中分配一个空闲线程,没有承诺将池中的哪个线程用于发送给参与者的每条消息(尽管批处理往往意味着发送到的消息靠近在一起的同一个演员将倾向于在同一个线程上)。 Akka 确实允许配置线程池,这可能包括为每个参与者配置一个线程。然而,跨多个参与者共享线程避免了 SEDA 架构的一些弱点(在多插槽设置中它可能会遇到延迟增加)。
在最好的情况下,Java 中的 CPU 利用率很棘手。 Java 将线程调度委托给操作系统,并且在从操作系统查询该信息的方式上并没有暴露太多。添加 Akka 对线程池的使用,并将 Akka 调度与 actor 运行时分开,这导致我们说答案是否定的;没有受支持的方法可以在每个参与者的基础上获得准确的 CPU 利用率。
作为替代方案,您可以测量每个 Actor 内的挂钟时间。这将通过将您自己的包装器添加到每个参与者的接收方法来最简单地完成。 TypeSafe 曾经有一个用于 Akka 的监控工具,他们有 discontinued,而是开始与 thirdparties 合作提供企业监控。
【讨论】:
虽然!这个帖子和答案很旧。我想更新答案
在比较 java 线程和参与者的 CPU 利用率时,我处于类似的情况。
我使用 Kamon.io 与 https://www.datadoghq.com 合作来更好地了解我的演员的 CPU、内存和网络使用情况。
【讨论】: