【问题标题】:How can I get the CPU usage of a process with "tasklist" in Windows如何在 Windows 中使用“任务列表”获取进程的 CPU 使用率
【发布时间】:2019-04-17 06:04:13
【问题描述】:

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

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 是我找到的帖子。

【问题讨论】:

  • 发现这个:social.technet.microsoft.com/Forums/en-US/… 他们说“计算 TotalProcessorTime /(Now - StarrTime) 的百分比。” - 如果你有时间值,那么应该可以从中提取百分比?
  • 对不起,我不明白该怎么做。
  • 我想知道这些板上是否有人对如何获取进程的 CPU 使用率有任何想法/更新。
  • 有趣的是,我花了一整天的时间试图为我自己的程序解决这个问题,然后我就来到了这里......

标签: java windows command-line process cpu-usage


【解决方案1】:

内存就像一个茶杯,它可能是满的,也可能是空的,瞬间看一眼杯子就可以知道它有多满(这是你的“记忆”命令)。

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 时间。

【讨论】:

    【解决方案2】:

    tasklist 没有提供您正在寻找的信息。我建议使用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
    

    【讨论】:

    • 微软惯用的用户友好性
    • 不显示进程 ID。如何让它显示 ID?
    【解决方案3】:

    我曾经写过一个类:

    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 的使用情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-16
      • 2011-10-04
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多