我正在使用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),即使我不断增加和减少服务器上的负载...
发布于 2013-10-12 06:12:13
我认为这取决于Sigar如何解释可用的信息。可用于它的信息(CPU使用时间)更新不是很频繁,并且CPU只是一个即时进程CPU使用信息,这就是为什么大多数ProcCpu的CPU使用是0的原因。从来没有见过它们,但对于一些ProcCpu来说,这个值应该比100%要好得多。
您可以获得一段时间内的CPU使用情况,从开始和结束时刻分析两个ProcCpu,并考虑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使用率informationcurPc.getTotal() -进程使用的总时间CPUcurPc.getLastTime() - ProcCpu表示CPU使用率的时刻(load)是进程在一段时间内使用CPU的时间(totalDelta)与该时间段的持续时间(timeDelta).的比率
虽然CPU使用时间更新不是很频繁,但我引入了简单的启发式方法,即假设负载与以前相同,而CPU使用时间不更新。但是假设某个进程在一段时间内可以为零负载,我引入了一个持续时间(TOTAL_TIME_UPDATE_LIMIT),在此之后,相同的CPU使用时间值变得合法,并假设负载实际上为零。
https://stackoverflow.com/questions/19323364
复制相似问题