为什么SIGAR会随机返回NaN或零

时间:2013-02-10 07:50:59

标签: scala nan sigar

尝试快速运行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()调用

1 个答案:

答案 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