2

尝试快速运行SIGAR以获得许多硬件指标样本,我看到了这种行为:

val sig: Sigar = new Sigar()
val steady_cpu: Double = (for (i <- 1 to 100) yield sig.getCpuPerc().getUser()).sum / 100.0 

其中 stable_cpu 结果为 NaN。查看生成的列表,NaN 来自 getUser() 调用返回 NaN

4

1 回答 1

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 
于 2013-02-10T07:50:59.287 回答