Контролировать использование процесса для каждого ядра ЦП

Есть ли способ запросить или вычислить использование ЦП одного процесса на каждое ядро ​​ отдельно?

Например,

Название - - - - Core1 - Core2 - Core3 - Core4
firefox.exe - 0,5% - - 0,1% - - 0,2% - - 0,3%

Я знаю программу, называемую "Process Explorer" (Марк Руссинович), которая может это сделать, но как это сделать на С#? Я посмотрел на пространство имен System.Diagnostics, но не смог найти ничего подходящего для моих требований.

Вот картина того, чего я пытаюсь достичь,

http://i.stack.imgur.com/XySpQ.png

Ответы

Ответ 1

Есть способ получить эту информацию, вам нужно будет использовать отладчик ядра. Мой подозреваемый был в том, что если Visualizer Concurrency Visualizer может получить эту информацию для создания красивых отчетов и визуализации, вы также можете получить ее из ядра Windows, которое вы используете.

Здесь вы можете увидеть документацию http://msdn.microsoft.com/en-us/library/windows/hardware/ff552961(v=vs.85).aspx.

Но более интересные вещи можно найти, изменив файл Microsoft.ConcurrencyVisualizer.dll, который можно найти в каталоге установки Visual Studio 2012. Я думаю, вы также можете напрямую использовать эту DLL в своем проекте, хотя вы не можете перераспределять ее по http://msdn.microsoft.com/en-US/vstudio/hh857605#files. Эта DLL доступна автономно здесь http://www.microsoft.com/en-us/download/details.aspx?id=41646.

Идея состоит в том, чтобы узнать, как эта DLL использует Kernel Trace, чтобы узнать, какая тема была в том, что Core и скопировать ее, чтобы получить точную статистику. Кроме того, я думаю, что ProcessExplorer действительно получает некоторую статистику, используя API-интерфейс Kernel Debugger, потому что Visual Studio конфликтует с ним, когда я запускаю инструмент Concurrency Visualizer.

Это будет весело и трудно сделать.

Ответ 3

Попробуйте ниже (нашла здесь)

    int coreCount = 0;
    foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
    {
        coreCount += int.Parse(item["NumberOfCores"].ToString());
    }

    PerformanceCounter[] pc = new PerformanceCounter[coreCount];

    for (int i = 0; i < coreCount; i++)
    {
        pc[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString());
        Console.WriteLine(pc[i].CounterName);
    }

Ответ 4

Этот вопрос привлек мое внимание, и я начал изучать его. Давным-давно я тоже имел аналогичное требование, но не смог найти ответ за то же самое.

В конечном счете мне пришлось использовать fall-back и единственный доступный для мониторинга время использования процессорного процессора в% (без какой-либо теоретически расчетной работы или исправлений сродства): Process/% Process Time.

Я увидел график - "Покажите один график для каждого процессора" (моментальный снимок) и начал исследовать "Проводник" сам с удивлением, чтобы выяснить, как ему удается показать, что вы или я (в прошлом) искали.

Ответ на ваш вопрос: "Нет, невозможно узнать об использовании основного процессора для каждого процесса", и ваше предположение о том, что отображается "Исследователь процессов", объясняется в приведенном ниже заявлении, которое я нашел в "procexp". chm "( доступно с загружаемым zip) topic > Process Explorer > System Information > Last Paragraph:

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

Надеюсь, у меня есть смысл здесь.