如何在Windows中使用“tasklist”获取进程的CPU使用率

问题描述 投票:7回答:3

我正在用Java编写程序来定期显示给定进程ID的CPU和内存使用情况。我的实现调用tasklist。通过以下命令获取内存使用非常简单:

tasklist /fi "memusage ge 0" /fi "pid eq 2076" /v

这将返回进程ID 2076的内存使用情况,我可以将其用于我的任务。通过调用以下命令,我可以提取CPU时间。

tasklist /fi "pid eq 2076" /fi "CPUTIME ge 00:00:00" /v

我的问题是,我将如何获得此进程的CPU使用率?

我在StackOverflow上发现了一个关于我的问题的帖子,但答案并不清楚,我不明白在命令中输入什么来获得我需要的东西。该问题于2008年得到解答,有人要求在2013年做出澄清,但回答问题的人没有回复。

Here是我发现的帖子。

java windows command-line process cpu-usage
3个回答
1
投票

任务列表不提供您要查找的信息。我建议使用Get-CounterA comment on an answer from the SuperUser site看起来正在追求你所追求的目标。

Get-Counter '\Process(*)\% Processor Time' | Select-Object -ExpandProperty countersamples| Select-Object -Property instancename, cookedvalue| ? {$_.instanceName -notmatch "^(idle|_total|system)$"} | Sort-Object -Property cookedvalue -Descending| Select-Object -First 25| ft InstanceName,@{L='CPU';E={($_.Cookedvalue/100/$env:NUMBER_OF_PROCESSORS).toString('P')}} -AutoSize

1
投票

我曾写过一堂课:

private static class PerformanceMonitor {
    private int availableProcessors = ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors();
    private long lastSystemTime = 0;
    private long lastProcessCpuTime = 0;

    /**
     * Get's the cpu usage of the jvm
     *
     * @return the cpu usage a double of percentage
     */
    private synchronized double getCpuUsage() {
        if (lastSystemTime == 0) {
            baselineCounters();
            return 0d;
        }

        long systemTime = System.nanoTime();
        long processCpuTime = 0;

        if (getOperatingSystemMXBean() instanceof com.sun.management.OperatingSystemMXBean) {
            processCpuTime = ((com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getProcessCpuTime();
        }

        double cpuUsage = ((double) (processCpuTime - lastProcessCpuTime)) / ((double) (systemTime - lastSystemTime));

        lastSystemTime = systemTime;
        lastProcessCpuTime = processCpuTime;

        return cpuUsage / availableProcessors;
    }

    private void baselineCounters() {
        lastSystemTime = System.nanoTime();

        if (getOperatingSystemMXBean() instanceof com.sun.management.OperatingSystemMXBean) {
            lastProcessCpuTime = ((com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getProcessCpuTime();
        }
    }
}

使用如下:

 private static final PerformanceMonitor _MONITOR = new PerformanceMonitor();
 _MONITOR.getCpuUsage();

这将打印出此JVM进程使用的cpu的使用情况。


1
投票

记忆就像一个茶杯,它可能是满满的或空的,瞬间看看杯子可以让你看到它是多么的茶(这是你的“memusage”命令)。

CPU就像一个滑雪缆车。无论您是否乘坐电梯,它都会以合理的恒定速度移动。在一次即时观察中无法确定您的使用情况 - 我们需要知道您使用它的时间长度(这是您的“cputime”命令)。你必须至少使用“cputime”命令两次!

例如:

  • 在晚上7:09,您在进程上运行cputime命令,它返回“28分钟”
  • 在晚上7:17,你再次在你的进程上运行cputime命令,它返回“32分钟”

从第一次运行cputime命令到第二次,使用率从28分钟增加到32分钟 - 该进程使用了​​4分钟的CPU时间。

从晚上7:09到晚上7:17,持续时间为8分钟 - 总共有8分钟的时间,但您的过程只使用了4分钟:4/8 = 50%的平均系统使用率。

如果您的系统有多个处理器,那么您可以除以CPU的总数以获得每个CPU的平均值 - 例如双CPU系统中50%/ 2 = 25%的平均值。

我使用上面的分钟来便于编写 - 实际上,您可能正在查看在一个长达几毫秒的时间窗口中使用的进程的CPU时间的纳秒数。

© www.soinside.com 2019 - 2024. All rights reserved.