当前位置: 首页 > 面试题库 >

使用Sigar API获取JVM CPU使用率

景成和
2023-03-14
问题内容

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



 类似资料:
  • 问题内容: 我正在尝试使用Java获取当前正在运行的Java虚拟机使用的CPU百分比。我的研究指出我要使用该类。通过在线示例,我编写了以下内容: 在两台计算机上对此进行测试后,我无法停止获得两个调用的结果。我尝试通过各种方法使用Java 7和6的64位和32位版本运行此代码。不过,我得到的是打印出的该,根据的Javadoc, 我不知道还要在这里做什么。获取CPU负载至关重要,我想避免使用其他库,例

  • 获取使用者列表 请求方式: GET 请求地址: https://open.qingtui.cn/v1/app/followers?access_token=ACCESS_TOKEN&page_size=PAGE_SIZE&request_page=REQUEST_PAGE 参数说明: 参数 必须 说明 access_token 是 接口调用凭证 page_size 是 请求页面数量 request

  • 问题内容: 我正在使用URL类从中读取InputStream。有什么我可以使用RestTemplate的方法吗? 我怎样才能 用,而不是使用? 问题答案: 您不应该直接获得。旨在封装处理响应(和请求)内容。它的优势在于处理所有IO,并为您提供现成的Java对象。 的一位原始作者Brian Clozel 表示: 并不意味着流响应主体;它的合同不允许这样做,而且已经存在了很长时间,以至于在不中断许多应

  • 问题内容: 我需要从http://vortaro.us.to/ajax/epo/eng/ +’word’+“ /?callback =?” 获取json数据 。工作示例(信誉不足) 我知道如何用JavaScript来做,但是我需要我的php文件来获取此数据,它必须是服务器端的,谢谢。我是新手,我已经花了整整一天的时间来弄清楚这一点。fopen和fread不起作用, 问题答案: file_get_c

  • 我使用URL类从中读取InputStream。有什么方法可以使用RestTemplate实现这一点吗? 如何使用RestTemplate而不是使用URL来获取InputStream?

  • 问题内容: 在此示例中,我想将SRC属性转换为变量: 因此,例如-我想要一个变量。重要!src属性将是 dynamic ,因此不能进行硬编码。有什么快速简便的方法可以做到这一点吗? 谢谢! 编辑:图像将是一个巨大的字符串的一部分,基本上是新闻故事的内容。因此,图像只是其中的一部分。 EDIT2:此字符串中将有更多图像,我只想获取第一个的src。这可能吗? 问题答案: 使用类似的HTML解析器,然后