栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Sigar API获取JVM CPU使用率

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Sigar API获取JVM CPU使用率

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/507706.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号