Как я могу получить использование ЦП процесса с помощью «списка задач» в Windows - PullRequest
7 голосов
/ 17 апреля 2019

Я пишу программу на Java, чтобы периодически отображать использование процессора и памяти для данного идентификатора процесса. Моя реализация вызывает список задач. Довольно просто получить использование памяти с помощью следующей команды:

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

Это вернет использование памяти идентификатором процесса 2076, и я могу использовать это для своей задачи. Вызвав следующую команду, я могу извлечь процессорное время.

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

У меня вопрос: как мне использовать процессор для этого процесса?

Я нашел сообщение в StackOverflow для моего вопроса, но ответ не ясен, и я не понимаю, что набрать в команде, чтобы получить то, что мне нужно. На вопрос был дан ответ в 2008 году, а кто-то попросил разъяснений в 2013 году, но тот, кто ответил на вопрос, не ответил.

Здесь - это сообщение, которое я нашел.

Ответы [ 3 ]

1 голос
/ 25 апреля 2019

Я однажды написал класс:

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.

1 голос
/ 25 апреля 2019

Память похожа на чайную чашку, она может быть полной или пустой, мгновенный взгляд на чашку позволяет увидеть, насколько она полна чая (это ваша команда "memusage").

Процессоркак подъемник.Он движется с относительно постоянной скоростью, независимо от того, едете ли вы на лифте или нет.Невозможно определить ваше использование в одном мгновенном наблюдении - нам нужно знать, как долго вы на нем катались (это ваша команда "cputime").Вы должны использовать команду "cputime" как минимум дважды!

Например:

  • В 19:09 вы запускаете команду cputime в своем процессе, и она возвращает "28 минут "
  • В 19:17 вы снова запускаете команду cputime для своего процесса, и она возвращает" 32 минуты "

С первого запуска команды cputimeво второй раз, использование увеличилось с 28 минут до 32 минут - процесс использовал 4 минуты процессорного времени.

С 19:09 до 19:17 - продолжительность 8 минут - Aвсего было доступно 8 минут времени, но ваш процесс просто использовал 4 минуты: 4/8 = 50% среднего использования системы.

Если в вашей системе несколько процессоров, вы можете разделить их на общее количество процессоров.чтобы получить среднее значение для каждого процессора - например, 50% / 2 = 25% в среднем в системе с двумя процессорами.

Я использовал минуты выше для простоты написания - в действительности вы можете посмотреть, сколько наносекунд процессорного временипроцесс, используемый во временном окне, которое является справедливымдлительность t миллисекунд.

1 голос
/ 22 апреля 2019

список задач не предоставляет информацию, которую вы ищете. Я бы предложил использовать Get-Counter . Комментарий к ответу с сайта SuperUser похоже на то, что вы ищете.

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
...