我认为这取决于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使用时间值变为合法,并且负载实际上为零。



