使用Sigar API获取JVM CPU使用率

我正在使用Sigar来获取应用程序服务器中当前正在运行的JVM的CPU使用率,并将其存储为该数据的历史视图,但是我总是获得0%的CPU百分比。

同时,我保持visualVM处于打开状态以监视CPU使用率,并且看到visualVM中的CPU%定期更改,而使用Sigar总是报告0%。

这是我定期运行的代码:

Sigar sigar = new Sigar();

ProcCpu cpu = null;

long pId = sigar.getPid(); // This one gives me the same process ID that I see in visualVM

try {

cpu = sigar.getProcCpu(pId);

}

catch (SigarException se) {

se.printStackTrace();

}

System.out.print(cpu.getPercent());

该代码始终给出0%。

在这种情况下,我在做什么错呢?如何让Sigar显示类似于VisualVM中显示的CPU使用率?

我尝试添加

cpu.gather(sigar, pId);

在调用getProcCpu(pid)之后,但是即使我不断增加和减少服务器上的负载,我仍然只得到两个值(0.0和9.08729312E-315)…

回答:

我认为这取决于Sigar如何解释可用信息。可获得的信息(CPU使用时间)不是很频繁地更新,并且ProcCpu只是即时的CPU使用信息,这就是为什么大多数CPU使用ProcCpu率为0的原因。从未见过,但对于某些情况,ProcCpu此值应大大超过100

%。

您可以获取一段时间的CPU使用率,ProcCpu从它的开始和结束时刻开始分析两个s,并考虑CPU使用时间和ProcCpu(lastTime)的时间。但是请记住,CPU使用时间值更新的频率不是很高,因此有可能使相同的CPU使用时间ProcCpu相隔多于秒。要获得实际的CPU使用率信息,您必须收集两个或多个ProcCpu


我已绘制了一个监视器,该监视器汇总并更新了有关CPU使用率的信息:

import java.util.Timer;

import java.util.TimerTask;

import org.hyperic.sigar.ProcCpu;

import org.hyperic.sigar.Sigar;

class SigarLoadMonitor {

private static final int TOTAL_TIME_UPDATE_LIMIT = 2000;

private final Sigar sigar;

private final int cpuCount;

private final long pid;

private ProcCpu prevPc;

private double load;

private TimerTask updateLoadTask = new TimerTask() {

@Override public void run() {

try {

ProcCpu curPc = sigar.getProcCpu(pid);

long totalDelta = curPc.getTotal() - prevPc.getTotal();

long timeDelta = curPc.getLastTime() - prevPc.getLastTime();

if (totalDelta == 0) {

if (timeDelta > TOTAL_TIME_UPDATE_LIMIT) load = 0;

if (load == 0) prevPc = curPc;

} else {

load = 100. * totalDelta / timeDelta / cpuCount;

prevPc = curPc;

}

} catch (SigarException ex) {

throw new RuntimeException(ex);

}

}

};

public SigarLoadMonitor() throws SigarException {

sigar = new Sigar();

cpuCount = sigar.getCpuList().length;

pid = sigar.getPid();

prevPc = sigar.getProcCpu(pid);

load = 0;

new Timer(true).schedule(updateLoadTask, 0, 1000);

}

public double getLoad() {

return load;

}

}

  • ProcCpu —通过进程信息即时获得CPU使用率
  • curPc.getTotal() —进程使用CPU的总时间
  • curPc.getLastTime()ProcCpu代表信息的时刻
  • CPU使用率(load)是某个时间段(totalDelta)中进程使用CPU 的时间与该时间段的持续时间(timeDelta)的比率。

尽管CPU使用时间不经常更新,但我引入了简单的启发式方法,它假定负载与以前相同,而CPU使用时间不更新。但是,假设一段时间内某个进程的负载可能为零,我介绍了一个duration(TOTAL_TIME_UPDATE_LIMIT),此后,相同的CPU使用时间值变为合法,并且负载实际上为零。

以上是 使用Sigar API获取JVM CPU使用率 的全部内容, 来源链接: utcz.com/qa/417133.html

回到顶部