尝试快速运行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
一般问题似乎是 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