尝试快速运行SIGAR以获取大量硬件指标示例,我看到了这种行为:
val sig: Sigar = new Sigar()
val steady_cpu: Double = (for (i <- 1 to 100) yield sig.getCpuPerc().getUser()).sum / 100.0
其中steady_cpu导致NaN。查看生成的列表,NaN来自返回NaN的getUser()调用
答案 0 :(得分:3)
一般问题似乎是SIGAR调用可能是有状态的,并且过快地调用函数不会给SIGAR时间来重建它的内部状态。我猜他们正在计算CPU周期或类似的东西,这通常是近似科学,如果你太快地调用函数,内部库最终会除以零。修复是在调用之间添加一个短暂的休眠:
val sig: Sigar = new Sigar()
val steady_cpu: Double = (for (i <- 1 to 100) yield {
Thread.sleep(10);
sig.getCpuPerc().getUser()
}).sum / 100.0