【问题标题】:Sigar ProcCpu gather method always returns 0 for percentage valueSigar ProcCpu 收集方法始终返回 0 作为百分比值
【发布时间】:2018-07-02 12:24:54
【问题描述】:

我正在使用 Sigar 尝试获取各个进程的 CPU 和内存使用情况(在 Windows 下)。我可以使用以下代码正确获取整个系统的这些统计信息:

Sigar sigar = new Sigar();

long totalMemory = sigar.getMem().getTotal() / 1024 /1024;
model.addAttribute("totalMemory", totalMemory);

double usedPercentage = sigar.getMem().getUsedPercent();
model.addAttribute("usedPercentage", String.format( "%.2f", usedPercentage));

double freePercentage = sigar.getMem().getFreePercent();
model.addAttribute("freePercentage", String.format( "%.2f", freePercentage));

double cpuUsedPercentage = sigar.getCpuPerc().getCombined() * 100;
model.addAttribute("cpuUsedPercentage", String.format( "%.2f", cpuUsedPercentage));

这在我的网页中很好地显示了以下内容:

系统总内存:16289 MB 已用内存百分比:66.81 % 可用内存百分比:33.19 % CPU 使用率:30.44 %

现在我正在尝试从 Java 和 SQL Server 等单个进程获取信息,虽然正确收集了内存,但两个进程的 CPU 使用率始终为 0。下面是我正在使用的代码:

Sigar sigar = new Sigar();
List<ProcessInfo> processes = new ArrayList<>();

ProcessFinder processFinder = new ProcessFinder(sigar);
long[] javaPIDs = null;
Long sqlPID = null;

try
{
    javaPIDs = processFinder.find("Exe.Name.ct=" + "java.exe");
    sqlPID = processFinder.find("Exe.Name.ct=" + "sqlservr.exe")[0];
}
catch (Exception ex)
{}

int i = 0;

while (i < javaPIDs.length)
{
    Long javaPID = javaPIDs[i];
    ProcessInfo javaProcess = new ProcessInfo();
    javaProcess.setPid(javaPID);
    javaProcess.setName("Java");

    ProcMem javaMem = new ProcMem();
    javaMem.gather(sigar, javaPID);
    javaProcess.setMemoryUsage(javaMem.getResident() / 1024 / 1024);

    MultiProcCpu javaCpu = new MultiProcCpu();
    javaCpu.gather(sigar, javaPID);
    javaProcess.setCpuUsage(String.format("%.2f", javaCpu.getPercent() * 100));

    processes.add(javaProcess);

    i++;
}

if (sqlPID != null)
{
    ProcessInfo sqlProcess = new ProcessInfo();
    sqlProcess.setPid(sqlPID);
    sqlProcess.setName("SQL Server");

    ProcMem sqlMem = new ProcMem();
    sqlMem.gather(sigar, sqlPID);

    sqlProcess.setMemoryUsage(sqlMem.getResident() / 1024 / 1024);

    ProcCpu sqlCpu = new MultiProcCpu();
    sqlCpu.gather(sigar, sqlPID);
    sqlProcess.setCpuUsage(String.format( "%.2f", sqlCpu.getPercent()));

    processes.add(sqlProcess);
}

model.addAttribute("processes", processes);

我已经尝试了ProcCpuMultiProcCpu,即使我可以在任务管理器中看到 Java 使用 15% CPU,它们也总是返回 0.0。 Sigar 库上的文档几乎不存在,但我所做的研究告诉我,我似乎做得正确。

有谁知道我做错了什么?

谢谢!

【问题讨论】:

    标签: java cpu percentage zero sigar


    【解决方案1】:

    我在继续在线搜索时发现了该问题。基本上,sigar 库只能在一定时间后检索正确的 CPU 值。我的问题是每次显示页面时我都在初始化一个新的 Sigar 实例。我让我的 Sigar 实例对我的 Spring 控制器是全局的,现在它返回正确的百分比。

    【讨论】:

    • 您能否提供您的个人流程指标收集实施?我面临着和你一样的问题。
    • 我真的放弃了。我尝试了 JavaSysMon,即使使用 Java 11,它也会在某些时候使 JVM 崩溃。
    • 对不起,昨晚读到了,哈哈。我确实设法使 CPU 使用率工作(尽管值是有问题的),但我放弃了使用任何形式的 java 代码来获取这种信息,因为它总是在某些时候由于某种原因使 JVM 崩溃。如果你愿意,我可以分享我的代码,但我必须警告你,根据我的经验,这些类型的库是不可靠的。
    • 非常感谢。有没有办法计算特定进程id的CPU使用率、内存使用率和磁盘I/O?
    • 目前正在做一个项目来计算 java 应用程序的 CPU 使用率、内存、磁盘 I/O 等。如果您能帮我提供一些想法,我将不胜感激,我该如何计算上述指标
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多