我知道在Java中,可以使用ThreadMXBean来获取任何线程的CPU利用率。
但是,据我所知,可以安排一个actor在线程池的任何线程上执行。因此,来自同一个演员的getCurrentThreadCpuTime
的后续调用最终可能会给出完全不相关的数字。
以上是真的吗?如果是,是否有任何方法可以找到演员本身的CPU利用率?
答案 0 :(得分:7)
你的想法是正确的。
Akka,默认情况下根据需要从线程池中分配一个空闲线程,不会对发送给actor的每个消息使用来自池中的哪个线程的承诺(虽然批处理往往意味着发送到的消息同一个演员靠近在一起会倾向于在同一个线程上)。 Akka确实允许配置线程池,这可能包括为每个actor配置一个线程。但是,跨多个actor共享线程避免了SEDA架构的一些弱点(在多插槽设置中可能会遇到延迟增加的情况)。
Java中的CPU利用率在最好的时候是棘手的。 Java将线程调度委托给操作系统,并且不会暴露从操作系统查询该信息的方式。添加Akka对线程池的使用,并将Akka调度与actor运行时分开,这导致我们说答案是否定的;没有受支持的方法来获得每个actor的准确CPU利用率。
作为替代方案,您可以测量每个Actor内的挂钟时间。通过向每个actor的receive方法添加自己的包装器,这是最简单的方法。 TypeSafe曾经为Akka提供监控工具,他们拥有discontinued并且已开始与thirdparties合作以提供企业监控。
答案 1 :(得分:1)
虽然!这篇文章&答案很老。我想更新答案
在比较java线程和actor的CPU利用率时,我遇到了类似的情况。
我使用Kamon.io与operator bool()合作,以更好地了解我的演员的CPU,内存和网络使用情况。