首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >窗口任务CPU利用率与Oshi CPU使用率的差异

窗口任务CPU利用率与Oshi CPU使用率的差异
EN

Stack Overflow用户
提问于 2020-04-09 06:34:17
回答 1查看 805关注 0票数 1

我使用Oshi (https://github.com/oshi/oshi)来获得CPU的使用率。但是,为什么这个值不同于任务管理器CPU利用率呢?我犯了什么错?

我的计划--平均11.13%

任务管理器-平均约29%

编辑代码

代码语言:javascript
复制
private SystemInfo systemInformation = new SystemInfo();
private CentralProcessor proc = systemInformation.getHardware().getProcessor();

private static float[] floatArrayPercent(double d) {
  float[] f = new float[1];
  f[0] = (float) (100d * d);
  return f;
}

private double cpuData(CentralProcessor proc) {
  double d = proc.getSystemCpuLoadBetweenTicks(oldTicks);
  oldTicks = proc.getSystemCpuLoadTicks();
  return d;
}


@Scheduled(fixedRate = 10)
public void processProcessorInformation() {
  System.out.println("The percentage of the floating value  cpu: " + floatArrayPercent(cpuData(proc))[0]);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-09 22:46:49

问题是,当您打算进行“最近”使用情况计算时,有一行代码会将其重置为累积(自启动以来)的使用量计算。

getSystemCpuLoadBetweenTicks(oldTicks)计算测量用户、系统、空闲等从当前计数器到之前传递给它的计数器的运行情况,并在这些时间点之间给出使用情况。在您的cpuData()方法中,您正确地保存了旧代码,并可能打算再次使用它们。那部分是对的。

但是,在您的processProcessorInformation()中,您每次都会将oldTicks数组调零:oldTicks = new long[TickType.values().length];。因此,返回的值是启动后的累积平均CPU使用量,而不是最后10秒。删除该行(或将其移出预定的方法)应该会给出您期望的结果。

您也不需要每次都需要cpu对象的新副本。在移动oldTicks初始化时,可以将该初始化从计划的方法中移出。

在一个相关的注释中,@Elliot提到了涉及多个处理器的计算。这是一个有用的警告时,比较处理器滴答与时间(例如,如果你测量之间经过的时间周期滴答)。滴答在每个逻辑处理器上累积,因此您需要确保缩放“经过的时间”,以包括每个逻辑处理器。这适用于处理每个进程的CPU计算,因为您只有进程启动时间作为分母,在这种情况下,Windows被缩放以确保进程不超过100%,而*nix结果(在top上)没有缩放,并且有可能超过100%。

然而,对于系统CPU的使用,我们有一个可用的“空闲”滴答计数器,它确实会在所有处理器上累积滴答,是计算百分比使用率的更好的选择--也是getSystemCpuLoadBetweenTicks()方法中使用的方法,因此不需要进行这种校正。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61115251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档