Мониторинг использования процессора и диска одной программой - PullRequest
5 голосов
/ 19 марта 2010

Как рассчитать загрузку процессора и диска другой параллельной программы?Т.е. одна программа работает, а другая рассчитывает использование ресурсов первой.

Я использую C и C ++ и работаю под Windows XP.

Ответы [ 2 ]

10 голосов
/ 19 марта 2010

Что касается использования ЦП, это не сложно сделать после просмотра этой ссылки Windows C ++ Получить использование ЦП и памяти с помощью счетчиков производительности . Насколько я понимаю (но не проверял), также можно узнать использование диска.

Идея состоит в том, чтобы использовать Счетчики производительности . В вашей ситуации вам нужно использовать счетчик производительности L"\\Process(program_you_are_interested_in_name)\\% Processor Time" для загрузки ЦП и, возможно, L"\\Process(program_you_are_interested_in_name)\\Data Bytes/sec" для операций с диском. Поскольку я не уверен, какие именно параметры вам нужно знать о дисковых операциях, вы можете самостоятельно просмотреть список всех доступных параметров: Объект процесса

Если, например, у вас есть параллельная программа с именем a_program_name.exe, вы можете обнаружить, что ее загрузка ЦП измеряет как минимум вдвое больше счетчика производительности L"\\Process(a_program_name)\\% Processor Time". В примере это сделано в цикле. Кстати, при измерении с помощью этого теста многопоточное приложение, работающее на многоядерном процессоре, может дать загрузку процессора, которая составляет более 100%.

#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <pdh.h>
#include <pdhmsg.h>
#include <string.h>
#include <string>
#include <iostream>

// Put name of your process here!!!!
CONST PWSTR COUNTER_PATH    = L"\\Process(a_program_name)\\% Processor Time";

void main(int argc, char *argv[]){

    PDH_HQUERY hquery;
    PDH_HCOUNTER hcountercpu;
    PDH_STATUS status;
    LPSTR pMessage;
    PDH_FMT_COUNTERVALUE countervalcpu;

    if((status=PdhOpenQuery(NULL, 0, &hquery))!=ERROR_SUCCESS){
        printf("PdhOpenQuery %lx\n", status);    
        goto END;
    }

    if((status=PdhAddCounter(hquery,COUNTER_PATH,0, &hcountercpu))!=ERROR_SUCCESS){
            printf("PdhAddCounter (cpu) %lx\n", status);    
            goto END;
    }

    /*Start outside the loop as CPU requires difference 
    between two PdhCollectQueryData s*/
    if((status=PdhCollectQueryData(hquery))!=ERROR_SUCCESS){
        printf("PdhCollectQueryData %lx\n", status);    
        goto END;
    }

    while(true){
        if((status=PdhCollectQueryData(hquery))!=ERROR_SUCCESS){
            printf("PdhCollectQueryData %lx\n", status);    
            goto END;
        }

        if((status=PdhGetFormattedCounterValue(hcountercpu, PDH_FMT_LONG | PDH_FMT_NOCAP100, 0, &countervalcpu))!=ERROR_SUCCESS){
                printf("PdhGetFormattedCounterValue(cpu) %lx\n", status);    
                goto END;
        }

        printf("cpu %3d%%\n", countervalcpu.longValue);

        Sleep(1000);

    }
END:
    ;
}

Есть еще одна вещь, которую стоит упомянуть. PdhExpandWildCardPath позволяет развернуть строку, подобную этой, L"\\Process(*)\\% Processor Time" в списке процессов, запущенных на компьютере. И тогда вы можете запросить счетчики производительности для каждого процесса.

1 голос
/ 19 марта 2010

Это возможно, поскольку Process Explorer может это сделать, но я думаю, что вам придется использовать какой-то недокументированный Windows API. PSAPI подходит немного ближе, но дает вам только информацию об использовании памяти, но не об использовании процессора или диска.

...