首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Sigar API获取JVM CPU使用率

使用Sigar API获取JVM CPU使用率
EN

Stack Overflow用户
提问于 2013-10-12 00:49:28
回答 1查看 14.8K关注 0票数 3

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

同时,我让我的visualVM保持打开状态以监控CPU的使用情况,并且我可以在visualVM中看到CPU %的周期性变化,而使用Sigar时它总是报告0%。

下面是我定期运行的代码:

代码语言:javascript
复制
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使用情况?

我试着添加

代码语言:javascript
复制
cpu.gather(sigar, pId);

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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使用情况的信息:

代码语言:javascript
复制
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使用率information
  • curPc.getTotal() -进程使用的总时间CPU
  • curPc.getLastTime() - ProcCpu表示CPU使用率的时刻(load)是进程在一段时间内使用CPU的时间(totalDelta)与该时间段的持续时间(timeDelta).

的比率

虽然CPU使用时间更新不是很频繁,但我引入了简单的启发式方法,即假设负载与以前相同,而CPU使用时间不更新。但是假设某个进程在一段时间内可以为零负载,我引入了一个持续时间(TOTAL_TIME_UPDATE_LIMIT),在此之后,相同的CPU使用时间值变得合法,并假设负载实际上为零。

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

https://stackoverflow.com/questions/19323364

复制
相关文章

相似问题

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